jueves, 28 de mayo de 2015

Comandos MySQL para la Administracion de bases de datos

Mysqladmin es una utilidad de la linea de comandos que viene incorporada con MySQL Server y es usada por los administradores de bases de datos para realizar algunas tareas basicas como por ejemplo configurar el password del super-usuario (root), cambiarlo, monitorear procesos de MySQL, refrescar privilegios, chqeuqear el estado del servidor, etc. 

En este articulo, resumimos algunos comandos para mysqladmin muy utiles, los mismos utilizados en el dia a dia por los administradores de sistemas y bases de datos. 
Para poder probar los comandos, es necesario tener instalado el servidor de MySQL. 


1 - Configurar el password de root 

Si hacemos una instalacion de MySQL, veremos que no reuqerira password para conectar, por tanto configuramos uno con el siguiente comando: 

#mysqladmin -u root password PASSWORD_ELEGIDO

2 - Cambiar el password de root 

Si necesitamos actualizar el password de root en MySQL, entonces ejecutamos el siguiente comando. 
Por ejemplo, decimos que el password antiguo es 123456 y lo queremos actualizar a xyz123. 

#mysqladmin -u root -p123456 password 'xyz123'

3 - Chequear que el servidor MySQL esta activo 

Para constatar esto, ejecutamos lo suiguiente. 

#mysqladmin -u wikiusuario -p ping

4 - Chequear que version de MySQL se esta ejecutando 

El siguiente comando muestra la version de MySQL que estamos ejecutando.

# mysqladmin -u root -p version

5 - Como conocer el estado actual del servidor 

Ejecutando este comando, nos muestra el estado actual, uptime (tiempo encendido), threads (hilos de procesos), y queries (cantidad de consultas). 

#mysqladmin -u root -ptmppassword status

6 - Chequear el estado de las variables del servidor y sus valores 

Para chequear estos datos, ejecutamos lo siguiente. 

# mysqladmin -u root -p extended-status

7 - Chequear el estado de todas las variables del servidor MySQL 

Para conocer todas las varialbes activas del servidor y sus valores, ejecutamos lo suiguiente.

# mysqladmin  -u root -p variables

8 - Ver todos los procesos que ejecuta el servidor MySQL 

El siguiente comando los muestra. 

# mysqladmin -u root -p processlist

9 - Como crear una base de datos 

Para crear una base de datos nueva, ejecutamos.

# mysqladmin -u root -p create databasename

10 - Borrar una base de datos existente 

Ejecutando el siguiente comando podra ser borrada, antes preguntara confirmación. 

# mysqladmin -u root -p drop databasename

11 - Recargar/Refrescar los privilegios MySQL 

Este comando recarga los privilegios, reabre logs entre otros. 

# mysqladmin -u root -p reload;

# mysqladmin -u root -p refresh

12 - Apagar de forma segura el servidor MySQL
Ejecutamos lo suiguiente. 

#mysqladmin -u root -p shutdown

Podemos tambien usar los suiguientes comandos. 

# /etc/init.d/mysqld stop

# /etc/init.d/mysqld start

13 - Algunos comandos útiles para refrescar datos en MySQL 

flush-hosts: Refresca toda la información del cache que hostea MySQL. 
flush-tables: Refresca todas las tablas. 
flush-threads: Refresca los hilos de ejecución. 
flush-logs: Refresca todos los logs de información. 
flush-privileges: Recarga las tablas de privilegios (lo mismo que recargar). 
flush-status: Limpia el estado de las variables. 

# mysqladmin -u root -p flush-hosts

# mysqladmin -u root -p flush-tables

# mysqladmin -u root -p flush-threads

# mysqladmin -u root -p flush-logs

# mysqladmin -u root -p flush-privileges

# mysqladmin -u root -p flush-status

14 - Matar un proceso cliente dormido 

Ejecutando lo siguiente. 

# mysqladmin -u root -p processlist

Entonces ejecutamos el siguiente comando. 

# mysqladmin -u root -p kill 5

Si se necesita matar varios procesos, entonces le pasamos los ID's separados por comas. 

# mysqladmin -u root -p kill 5,10

15 - Ejecutar varios comandos en una sola linea 

Para hacerlo, deberían verse de la siguiente manera.

# mysqladmin  -u root -p processlist status version

16 - Conectar a un servidor remoto 

Usamos el parametro -h (host) con la direccion IP. 

# mysqladmin  -h 172.16.25.126 -u root -p

17 - Ejecutar un comando en un servidor remoto 

Por ejemplo para ver el estado del mismo. 

# mysqladmin  -h 172.16.25.126 -u root -p status

18 - Iniciar/parar replica en un servidor remoto

Para iniciar o parar una replica, utilizamos los siguientes comandos. 

# mysqladmin  -u root -p start-slave

# mysqladmin  -u root -p stop-slave

19 - Guardar informacion de debug en los logs 

Información de memoria, entre otros. 

# mysqladmin  -u root -p debug

20 - Ver y conocer las opciones de uso de mysqladmin 

Informacion sobre mysqladmin, parametros extras. 

# mysqladmin --help



miércoles, 13 de mayo de 2015

Aplicación para cambiar fondo de pantalla en estaciones de trabajo

Instalación de Gbackgroundweb 


Una aplicación que sirve para realizar cambios de los fondos de pantalla en todos los equipos (clientes) de una red, antes configurando un servidor y colocando la imagen de su preferencia.

Se requiere.
- Servidor web (apache)
- Las imagnes de su preferencia
- Los clientes
- El paquete .deb de la aplicación gbackgroundweb

Configuración del Servidor apache

Se requiere.
- Servidor web (apache)
- Las imagnes de su preferencia

La configuración del servidor apache la puedes observar en este link :
- http://kimberling146.blogspot.com/2013/10/instalacion-de-un-servidor-web.html

Una vez configurado el servidor se realiza lo siguiente:

Se crea la carpeta en el servidor:
- cd /var/www
- mkdir fondos

Luego se le dan los permisos necesarios:
- chmod -R 777 fondos

Luego colocar en la carpeta fondos la imagen de su preferencia en formato .PNG

Configuración del Cliente

Se requiere.
- Los clientes
- El paquete .deb de la aplicación gbackgroundweb 

Link de Descarga del paquete:
-http://descargas.canaima.softwarelibre.gob.ve/gbackgroundweb_1.6_all.deb
-http://descargas.canaima.softwarelibre.gob.ve/gbackgroundweb_2.0-1_all.deb

Una vez descargado se procede a la instalación del .deb botón contrario del mouse -> abrir con instalador de paquetes GDebi, una vez instalado se procede a realizar la configuración de la aplicación en el cliente.

Editar el archivo /usr/share/gbackground-web/gbackground_web.glade de la siguiente forma:
Buscar la línea que dice "<property name="text" translatable="yes">http://ip_del_servidor/fondo/nombre-de-la-imagen.png</property>".
Se debe cambiar la dirección web http://ip_del_servidor/fondo/nombre-de-la-imagen.png por la dirección de su preferencia.

Una vez configurado ese archivo buscamos la aplicación y configuramos los mismos datos que colocamos en el archivo en el recuadro que dice dirección Web y luego colocar Rellenar la Pantalla en Opciones de Fondo, por ultimo darle aceptar.

http://ip_del_servidor/fondo/nombre-de-la-imagen.png


Cada vez que desee cambiar el fondo de pantalla de todos los clientes solo debe cambiar la imagen en el servidor y colocarle el mismo nombre con su respectiva extensión imagen.png


lunes, 4 de mayo de 2015

Gestionando paquetes ¿apt-get o aptitude?


APT
APT se utiliza básicamente para la instalación y desinstalación de paquetes en sistemas GNU/Linux basados en Debian desde los repositorios (sources.list). Su uso mas común es apt-get.

Los cuatro comandos más usados son: install, remove, update y upgrade. Aquí tienes una explicación detallada de todos los comandos de apt-get:

apt-get update - Descarga nuevas listas de paquetes
apt-get upgrade - Realiza una actualización
apt-get install - Instala nuevos paquetes
apt-get remove - Elimina paquetes
apt-get source - Descarga archivos fuente
apt-get build-dep - Configura las dependencias de construcción para paquetes fuente
apt-get dist-upgrade - Actualiza la distribución
apt-get dselect-upgrade - Sigue las selecciones de dselect
apt-get clean - Elimina los archivos descargados
apt-get autoclean - Elimina los archivos descargados antiguos
apt-get check - Verifica que no haya dependencias incumplidas

Apt-get trabaja muy bien identificando qué dependencias necesitan ser instaladas para que funcione un paquete determinado, pero falla miserablemente a la hora de eliminar dicho paquete.

Aptitude
Aptitude es una herramienta mejor para instalar, eliminar, actualizar, y administrar de otras formas los paquetes en tu sistema que apt. Para empezar, desde sus comienzos, aptitude ha sido capaz de resolver el problema de las dependencias huérfanas. En segundo lugar, tiene una interfaz basada en curses que supera totalmente a la de dselect. Finalmente, y no menos importante, usa una sola herramienta con muchas funciones. Veamos:

aptitude: Al ejecutarlo sin argumentos muestra una interfaz para buscar, navegar, instalar, actualizar y realizar otras tareas de administración de paquetes.
aptitude install: Instala software en tu sistema, junto con las dependencias necesarias.
aptitude remove: Elimina paquetes junto con las dependencias que queden huérfanas.
aptitude purge: Elimina paquetes y dependencias huérfanas junto con los ficheros de configuración.
aptitude search: Busca paquetes en las listas de paquetes locales de apt.
aptitude update: Actualiza las listas de paquetes locales.
aptitude upgrade: Actualiza los paquetes disponibles.
aptitude clean: Elimina los ficheros que fué necesario descargar para instalar software en tu sistema.
aptitude dist-upgrade: Actualiza paquetes, incluso si eso significa que debe desinstalar otros.
aptitude show: Muestra detalles acerca del paquete nombrado.
aptitude autoclean: Elimina los paquetes deb obsoletos.
aptitude hold: Fuerza a que un paquete permanezca en su versión actual, y no se actualice.
Pero aptitude tiene otras ventajas respecto a su predecesor, apt:

Al buscar un paquete con aptitude, los resultados aparecen ordenados alfabéticamente y justificados por columnas; también te dirá cuales están instalados en tu sistema, en lugar de darte un listado de paquetes en un formato desordenado e ilegible, como hace apt-cache.

Y eso no es todo: los paquetes que apt-get te recomendaba y sugería, aptitude los instala directamente, siempre avisándote, obviamente.

miércoles, 29 de abril de 2015

Como actualizar de Debian Wheezy Debian Jessie


Actualización de Debian Wheezy a Debian Jessie

/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*
--------------------------Repositorios de Debian Jessie-------------------------

 # Repositorios Seguridad
 deb http://security.debian.org/ jessie/updates main contrib non-free
 deb-src http://security.debian.org/ jessie/updates main contrib non-free

 # Repositorios Debian Oficial
 deb http://ftp.debian.org/debian/ jessie main contrib non-free
 deb-src http://ftp.debian.org/debian/ jessie main contrib non-free

 # Repositorios Multimedia
 # deb http://deb-multimedia.org jessie main non-free
 # deb-src http://deb-multimedia.org jessie main non-free.
 # deb-multimedia
 # apt-get install deb-multimedia-keyring
 deb http://www.deb-multimedia.org jessie main non-free

 # Debian Mozilla Team
 # deb http://cdn.debian.net/debian unstable main deb
 # http://cdn.debian.net/debian experimental main
/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*

1.- Verificamos que versión tenemos actualmente
# lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 7.8 (wheezy)
Release: 7.8
Codename: wheezy

# cat /etc/issue
Debian GNU/Linux 7 \n \l

2.- Para bajar lo mas actualizado en APT - APTITUDE -DPKG
#apt-get install apt dpkg aptitude -V

2.- Para actualizar el sistema actual hasta que no quede nada por actualizar
#aptitude safe-upgrade 

3.- modificación de repositorios eliminamos los de Debian Wheezy y colocamos los de Debian Jessie

 # Repositorios de Debian Jessie 
 # Repositorios Seguridad
 deb http://security.debian.org/ jessie/updates main contrib non-free
 deb-src http://security.debian.org/ jessie/updates main contrib non-free

 # Repositorios Debian Oficial
 deb http://ftp.debian.org/debian/ jessie main contrib non-free
 deb-src http://ftp.debian.org/debian/ jessie main contrib non-free

 # Repositorios Multimedia
 # deb http://deb-multimedia.org jessie main non-free
 deb-src http://deb-multimedia.org jessie main non-free
 deb http://www.deb-multimedia.org jessie main non-free

 # Debian Mozilla Team
 # deb http://cdn.debian.net/debian unstable main deb
 # http://cdn.debian.net/debian experimental main

4.- Actualizamos con apt-get (en este caso, mejor usar apt-get, pero solo en este momento)
#apt-get update 

5.- aptitude update (otra vez, si)
#aptitude update

6.- Actualizar el sistema actual hasta que no quede nada por actualizar (otra vez, las veces que sea necesario hasta que no quede nada para actualizar)
#aptitude full-upgrade
#aptitude safe-upgrade

7.- Realizar la transición a la siguiente versión (esto prepara el sistema para hacer la transición a la siguiente versión, instalando y eliminando paquetes si fuera necesario)
#aptitude dist-upgrade

8.- Esto completa la transición
#aptitude full-upgrade

9.- Por ultimo se realiza las actualizaciones finales (este último, las veces que sea necesario también).
#aptitude update && aptitude safe-upgrade

10.- Verificamos que versión tenemos actualmente
# cat /etc/issue
Debian GNU/Linux jessie/sid

Luego de Instalar 


Para eliminar archivos de configuración y otros ya sin uso de los paquetes que han sido eliminados pero no purgados. Para ver qué paquetes han dejado archivos al ser desinstalados, se puede utilizar el siguiente comando:
#aptitude search '~c'

Y para purgarlos en forma definitiva:
#aptitude purge '~c'


También se debe ejecutar una nueva actualización, por si quedó algún paquete por renovar:
apt-get update && apt-get dist-upgrade -V

11.- Verificamos que versión tenemos actualmente
# lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 8.0 (jessie)
Release: 8.0
Codename: jessie

# cat /etc/issue
Debian GNU/Linux 8 \n \l

martes, 28 de abril de 2015

Instalación de agentes Zabbix en clientes Linux

Los agentes pueden ser instalados en la mayoría de sistemas operativos existentes en el marcado ("Linux, Mac, Windows, AIX, Solaris entre otros).  Después de su instalación queda a esperas de las ordenes del "Servidor Recolector Zabbix".  El agente es muy liviano y consume un mínimo de recurso del equipo donde se instale.

Los agentes envía únicamente la información que les pida el "Servidor recolector Zabbix".  

En este articulo vamos a presentar como instalar Zabbix Agent en:
  • Linux Debian Ubuntu
Instalación Agente Zabbix en Linux Debian / Ubuntu
La instalación del Agente de Zabbix para Linux Debian/Ubuntu es bastante sencillo.  Primero, le recomendamos instalar desde el instalador server, esto le asegura una buena configuración.

Debian / Ubuntu

Creamos la carpeta donde vamos a descargar el archivo y entramos en ella
mkdir zabbixagent
cd zabbixagent

Bajamos la última versión del instalador Zabbix-Server.
wget -c http://sourceforge.net/projects/zabbix/files/ZABBIX%20Latest%20Stable/2.4.5/zabbix-2.4.5.tar.gz/download

tar --gzip --extract --verbose --file zabbix-2.4.5.tar.gz

cd zabbix-2.4.5

Preparamos el instalador para activar el agente y luego compilamos
sudo ./configure --enable-agent
sudo make -j$[$(cat /proc/cpuinfo| grep -c '^processor')+1]
sudo make install

Agregamos el usuario Zabbix y el archivo de configuración del Agente
sudo adduser zabbix
sudo cp conf/zabbix_agentd.conf /usr/local/etc

Vamos a modificar algunos parámetros del archivo de configuración del Agente para que pueda comunicarse con el servidor Zabbix.

Entramos en el siquiente archivo
nano /usr/local/etc/zabbix_agentd.conf

Procedemos a cambiar:
Server=       <-----  IP del "Servidor Zabbix"
ServerActive=       <-----  IP del "Servidor Zabbix"
Hostname=        <-----  Nombre de la máquina donde esta instalando el Agente de Zabbix
ListenIP=        <-----  La IP de la máquina donde esta instalando el Agente de Zabbix

Configuramos los script necesario para que Zabbix arranque automáticamente

cp misc/init.d/debian/zabbix-agent /etc/init.d/zabbix-agent

chmod 755 /etc/init.d/zabbix-agent
chmod 755 /usr/local/sbin/zabbix_agentd
update-rc.d zabbix-agent defaults

Iniciamos Zabbix Agente

sudo /etc/init.d/zabbix-agent start

El siguiente paso es registrarlo en el "Servidor recolector Zabbix".

Finalizada la instalación de Zabbix agente para Linux / Debian

lunes, 27 de abril de 2015

Instalación y Configuración de Zabbix en Debian Wheezy


******* Instalación de Zabbix *******

Instalar debian por defecto. Y actualizarlo. La ip de nuestro equipo, debe ser fija.
#aptitude update
#aptitude upgrade

Vamos a necesitar ssh nmap mc
#aptitude install nmap ssh mc

Instalamos el paquete que contiene la información del repositorio.
# wget http://repo.zabbix.com/zabbix/2.4/debian/pool/main/z/zabbix-release/zabbix-release_2.4-1+wheezy_all.deb
# dpkg -i zabbix-release_2.4-1+wheezy_all.deb
# apt-get update

Instalar mysql
#aptitude install mysql-server

Ingresamos la contraseña deseada para MySQL. Luego nos volverá a pedir para confirmar.
**clave: ZABBIX**

Seteamos en /etc/mysql/my.conf, el encode por defecto para mysql.

/etc/mysql/my.conf

...
...
[mysqld]
...
...
character-set-server=utf8
...
...

Instalamos phpMyAdmin y apache2
aptitude install phpmyadmin apache2

Nos preguntará si queremos configurar nuestra base de datos usando dbconfig-common ... elegimos NO.

Y sobre que tipo de webserver vamos a usar, apache2.

Instalar zabbix.
aptitude install zabbix-server-mysql zabbix-frontend-php

De nuevo preguntará si queremos configurar nuestra base de datos usando dbconfig-common ... elegimos NO.

Instalamos el agente de zabbix
aptitude install zabbix-agent

Instalar la base de datos para zabbix.
En /usr/share/zabbix-server-mysql tenemos los scripts para generar la base de datos para zabbix. Es necesario ejecutar los scripts en el mismo orden que aquí describimos.

Primero, creamos la base de datos.
# mysql -u root -p
mysql> create database zabbix character set utf8 collate utf8_bin;
mysql> quit;

Ahora, procedemos a instalar la base en sí desde los scripts.
# mysql -uroot -p zabbix < ./schema.sql
# mysql -uroot -p zabbix < ./images.sql
# mysql -uroot -p zabbix < ./data.sql

Instalación y Configuración Web

Configurar el frontend de zabbix.

Debemos editar /etc/apache2/conf.d/zabbix
...
...
php_value max_execution_time 300
php_value memory_limit 128M
php_value post_max_size 16M
php_value upload_max_filesize 2M
php_value max_input_time 300
php_value date.timezone America/Caracas
...
...


A continuación, es necesario sintonizar PHP intérprete y ajustar algunos valores con el fin de ejecutar Zabbix Server. Así, Apache abierto php.ini archivo de configuración para la edición emitiendo el siguiente comando:

#nano /etc/php5/apache2/php.ini

Ahora, se debe buscar los siguientes parametros y colocar los siguientes valores de PHP como sigue:

 post_max_size = 16M
 max_execution_time = 300
 max_input_time = 300
 date.timezone = America/Caracas  
 always_populate_raw_post_data = -1

Luego editamos el fichero de configuración del servidor Zabbix para declarar los parámetros de conexión a la base de datos MySQL. Para ello como root ejecutamos los siguientes comandos:

/etc/zabbix/zabbix_server.conf

DBHost=localhost

DBName=zabbix
DBUser=root
DBPassword=nuestro-pass-para-mysql

Reiniciamos apache
# service apache2 restart


Navega con tu navegador si la instalación es local asi: http: // localhost / zabbix o http: // Dirección IP / zabbix o http: // Nombres de Dominio / zabbix y volverá a dirigir a http: //localhost/zabbix/setup.php 


Nota: Si no se muestra nada en el navegador debe realizar los siguientes pasos:
El directorio se debe copiar a:
mkdir /var/www/zabbix
cd /tmp/zabbix-2.0.6/frontends/php/

cp -a . /var/www/zabbix/

Nota: En caso de no tener la carpeta en /tmp puede descargarla en colocando el siguiente comando en el terminal 
wget http://repo.zabbix.com/zabbix/2.4/debian/pool/main/z/zabbix/zabbix_2.4.0.orig.tar.gz

Una vez que se descargue se debe descomprimir y copiar a /var/www/zabbix
tar xfz zabbix_2.4.0.orig.tar.gz
cd zabbix-2.4.0
cp -R frontends/php/* /var/www/zabbix

Reiniciamos apache
# service apache2 restart

y se vuelve a realizar la busqueda en el navegador.

Pantalla 1: Pantalla de Bienvenida , damos click en aceptar.



Pantalla 2: Pantalla para chequeo de requisitos, damos click en Next.



Pantalla 3: Pantalla de la configuración de la Base de Datos , se debe colocar la clave de root que se coloco
al instalar mysql, damos click en siguiente.



Pantalla 4: Pantalla de los detalles del servidor , opcional: colocar el nombre del servidor, damos click en siguiente.



Pantalla 5: Pantalla del resumen de la instalación, damos click en siguiente.



Pantalla 6: Pantalla de fin de la instalación satisfactoriamente. 



Luego editamos el siguiente archivo /etc/zabbix/zabbix_server.conf y colocamos lo siguiente en cada linea
DBHost=localhost
DBName=zabbix
DBUser=root
DBPassword=nuestro-pass-para-mysql

Reiniciamos el server zabbix y recargamos el frontend
#/etc/init.d/zabbix-server restart
[ ok ] Stopping Zabbix server: zabbix_server.
[ ok ] Starting Zabbix server: zabbix_server.



Como instalamos Zabbix si tenemos el proyecto en una maquina virtual de un contenedor


Una vez que terminamos la instalación en una maquina virtual debemos configurar en la maquina virtual y en el 
contenedor el servicio Web para eso debemos seguir los siguientes pasos...


Paquetes que se necesitan en la maquina virtual
***Estos paquetes ya fueron instalados***
apache2

Instalación de apache en la maquina virtual
aptitude install apache2

Configuración de los sites-available
nano /etc/apache2/sites-available/monitoreo.canaima.net.conf

y colocamos el siguiente codigo y guardamos la configuración
<VirtualHost *:80>
    ServerAdmin plataforma@gmail.com
    DocumentRoot "/usr/share/zabbix"
    ServerName monitoreo.canaima.net
    ErrorLog "${APACHE_LOG_DIR}/localhost_sitio1-error_log"
    CustomLog "${APACHE_LOG_DIR}/localhost_sitio1-access_log" common
    <Directory "/usr/share/zabbix>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>
 Leyenda: 
DocumentRoot "/usr/share/zabbix" --->> Ruta donde por defecto se instala zabbix
ServerName monitoreo.canaima.net --->> Nombre del Servidor
<Directory "/usr/share/zabbix>        --->> Ruta donde por defecto se instala zabbix

Activamos el sitio
a2ensite monitoreo.canaima.net.conf

Una vez se han guardado esos cambios, habrá que ejecutar un comando que es el enlace simbólico de la siguiente manera:
#ln -s /etc/apache2/sites-available/monitoreo.canaima.net.conf /etc/apache2/sites-enabled/monitoreo.canaima.net.conf

Por ultimo hay que reiniciar el servidor Apache para que tome las nuevas configuraciones:
#/etc/init.d/apache2 restart


Paquetes que se necesitan en el contenedor 
nginx

Instalación de nginx
aptitude install nginx

Configuración de los sites-available
nano /etc/nginx/sites-available/zabbix

y colocamos el siguiente codigo y guardamos la configuración
server {
  listen  80;
  server_name monitoreo.canaima.net;

   access_log  /var/log/nginx/zabbix-net.access.log; 
  error_log   /var/log/nginx/zabbix-net.error.log;  

   location / {
      proxy_pass       http://192.168.1.101;        
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }


   error_page   500 502 503 504  /50x.html;
  location = /50x.html {
          root   /var/www/nginx-default;
  }
 }
Leyenda:
server_name monitoreo.canaima.net; --->> Nombre del Servidor
access_log  /var/log/nginx/zabbix-net.access.log; -->> Nombre y ruta de log de acceso
error_log   /var/log/nginx/zabbix-net.error.log;        -->> Nombre y ruta de log de errores
proxy_pass       http://192.168.1.101;                         -->> Ip de la MV del proyecto zabbix

Una vez se han guardado esos cambios, habrá que ejecutar un comando que es el enlace simbólico de la siguiente manera:
#ln -s /etc/nginx/sites-available/zabbix /etc/nginx/sites-enabled/zabbix

Por ultimo hay que reiniciar el servidor nginx para que tome las nuevas configuraciones:
#etc/init.d/nginx restart


Como acceder desde una red externa (CLIENTE) a ese proyecto.

Entras en /etc/hosts de tu equipo (CLIENTE) y colocas la ip publica del servidor o contenedor donde se encuentra la maquina virtual el proyecto y el dominio 

10.16.106.122   monitoreo.canaima.net



y listo ya desde un equipo externo podras entrar colocando http://monitoreo.canaima.net/

viernes, 17 de abril de 2015

Control de Acceso con Squid

Documentación sobre control de Acceso con Squid

El filtrado de accesos es un tema que genera polémica en cuanto algunos lo pueden interpretar como una restricción o censura mientras que otros lo consideran como una protección. Esta no es la discusión que nos ocupa, aquí sólo pretendo dar una visión técnica sobre como establecer filtros de contenidos con la esperanza de que se haga buen uso de ella.

El filtrado de accesos es también una herramienta para mantener la seguridad y privacidad de los usuarios de nuestra red en tanto que podremos protegerlos de ciertos programas de spyware, popup y otras prácticas molestas de la web.

Para controlar los accesos primero, tenemos que saber definir las propiedades de las conexiones sobre las que queremos establecer algún tipo de control. Las acl de Squid permiten especificar acl según muy diversos criterios, por ejemplo:
  1. Una dirección de red
  2. Una dirección de máquina
  3. Un rango de direcciones
  4. Una url de una conexión
  5. Una franja horaria
Concepto de ACL en Squid


Un ACL es una definición de control de acceso, que en Squid se especifica mediante el parámetro acl según la siguiente sintaxis:

acl nombre_acl tipo_acl descripción ...

acl nombre_acl tipo_acl "fichero_de_descripciones" ...

Cuando usamos un "fichero_de_descripciones", cada descripción se corresponde con una línea del fichero.

Tipos de ACL


1.-src
Especifica una dirección origen de una conexión en formatio IP/máscara.

Por ejemplo, utilizaremos una acl de tipo src para especificar la red local:

acl red_local src 192.168.1.0/24

También podemos especificar rangos de direcciones mediante una acl de tipo src:

acl jefes src 192.168.1.10-192.168.1.25/32

2.-dst
Especifica una dirección destino de una conexión en formatio IP/máscara.

acl google_es dst 216.239.0.0/24

También podemos especificar hosts concretos mediante una acl de tipo dst:

acl google_es2 dst 216.239.59.104/32 216.239.39.104/32 216.239.57.104/32

Las definiciones son idénticas a las acl de tipo src salvo que se aplican al destino de las conexiones, no al origen.

3.-srcdomain y dstdomain

Estos tipos de acl especifican un nombre de dominio.

En el caso de srcdomain es el dominio origen y se determina por resolución DNS inversa de la IP de la máquina, es decir, tendremos que tener bien configurado el DNS de la red local.

En el caso de dstdomain el nombre del dominio se comprueba con el dominio que se haya especificado en la petición de página web.

Por ejemplo:

acl google_com dstdomain google.com

4.-srcdom_regex y dstdom_regex

Especifican una expresión regular que verifican los dominio origen o destino. La expresión regular hace distinción entre mayúsculas y minúsculas salvo que incluyamos la oción "-i" que evita dicha distinción.

Por ejemplo

acl google_todos dstdom_regex -i google\..*

Observamos como al incluir "-i" estamos indicando que no haga distinción entre mayúsculas y minúsculas.

5.-time
Este tipo de acl permite especificar una franja horaria concreta dentro de una semana. La sintaxis es la siguientes

acl nombre_acl_horaria time [dias-abrev] [h1:m1-h2:m2]

Donde la abreviatura del día es:

S - Sunday (domingo)

M - Monday (lunes)

T - Tuesday (martes)

W - Wednesday (miércoles)

H - Thursday (jueves)

F - Friday (viernes)

A - Saturday (sábado)

además la primera hora especificada debe ser menor que la segunda, es decir h1:m1 tiene que ser menor que h2:m2

Por ejemplo

acl horario_laboral time M T W H F 8:00-15:00

Estarímos especificando un horario de 8 a 15 y de lunes a viernes.

6.-url_regex
Permite especificar expresiones regulares para comprobar una url completa, desde el http:// inicial.

Por ejemplo, vamos a establecer una acl que se verifique con todos los servidores cuyo nombre sea adserver:

url_regex serv_publicidad ^http://adserver.*

En otro ejemplo podemos ver una acl que verifique las peticiones de ficheros mp3:

url_regex ficheros_mp3 -i mp3$

Nota: ver expresiones regulares

7.-referer_regex
Define una acl que se comprueba con el enlace que se ha pulsado para acceder a una determinada página. Cada petición de una página web incluye la dirección donde se ha pulsado para acceder. Si escribimos la dirección en el navegador entonces estaremos haciendo una petición directa.

Por ejemplo vamos a establecer uan acl para todas las páginas a las que hayamos accedido pulsando en una ventana de búsqueda de google:

acl pincha_google referer_regex http://wwww.google.*

8.-req_mime
Las acl de tipo req_mime se utilizan para comprobar el tipo de petición mime que realiza un cliente, y se puede utilzar para detectar ciertas descargas de ficheros o ciertas peticiones en túneles HTTP.

Esta acl sólo comprueba las peticiones que realiza el cliente, no comprueba la respuesta del servidor. Esto es importante para tener claro qué estamos haciendo y qué no.

Por ejemplo

acl subida req_mime_type -i ^multipart/form-data$

acl javascript req_mime_type -i ^application/x-javascript$

acl estilos req_mime_type -i ^text/css$

acl audiompeg req_mime_type -i ^audio/mpeg$

9.-rep_mime_type
Este tipo de acl se utiliza para verificar el tipo de respuesta recibida por el proxy. Este tipo de acl, analiza una respuesta del servidor por lo que sólo le afectas las reglas de respuesta como http_reply_access y no las reglas http_access que se aplican a las peticiones.

Por ejemplo

acl javascript rep_mime_type -i ^application/x-javascript$

acl ejecutables rep_mime_type -i ^application/octet-stream$

acl audiompeg rep_mime_type -i ^audio/mpeg$

Ejemplos de ACL

1.-acl todos

Una acl que verifica todos los equipos de la red. Puede parecer un poco tonta, pero se va a utilizar posteriormente para establecer una politica preestablecida para denegarlo o aceptarlo todo.

acl todos src 0.0.0.0/0.0.0.0

2.-acl localhost

Nuestra propia maquina como origen de conexiones

acl localhost src 127.0.0.1/255.255.255.255

Nuestra propia máquina como destino de las conexiones

acl localhost_destino dst 127.0.0.0/8

3.-http_access

Este es el parámetro que permite o deniega accesos a una o más acl.

La sintaxis de uso es:

http_access allow|deny [!]acl ...

Observamos como cada acl puede ir precedida por un signo "!" que indicaría que la acl no se verifica.

Por ejemplo, para permitir acceso fuera del horario laboral, según una acl que definimos anteriormente:

http_access allow ! horario_laboral

Para denegar el acceso en horario laboral

http_access deny horario_laboral

Para dar acceso completo a la red local

http_access allow red_local

4.-Características de http_access
Si no hay ninguna línea de acceso la acción predeterminada es denegar la petición.

Si una petición no ha verificado ninguna línea de acceso, la ación que se realiza es la opuesta a la última línea de la lista. Si la última línea deniega entonces el valor predeterminado es permitir. Por este motivo es conveniente incluir una línea "deny all" o "allow all" al final de las listas de accesos para tener las cosas claras.

Es importante la forma en la cual añadimos los distinto parámetros http_access para determinar la forma en la que se comprueba. En primer lugar, todas las acl incluidas en en una cláusula http_access se comprueban y todas ellas tendrán que verificarse conjuntamente, es decir, como si estuvieran unidas por un operador AND. Después, los sucesivos parámetros http_access se evalúan individualmente, es decir, como si estuvieran unidos mediante un operador OR.

Por ejemplo

acl red1 src 192.168.0.0/24

acl red2 src 192.168.1.0/24

http_access allow red1 red2

permitiría el acceso a todas aquellas conexiones que procedieran a la vez de red1 y de red2, que probablemente no es lo que pretendemos. Para permitir acceso a las dos redes podríamos:

acl red1 src 192.168.0.0/24

acl red2 src 192.168.1.0/24

http_access allow red1

http_access allow red2

o también, de forma más simple:

acl redes src 192.168.0.0/24 192.168.1.0/24

http_access allow redes

5.-Ejemplos de Acl y http_access
Denegar las peticiones de ficheros de tipo exe, pif, bat y cmd

acl tipoexe url_regex -i exe$ pif$ bat$ cmd$

http_access deny tipoexe

Denegar el acceso a todos los servidores cuyo nombre comience por "popup", "banner" o "ads"

acl incordios url_regex http://popup.* http://ads.* http://ads.*

http_access deny incordios

Denegar todos los ficheros de tipo exe que provengan de virus_fijo.com

acl anti_exe url_regex -i exe$

acl vfijo dstdomain virus_fijo.com

http_access deny anti_exe vfijo

Denegar las conexiones a las url completas o incompletas que hay en el fichero "/etc/squid/lista_negra_1.txt"

acl ln1 url_regex "/etc/squid/lista_negra_1.txt"

http_access deny ln1

Proteger el ancho de banda
Cada usuario tiene tendencia a utilizar el 100% del ancho de banda disponible, no sé si esto es una ley escrita, si no debería estarlo.
Pues ahora que tenemos instalada la red y el acceso mediante proxy cache vamos a intentar regular el consumo de ancho de banda. Resulta interesante que nadie pueda cometer abusos y consumir todos los recursos de la red a costa del resto de usuarios. La regulación del ancho de banda se puede llevar a cabo utilizando distintos criterios: la máquina origen, la dirección o página destino o el tipo de transferencia.
Por un lado podemos intentar discriminar el origen de los datos, resumiendo que los jefe dispongan de mejor conexión que los "pringaos". Resumiendo, vamos a asignar distintos anchos de banda a distintos rangos de direcciones IP.
También se no puede dar el caso de que haya consultas masivas a unos determinados dominios o páginas y puede ser práctico delimitar el ancho de banda asignado a ese dominio.
En general el volumen de tráfico que genera el acceso a páginas web en html es bastante bajo, lo que realmente consume un volumen apreciable del ancho de banda son ficheros de sonido e imagen y una medida posible podría ser limitar de alguna forma la transferencia de estos tipos de ficheros.
Otra posibilidad sería que limitar el ancho de banda sólo para descargas de ficheros grandes y dejar un mayor ancho de banda a ficheros pequeños para que la navegación por páginas html sea más rápida.
Mediante Squid podemos establecer límites al ancho de banda mediante una de sus características de configuración denominada "delay pools". Establecemos una definición de regulación de ancho de banda, establecemos una ACL y asociamos la regulación a la ACL.

Parámetros de configuración
Cada una de las reglas de regulación está definida por un número entero que vamos a utilizar para indentificarlo en los distintos parámetros.
delay_pools

Esta parámetro se utiliza para definir cuantas reglas de regulación vamos a definir.
delay_class

Este parámetro toma dos argumentos el primero el identificador de la regla y en segundo lugar el tipo (clase) de la regla.
El primero argumento es un número entero para identificar la regla.
El segundo argumento puede ser 1,2 ó 3 para indicar uno de estos tipos de reglas.
delay_parameters

establece los valores de la regla. Los argumentos de este parámetro son parejas de valores velocidad/tamaño, donde velociad es un número entero que indica una velocidad en bytes por segundo (B/s), y tamaño indica el número de bytes de reserva que se transmiten antes de aplicar la velocidad de transferencia.
Es decir cada pareja especifica el número de bytes de margen que se permiten antes de se haga efectiva la restricción de velocidad.
Los valores no tienen por qué ser múltiplos de 2.

Tipos de reglas
Hay tres clases de regulaciones, con características diferentes.

Clase 1
La clase uno consiste en un canal individual compartido por todos los usuarios. Es la clase más simple, todas las tasas de descarga van juntas y lo único que tenemos que especificar es la velocidad, en bytes por segundo, y el número de bytes a partir de los cuales tiene que retardar la descarga.
Ejemplo: Supongamos que queremos que la velocidad de descarga de los ficheros .wmv que ocupen más de 1Mb sea de 8k/s.
delay_pools 1
delay_class 1 1
delay_parameters 1 8192/1048576
acl ficheros_wmv url_regex \.wmv$
delay_access 1 allow ficheros_wmv

Cuando en esa red, algún equipo haya bajado más de 1Mb correspondiente a ficheros .wmv entonces la descarga total de ficheros .wmv se hará a una velocidad de 8k/s. Si quisiéramos establecer este límite para los hosts de una red deberíamos elegir la clase 2.
En el anterior ejemplo hemos supuesto que hay un único canal de regulación en el parámetro delay_pools. Ahora vamos a ver un ejemplo con dos canales de clase 1. Queremos que el tráfico de la red local no tenga límite de transferencia, mientras que para las conexiones a internet vamos a utilizar un total de 256Kbits/s.
delay_pools 2
delay_class 1 1
delay_parameters 1 -1/-1
acl red_local src 192.168.0.0/24
delay_access 1 allow red_local
delay_class 2 1
delay_parameters 2 32768/1024
acl resto all src 0.0.0.0/0.0.0.0
delay_access 2 allow resto
La tasa de transferencia viene especificada en bytes por segundo, por ejemplo convirtiendo a otras unidades uno de los parámetros de delay_parameters:
32768 B/s = 32 KB/s = 32 x 8 Kb/s (bits) = 256 Kb/s = 256 Kbits/s
El valor 1024 es un número de bytes lo suficientemente pequeño para que se alcance pronto y se estabilice el ancho de banda.
El valor -1 indica ilimitado.
Las regulaciones de clase 1 están diseñadas para evitar que la acl correspondiente consuma todo el ancho de banda, es decir definen la suma máxima de los anchos de banda de todos los clientes, pero no evita que un cliente pueda consumir ese ancho de banda a costa de otro; todos os clientes comparten un máximo ancho de banda.
Clase 2
La clase dos que consiste en un canal común con 256 canales individuales. Es decir tenemos un canal global y dentro de él otros 256 canales que se aplican a las máquinas de una red de clase C.
Ahora vamos a ver otro ejemplo con dos canales, en este caso ambos de de clase 2. Ahora también que el tráfico de la red local no tenga límite de transferencia, ni global ni por IP, mientras que para las conexiones a internet vamos a utilizar un total de 256Kbits/s y a cada máquina de la red le asigna un máximo de 64kbits/s.
delay_pools 2
delay_class 1 2
delay_parameters 1 -1/-1 -1/-1
acl red_local src 192.168.0.0/24
delay_access 1 allow red_local
delay_class 2 2
delay_parameters 2 32768/1024 8192/1024
acl resto all src 0.0.0.0/0.0.0.0
delay_access 2 allow resto
Este ejemplo es muy parecido al anterior de clase 1, sólo tenemos que agregarle una pareja de valores al parámetro "delay_parameters". La primera pareja de este parámetro especifica el ancho de banda global, mientras que la segunda pareja especifica el ancho de banda por host.
Hay que tener en cuenta que los clientes están limitados por el tamaño del canal más pequeño, por lo que no tiene sentido que el canal común tenga un tamaño menor que los canales individuales.
Clase 3
La clase tres que define un canal común que contiene 256 canales de red, 65536 canales individuales. Muy parecida a la clase dos pero par redes de clase B.
Hay que tener en cuenta que los clientes están limitados por el tamaño del canal más pequeño, por lo que no tiene sentido que el canal común tenga un tamaño menor que los canales individuales.
Ejemplos de control de ancho de banda
Limitación global del ancho de banda
Tenemos una conexión con internet de 4Mbits y queremos que el ancho de banda dedicado a consulta de páginas web desede las IP comprendidas entre 192.168.5.100 hasta 192.168.5.199 sea de 1Mbits máximo.
1Mb/s = 128kB/s = 131072 B/s
4Mb/s = 512kB/s = 524288 B/s
delay_pools 1
delay_class 1 1
delay_parameters 1 131072/8192
acl lista src 192.168.5.100-192.168.5.199/32
delay_access 1 allow lista

Limitación de ancho de banda por red y host
Tenemos una conexión con internet de 4Mbits y queremos que el ancho de banda dedicado a consulta de páginas web desede las IP comprendidas entre 192.168.5.100 hasta 192.168.5.199 sea de 1Mbits máximo, de forma que cada una de las máquinas no pueda consumir más de 512Kbits/s.
Es como el ejemplo anterior, pero añadiendo restricciones adicionales a cada una de las máquinas, por lo que tendremos que elegir la clase 2:
delay_pools 1
delay_class 1 2
delay_parameters 1 131072/8192 65536/8192
acl lista src 192.168.5.100-192.168.5.199/32
delay_access 1 allow lista

Limitación de ancho de banda por servidor
Queremos limitar el ancho de banda a 4KB/s y que cada máquina consuma a lo sumo 2KB/s para todas las conexiones que se hagan a los servidores de banner cuyo nombre empieza por ad.
delay_pools 1
delay_class 1 2
delay_parameters 1 4096/4096 2048/2048
acl publicidad url_regex http://ad.*
delay_access 1 allow publicidad

Ancho de banda ilimitado para la red local
Garantizar un ancho de banda ilimitado para los accesos a la red local
delay_pools 1
delay_class 1 2
delay_parameters 1 -1/-1 -1/-1
acl redlocal url_regex -i 192.168
delay_access 1 allow redlocal
Establecer privilegios de acceso
Establecer privilegios en la red
delay_pools 3
delay_class 1 1
delay_class 2 1
delay_class 3 1
delay_parameters 1 -1/-1
delay_parameters 2 131072/8192
delay_parameters 3 65536/8192
acl jefes src 192.168.5.1-192.168.5.50/32
acl subjefes src 192.168.5.51-192.168.5.99/32
acl resto src 0/0
delay_access 1 allow jefes
delay_access 2 allow subjefes
delay_access 3 allow resto

Ancho de banda en horarios distintos
Limitar el ancho de banda en una franja de horario
acl todos src 0/0
acl laboral time 08:30-16:30
delay_pools 2
delay_class 1 2
delay_parameters 1 -1/-1 -1/-1
delay_access 1 allow todos
delay_class 2 2
delay_parameters 2 131072/8192 65536/8192
delay_access 2 allow laboral
delay_access 2 deny !laboral
delay_access 2 allow todos

Configuración de los navagadores clientes
Esta configuración exige que cada navegador esté configurado para utilizar el proxy. Pero claro, por una lado es un engorro tener que configurar uno a uno todos los equipos de la red y por otro, tenemos la posibilidad de que la configuración TCP/IP le da salida a través de una pasarela.
Si a pesar de todo queremos esta configuración, tendremos que decirle al navegador que utilice como proxy el equipo que alberga Squid y el puerto el 3128. El puerto se puede cambiar en el fichero de configuración. Otro puerto que se suele usar para proxy es el 8080, pero ¿para qué cambiarlo?

Proxy Transparente
Como queremos evitar tener que configurar los navegadores cliente y queremos evitar posibles puertas traseras de salida vamos a configurar un proxy transparente.

¿Qué es un proxy transparente? 
Es un proxy que no necesita ninguna configuración especial en los clientes. Se denomina transparente porque el cliente en realidad no sabe que lo está usando, es transparente para él.
Cómo configurar el proxy transparente, pues en primer lugar tenemos que configurar el cortafuegos para que reenvíe todas las peticiones que se hagan a un puerto 80 hacia el puerto 3128 que utiliza Squid. Es decir, capturamos todas las peticiones que se hagan a un servidor http y se las enviamos a Squid para que él se encarge del resto.
Estas son las reglas de iptables. La primera para redrigir las peticiones al proxy la siguiente para rechazar el resto de los reenvíos.

Si queremos que las páginas web pasen por el proxy con squid que está en 192.168.5.254, pero el resto siga con acceso normal, pondríamos:
iptables -t nat -A PREROUTING -i eth1 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.5.254:3128

Si el equipo con squid está en la misma pasarela entonces podemos poner:
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 3128

Cuidado, de las opciones anteriores sólo debemos escoger una de ellas.
Si sólo queremos salida para visitar págias web, entonces pondremos:
Primero garantizamos el tráfico DNS:
iptables -A FORWARD -p tcp -m tcp --dport 53 -j ACCEPT
optables -A FORWARD -p udp -m udp --dport 53 -j ACCEPT
iptables -A FORWARD -p tcp -m tcp --sport 53 -j ACCEPT
iptables -A FORWARD -p udp -m udp --sport 53 -j ACCEPT

En el siguiente caso suponemos que el equipo con squid está en 192.168.5.254:
iptables -A PREROUTING -i eth1 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.5.254:3128
iptables -t nat -A FORWARD -j REJECT --reject-with icmp-port-unreachable

Si el equipo con squid está en la misma pasarela entonces podemos poner:
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 3128

iptables -A FORWARD -j REJECT --reject-with icmp-port-unreachable