Levantar red en inicio del sistema CentOS

Hoy Susi me preguntó por qué una máquina virtual con CentOS no levantaba automáticamente la red como el resto, máquinas Ubuntu. Lo cierto es que a mi esto mismo también me pasó en alguna instalación de CentOS sobre VirtualBox. No se por qué, pero durante la instalación el sistema decide que es mejor que el interfaz de red no se levante cuando la máquina arranca. Pero puesto que trabajando con máquinas virtuales para ofrecer servicios tener levantada la red es algo esencial, vamos a ver qué hacer para que el interfaz de red se levante cuando la máquina arranca.
CentOS tiene la configuración de las tarjetas de red por defecto bajo /etc/sysconfig/network-scripts y ahí, en un fichero de configuración ifcfg-iface, donde iface es el nombre dela tarjeta de red, por eejmplo eth0. Cuando instalas el sistema, si este detecta una tarjeta y se configuró, crea un fichero ifcfg-eth0, por ejemplo, con el siguiente contenido.
DEVICE="eth0"
BOOTPROTO="dhcp"
HWADDR="XX:XX:XX:XX:XX:XX"
NM_CONTROLLED="yes"
ONBOOT="no"
TYPE="Ethernet"
UUID="465985d0-ab5b-..."
El problema de que tras el reinicio del sistema el equipo no levante el interfaz de red radica en este fichero y concretamente en la variable
...
ONBOOT="no"
...
que como podemos observar indica que el interfaz no se levante por defecto en el arranque del sistema. Para solucionarlo, simplemente cambiamos el valor de la variable a yes,
...
ONBOOT="yes"
...
Y en el próximo reinicio ya no deberíamos de tener problemas.
Puesto que me parece algo interesante, mejor compartirlo con todos, pues no creo que nos pase únicamente a nosotros.
Leer más

slapd bdb_equality_candidates not indexed

Tras la instalación de un PCD y ponerlo en funcionamiento, el servidor LDAP comenzó a enviar a syslog una gran cantidad de warnings que indicaban que algo se estaba haciendo mal. Los mensajes era como estos, pero el problema no era tener una línea cada cierto tiempo, sino que cada 10 minutos estábamos teniendo unas 50 líneas aproximadas, más otras pocas que rsyslog omitía. En el mensaje, como veis está indicado el problema, y es que un campo que se considera importante no tiene un índice creado.
...
slapd[1354]: <= bdb_equality_candidates: (displayName) not indexed
slapd[1354]: <= bdb_equality_candidates: (cn) not indexed
slapd[1354]: <= bdb_equality_candidates: (displayName) not indexed
slapd[1354]: <= bdb_equality_candidates: (cn) not indexed
...
Para solucionarlo tocó hacer lo que justamente el error indicaba, indexar esos campos. Así que para ello, seguimos los siguientes pasos.
  • Parar LDAP
    shell> service slapd stop
    
  • Crear los nuevos índices
    Para hacer esto debemos editar el fichero /etc/ldap/slapd.d/cn\=config/olcDatabase\=\{1\}hdb.ldif y después de la línea "olcDbIndex: objectClass eq" añadir los índices que nos interesen.
    ...
    olcDbIndex: objectClass eq
    olcDbIndex: displayName eq
    olcDbIndex: cn eq
    ...
    
  • Reindexar la base de datos
    shell> slapindex -F /etc/ldap/slapd.d/
    
    Ojo aquí! Si este último comando lo ejecutáis como root, os saltará una advertencia de que los ficheros creados no tendrán permisos, ya que están ejecutados como root. Así que hay que establecer los permisos correctos.
  • Establecer los permisos correctos
    shell> chown -R openldap:openldap /var/lib/ldap/
    
  • Arrancar LDAP
    shell> service slapd start
    
El proceso de hacer estos cambios es aproximadamente de 3 minutos y dejaremos sin dudarlo la base de datos LDAP mejor indexada y, sobre todo, evitaremos los molestos warnings.
Leer más

Seguridad ante todo

En el mundo de la seguridad informática, tomarse los problemas con una sonrisa es una buena filosofía. Os dejo aquí la viñeta de Linux Hispano que ilustra esto perfectamente. Además, que hoy es viernes!
La solución más sencilla a heartbleed
Leer más

FaxGetty RECV REJECT page quality

Si alguna vez trabajando con HylaFax os sale este tipo de error en varios faxes y por lo tanto los rechaza, no asustarse. Tiene solución.
shell> grep REJECT /var/log/syslog 
...
... FaxGetty[2541]: RECV: REJECT page quality, 80% good lines (95% required)
...
El problema es que HylaFax se actualizó y ahora tiene soporte para filtrar aquellos faxes que no tengan una calidad aceptable en la recepción.
Puesto que estamos hablando de recepción de faxes, se asume ya una pérdida de calidad, por norma general, así que HylaFax va a filtrar aquellos faxes que tengan una calidad aceptable, que por defecto es del 95%. Si por motivo de tu línea o del modem que estés empleando esto falla y la calidad es menor, puedes reajustar estos parámetros en el fichero de configuración de tu modem.
Los parámetros que son ajustable y que están relacionados con la calidad de la recepción son:
  • PercentGoodLines
    Establece el mínimo porcentaje de líneas correctas que debe tener el fax recibido para que éste se considere de calidad y de el OK en la recepción.
    Por defecto está establecido a 95%.
    Si se establece a 0, no se chequea la calidad del fax recibido.
  • MaxConsecutiveBadLines
    Determina el número máximo de líneas consecutivas que se pueden recibir con error antes de dar la recepción por fallida y descartar el fax. Al igual que en el parámetro anterior, si se establece a 0 no se chequea.
    Por defecto, el valor máximo de líneas es 5.
shell> cat /var/spool/hylafax/etc/config.ttym0
...
MaxConsecutiveBadLines: 6   # default is 5
PercentGoodLines:       51  # default is 95%
...
En la página oficial tienes más información acerca de estos y otros parámetros. 
Leer más

Instalación de salt-minion en Debian Squeeze

Desde la reciente noticia de que Debian squeeze (old-stable) va a ser la primera Debian LTS, cobra más sentido tener presente la instalación de SaltStack bajo este sistema para unirlas al resto de máquinas que ya tenían soporte.
Con antelación, ya expliqué cómo instalar Salt sobre Debian Wheezy, sin embargo, este tipo de instalación no sirve para la antigua versión estable de Debian. Si sigues la chuleta descrita, tras crear el fichero /etc/apt/sources.list.d/salt.list con el contenido de squeeze correspondiente, quedando tal que así,
deb http://debian.saltstack.com/debian squeeze-saltstack main
Al intentar instalar el paquete salt-minion, el resultado no es precisamente el deseado.
shell> apt-get install salt-minion
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias       
Leyendo la información de estado... Hecho
No se pudieron instalar algunos paquetes. Esto puede significar que
usted pidió una situación imposible o, si está usando la distribución
inestable, que algunos paquetes necesarios no han sido creados o han
sido movidos fuera de Incoming.
La siguiente información puede ayudar a resolver la situación:

Los siguientes paquetes tienen dependencias incumplidas:
 salt-minion : Depende: msgpack-python pero no es instalable
               Depende: python-zmq (>= 13.1.0) pero no va a instalarse
E: Paquetes rotos
Por lo tanto, para poder instalar salt bajo Debian squeeze, debemos de añadir la siguiente línea al fichero salt.list.
deb http://backports.debian.org/debian-backports squeeze-backports main contrib
Sí, efectivamente, acabamos de añadir soporte, si es que no lo teníamos ya, a los repositorios backports de Debian. Ahora ya podemos instalar sin problema alguno salt-minion en Debian squeeze.
shell> wget -q -O- "http://debian.saltstack.com/debian-salt-team-joehealy.gpg.key" | apt-key add -
shell> apt-get update
shell> apt-get install salt-minion

Más información:
Leer más

Filtrar países con IPTables

Una de las cosas que más nos llama la atención a los administradores de sistemas, especialmente si tenéis acceso a equipos de Firewall es siempre la cantidad de ataques que se están recibiendo. Es cierto que la red no es un lugar cómodo ni pacífico. A los 5 minutos de conectar un equipo a una IP pública, éste ya comienza a recibir ataques. Nos guste o no, tenga lógica o no, la mayoría de los ataques a los equipos provienen de determinados países, llamémosle conflictivos, como puedes ser China, Rusia, etc. Por suerte para nosotros, GNU/Linux tiene un sistema de Firewall modular que permite añadir pequeñas mejoras. Hoy vamos a ver cómo filtrar los paquetes de determinados países gracias a xtables_addons.
xtables_addons es un sistema modular para el kernel que permite añadir funcionalidades sin parchear éste, gracias a la creación de módulos dinámicos (dkms), lo que evita tener que compilar y reiniciar el sistema. En determinadas distribuciones (Ubuntu y derivados) está disponible ya para instalación, mientras que en otras hay que compilarlos desde las fuentes. Puesto que el funcionamiento una vez instalado es el mismo, vamos a partir de una Ubuntu desde la que podamos simplificar la instalación.
shell> apt-get install xtables-addons-dkms
La instalación de este paquete llevará un poco de tiempo, puesto que crea los módulos para la versión del kernel que tengamos instalada. Gracias a dkms, si se actualiza el kernel, los módulos se volverán a reconstruir automáticamente. Una vez instalado xtables_addons, debemos instalar el paquete que simplifica la forma de procesar los paquetes de rangos de IPs de los países. Para ello,
shell> apt-get install libtext-csv-xs-perl
Ahora ya estamos listos para comenzar a trabajar y filtrar las conexiones entrantes o salientes de IPTables a determinados países. Lo primero será descargar las bases de datos de rangos IP de cada país. Para ello,
shell> cd /tmp
shell> /usr/lib/xtables-addons/xt_geoip_dl
Esto nos descargará dos ficheros, GeoIPv6.csv.gz y GeoIPCountryCSV.zip, que los procesará y dejará en el directorio actual un fichero más llamado GeoIPCountryWhois.csv, que es el que realmente nos va a interesar. Ahora tenemos que procesar este fichero .cvs para darle el formato adecuado y que xtables_addons e IPTables lo entiendan. Para hacer esto,
shell> mkdir -p /usr/share/xt_geoip/
shell> /usr/lib/xtables-addons/xt_geoip_build -D /usr/share/xt_geoip/ \
       GeoIPCountryWhois.csv
91027 entries total
    0 IPv6 ranges for A1 Anonymous Proxy
  102 IPv4 ranges for A1 Anonymous Proxy
    0 IPv6 ranges for A2 Satellite Provider
  425 IPv4 ranges for A2 Satellite Provider
    0 IPv6 ranges for AD Andorra
    8 IPv4 ranges for AD Andorra
    0 IPv6 ranges for AE United Arab Emirates
      ...
  485 IPv4 ranges for ZA South Africa
    0 IPv6 ranges for ZM Zambia
   43 IPv4 ranges for ZM Zambia
    0 IPv6 ranges for ZW Zimbabwe
   47 IPv4 ranges for ZW Zimbabwe
Llegados a este punto ya estamos listos para emplear el filtrado por países en IPTables. Lo único que debemos de hacer es emplear "-m geoip" y "--src-cc XX", siendo XX el código ISO del país (código ISO en Wikipedia).
Por ejemplo, para bloquear las conexiones entrantes desde IPs del rango de China (ISO CN), tendríamos que hacer algo como,
shell> iptables -A INPUT -m geoip --src-cc CN -j DROP
También se puede emplear este truco de geoip con las opciones habituales de IPTables,
shell> iptables -A INPUT \
       -p tcp -m tcp -m multiport --dports 80,443 \
       -m geoip --src-cc CN \
       -j DROP
Tras ello, podemos ver cómo quedaría nuestro Firewall configurado,
shell> iptables -L -n -v
Chain INPUT (policy ACCEPT 1644 packets, 2796K bytes)
pkts B target prot opt in out source    destination         
0    0 DROP   all  --  *  *   0.0.0.0/0 0.0.0.0/0 -m geoip --source-country CN
0    0 DROP   tcp  --  *  *   0.0.0.0/0 0.0.0.0/0 tcp multiport dports 80,443 -m ...

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts B target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 1423 packets, 221K bytes)
pkts B target prot opt in out source destination

Leer más

MySQL: Error writing file (No space left on device)

Si trabajando con MySQL obtenéis el siguiente error,
Error writing file '/tmp/pTdf4iTz' (Errcode: 28)
Lo primero que deberíais de hacer, no antes este error, sino ante cualquier, es mirar qué significa. Para ello,
# perror 28
OS error code 28: No space left on device
Por lo que parece, todo apunta a que no hay espacio libre en el directorio temporal sobre el que trabaja MySQL. Para comprobar cual es este,
mysql> show variables like 'tmpdir';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| tmpdir        | /tmp  |
+---------------+-------+
1 row in set (0.00 sec)
Y ahora comprobamos si efectivamente hay o no espacio libre y obtenemos lo siguiente,
shell> df -hP /tmp
S.ficheros            Size  Used  Avail  Use%  Montado en
/dev/mapper/vg0-tmp   504M   93M   387M   20%        /tmp
Tenemos un 80% de espacio libre y aun así nos está fallando la query por falta de espacio.


La explicación

MySQL cuando realiza una query emplea espacio temporal y al finalizarla y devolver los datos, borra ese fichero temporal. Lo que está sucediendo es que el espacio libre, sí esos casi 400 Mb no son suficientes para manejar el fichero temporal que genera la query.

La solución

Optimizar más la query o darle un directorio temporal a MySQL con más espacio libre para que la query se pueda ejecutar correctamente.
Leer más

Manejar extensiones Libre Office desde terminal

Siempre que trabajamos con sistemas de administración centralizada como Puppet o SaltStack, tenemos que tener presente que todos los procesos que ejecutemos deben ser desde consola, que el concepto "interfaz gráfico" ya no está disponible. Esto en Linux no suele ser un problema, pero hay ciertas acciones que sí que pueden hacer que tengamos que replantearnos cómo hacerlas.
Este es el caso de las extensiones de OpenOffice/LibreOffice. La instalación de la suite ofimática en el sistema es sencilla, puesto que está en los repositorios, únicamente hay que hacer que esté presente en los sistemas. El problema está en las extensiones, que son pequeños ficheros que nos descargamos de la web y que tenemos que instalar en cada una de las máquinas. La forma de hacerlo es desde el propio interfaz, pero claro, si pensamos en hacerlo en 50 equipos, por ejemplo, la cosa ya cambia.
Por suerte, para simplificar este proceso, existe el comando unopkg, que sirve para instalar o desinstalar extensiones en el sistema, pero desde línea de comandos. Así que, tras descargar la extensión que nos haga falta desde la web oficial, es.libreoffice.org/extensiones, únicamente tendremos que ejecutar lo siguiente,
shell> unopkg add --shared pager.oxt
En caso de que la extensión a instalar ofrezca un menú con licencia para aceptar, lo más sencillo es aceptar la licencia de base y que no se muestre, sino no se podrá instalar. Para ello, habrá que hacer lo mismo, pero con la opción -s, tal que así,
shell> unopkg add -s --shared pager.oxt
Espero que os sea útil si tenéis que mantener un cierto número de suites ofimáticas, en las que a mayores del paquete Office hay que manejar extensiones.
Leer más

Facter: Ampliando sus posibilidades

Para aquellos que no lo sepan, Facter es una pequeña librería en la que se apoya Puppet, multiplataforma, y que sirve para obtener información de los sistemas. Su integración con Puppet es máxima y es gracias a ella que facilita la toma de decisiones según los equipos.
Desde la versión 1.7 de Facter, se han incluido una gran cantidad nueva de facts, lo que permite ya de base poder obtener mucha más información de los equipos. A mayores de este duro trabajo, también han creado una forma muy lógica y siguiendo el uso en Linux, de extender su funcionalidad. Desde esta nueva versión, es posible crear nuevas variables, escritas en texto, json o yaml. Según el tipo de fichero que creemos, debemos de emplear su sintaxis correcta.
Tras actualizar la versión de facter empleada, para comenzar a crear nuestras propias variables, únicamente debemos de crear la carpeta que las va a contener,
shell> mkdir /etc/facter/facts.d
Y a continuación, meter ahí todos los ficheros que deseemos para extender las funcionalidades que deseemos. Por ejemplo, según el formato,
  • .yaml
    key1: val1
    key2: val2
    key3: val3
    
  • .json
    {
       "key1": "val1",
       "key2": "val2",
       "key3": "val3"
    }
    
  • .txt
    key1=value1
    key2=value2
    key3=value3
    
Tras ello, simplemente con ejecutar facter podremos ver las nuevas variables que hemos creado.
shell> facter | grep key
Si empleáis Puppet, creo que esta nueva opción os resultará, sin duda, de bastante utilidad.

Más información:
Leer más

Metasploit: Could not find rake-10.1.0 in any of the sources

Tras un tiempo sin jugar con Metasploit, este fin de semana lo volví a arrancar puesto que durante toda esta semana, el tema de la seguridad estuvo ajetreado. Ya sabéis, OpenSSL y Heartbleed.
Tras observar un poco los últimos cambios en los módulos de Metasploit, rápidamente me di cuenta de que ya había un módulo para escanear un dominio, ip o rango de ips y saber si era o no vulnerable. Así que en vez de partir del script básico que tenía a mano, decidí tirar de Metasploit, que sirve precisamente para eso, auditoría más cómoda.
Cuando me dispuse a arrancar la consola, tras realizar un git pull, me salta el siguiente error.
shell> msfconsole 
Could not find rake-10.1.0 in any of the sources
Run `bundle install` to install missing gems.
No puedo arrancar la consola y me dice 'algo' de que está fallando la versión de rake, que no la puede encontrar. Lógicamente en la actualización de los paquetes (hice un git pull) se actualizó la versión del software que estaba empleando y en el sistema no la había actualizado. Por suerte, el mismo error dice cual es la solución.
shell> bundle install
Fetching gem metadata from https://rubygems.org/.........
Fetching gem metadata from https://rubygems.org/..
Installing rake (10.1.0) 
Installing i18n (0.6.5) 
Using multi_json (1.0.4) 
Installing activesupport (3.2.14) 
Using builder (3.0.4) 
Installing activemodel (3.2.14) 
Using arel (3.0.2) 
Using tzinfo (0.3.37) 
Installing activerecord (3.2.14) 
Installing bcrypt-ruby (3.1.2) 
Installing database_cleaner (1.1.1) 
Installing diff-lcs (1.2.4) 
Using factory_girl (4.2.0) 
Installing fivemat (1.2.1) 
Installing json (1.8.0) 
Installing pg (0.16.0) 
Installing metasploit_data_models (0.17.0) 
Installing mini_portile (0.5.1) 
Installing msgpack (0.5.5) 
Installing network_interface (0.0.1) 
Installing nokogiri (1.6.0) 
Installing packetfu (1.1.9) 
Using pcaprub (0.11.3) 
Installing redcarpet (3.0.0) 
Installing rkelly-remix (0.0.6) 
Using robots (0.10.1) 
Installing rspec-core (2.14.5) 
Installing rspec-expectations (2.14.2) 
Installing rspec-mocks (2.14.3) 
Installing rspec (2.14.1) 
Installing shoulda-matchers (2.3.0) 
Using simplecov-html (0.5.3) 
Using simplecov (0.5.4) 
Installing timecop (0.6.3) 
Installing yard (0.8.7) 
Using bundler (1.3.5) 
Your bundle is complete!
Use `bundle show [gemname]` to see where a bundled gem is installed.
Esto tardó un poco entre que descarga paquetes y los instala. Al finalizar Metasploit ya arranca perfectamente. El susto duró menos de 5 minutos. A trabajar!
Leer más

Zimbra, Heartbleed - OpenSSL patch

Como bien sabéis, recientemente se descubrió un grave fallo de seguridad en el paquete OpenSSL que dejó más que en entredicho la seguridad de la mayoría de los lugares que se suponían seguros en Internet. El protocolo https, que hasta ahora se garantizaba seguro, ya no lo era. Por suerte, el software libre se mueve de prisa y no se tardó mucho en sacar un parche que corregía dicha vulnerabilidad.
Estos días, lo que nos tocó a la gente de sistemas fue realizar un update masivo del paquete OpenSSL. Por suerte, herramientas como Salt Stack y Puppet ayudan a llevarlo mejor ;-)
Hoy vamos a ver cómo parchear una instalación de Zimbra que esté afectada. Zimbra, trae en su instalación las librerías OpenSSL propias, no la del sistema base, y es por ello que es necesario aplicar el parche del fabricante y no actualizar el paquete del sistema. Por suerte, el Zimbra deja a nuestra disposición (aquí el link) un parche para descargar y aplicar al equipo. Así que la forma de hacerlo es sencilla.
Lo primero es descargarnos el script que se encarga de aplicar el parche y darle permisos de ejecución.
shell> wget http://files.zimbra.com/downloads/security/zmopenssl-updater.sh
shell> chmod +x zmopenssl-updater.sh
A continuación, lo ejecutamos como root. Con ello se descargará el parche real de OpenSSL y lo aplicará a nuestra instalación de Zimbra.
shell> ./zmopenssl-updater.sh
  Downloading patched openssl
  Validating patched openssl: success
  Backing up old openssl: complete
  Installing patched openssl: complete
  OpenSSL patch process complete.
  Please restart Zimbra Collaboration Suite as the Zimbra user
Al finalizar nos informa de que hay que reiniciar el servicio para que los cambios tenga efecto. Lo hacemos.
shell> su - zimbra
zimbra@shell> zmcontrol restart
Y comprobamos que todo quede correctamente funcionando y no haya problema ninguno.
zimbra@shell> zmcontrol status
Host zimbra.localhost
 antispam                Running
 antivirus               Running
 ldap                    Running
 logger                  Running
 mailbox                 Running
 mta                     Running
 opendkim                Running
 snmp                    Running
 spell                   Running
 stats                   Running
 zmconfigd               Running

Referencias:
Leer más

NET: Registered protocol en VirtualBox

En algunas ocasiones puede que veas el siguiente error tras instalar una máquina virtual en VirtualBox o tras alterar algún tipo de configuración de la misma. Si te pasa esto,
NET: Registered protocol family 2
La solución es ir a la configuración de la máquina virtual y en "Sistema", habilitar la característica avanzada "Habilitar I/O APIC", tal como se muestra en la siguiente imagen.
Una vez guardado el cambio, simplemente hay que volver a lanzar la máquina y ya no debería de haber más errores de arranque.
Leer más

Controlando VirtualBox desde consola

En numerosas ocasiones hablamos en este blog sobre VirtualBox y la facilidad que éste tiene para la gestión de máquinas virtuales, especialmente en entornos domésticos. Personalmente no lo contemplo para algo que no sea desarrollo.
Desde mi punto de vista, uno de los mayores problemas que veo en vBox es la forma de arrancar y gestionar las máquinas; arrancas el interfaz gráfico, seleccionas la máquina y la inicias. Una vez comienza el proceso de arranque, ya se puede cerrar el software de lanzamiento. La ventana ejecuta se ejecuta en otro instancia que crear su propia ventana. No es que me moleste, pero no soy amigo de tener muchas ventanas abiertas, así que tenía que encontrar una forma de arrancar y gestionar las máquinas virtuales sin interfaz gráfico. Al fin y al cabo, a las máquinas Linux siempre me conecto vía ssh y a las máquinas con Windows no me conecto vía escritorio remoto.
Además de esto, poder gestionar las máquinas desde línea de comandos simplificaría el manejo de las mismas, especialmente en remoto, que ya no sería para nada necesario un interfaz gráfico.
Para hacerlo comencé a investigar un poco el comando VBoxManage, que es el encargado de hacer todos los trabajos a bajo nivel. Entonces descubrí la forma sencilla de poder arrancar una máquina, apagarla, saber qué máquinas tengo instaladas, cuales en ejecución, etc.
A continuación os dejo algunos de los comandos que más habitualmente supongo que se emplean en la gestión de máquinas virtuales, aunque para más información, mirar todas las opciones de VBoxManage.
  • Listar máquinas disponibles
    shell> VBoxManage list vms
    
  • Listar máquinas arrancadas
    shell> VBoxManage list runningvms
    
  • Reiniciar una máquina
    shell> VBoxManage controlvm uuid|vmname reset
    
  • Arrancar una máquina
    shel> VBoxManage startvm uuid|vmname --type headless
    
  • Apagar una máquina
    shell> VBoxManage controlvm uuid|vmname resume|poweroff
    
  • Información sobre una máquina
    shell> VBoxManage showvminfo uuid|vmname
    
  • Limitar el ancho de banda empleado por una máquina
    shell> VBoxManage bandwidthctl uuid|vmname add 'limit net' --type network --limit 1M
    
  • Registrar una nueva máquina virtual
    shell> VBoxManage registervm filename
    
  • Borrar una máquina virtual
    shell> VBoxManage unregistervm uuid|vmname --delete
    
Todos los procesos se lanzan sobre una máquina, bien por su nombre o por su uuid. En ambos casos éste debe ser único, por lo que no tendremos problemas de confundirnos de máquina sobre la que trabajar.
Leer más

Comprobando fallos de seguridad con yum

Prácticamente todas las distribuciones actuales de GNU/Linux tiene un método de control para informar sobre los fallos de seguridad y poder aplicar los parches correspondientes que salen. Hoy vamos a ver cómo realizar esta tarea en Red Hat, apoyándonos en yum, su gestor de paquetes. Este truco es aplicable tanto para Red Hat como para Fedora, no así para CentOS, que cambia un poco la forma de emplearlo y el nombre de los paquetes.
Desde yum podremos obtener información acerca de los fallos de seguridad más recientes que hay, así como datos adicionales de los mismos. De la misma forma, también podremos lanzar una actualización que sólo afecte a aquellos paquetes con problemas de seguridad, que son los más urgentes. Para realizar todas estas tareas, vamos a emplear el paquete yum-plugin-security, que no es más que un plugin que se encarga de tratar desde yum los temas de seguridad. Lo primero, instalarlo.
shell> yum install yum-plugin-security
Una vez instalado, podremos ya pedirle al sistema que nos enumere aquellos fallos de seguridad que están presentes en nuestro sistema, es decir, aquellos a los que todavía no se les aplicó un parche. Por ejemplo, la salida de un servidor con Red Hat 6,
shell> yum updateinfo list security

RHSA-2014:0328 Important/Sec. kernel-2.6.32-431.11.2.el6.x86_64
RHSA-2014:0328 Important/Sec. kernel-firmware-2.6.32-431.11.2.el6.noarch
RHSA-2014:0328 Important/Sec. kernel-headers-2.6.32-431.11.2.el6.x86_64
RHSA-2014:0330 Moderate/Sec.  libsmbclient-3.6.9-168.el6_5.x86_64
RHSA-2014:0330 Moderate/Sec.  samba-common-3.6.9-168.el6_5.x86_64
RHSA-2014:0330 Moderate/Sec.  samba-winbind-3.6.9-168.el6_5.x86_64
RHSA-2014:0330 Moderate/Sec.  samba-winbind-clients-3.6.9-168.el6_5.x86_64
Una vez tengamos el listado de fallos de seguridad, podremos obtener más información acerca de cualquiera de ellos.
shell> yum updateinfo "RHSA-2014:0328"

====================================================================
Important : kernel security and bug fix update
====================================================================
Update ID : RHSA-2014:0328
  Release : 
     Type : security
   Status : final
   Issued : 2014-03-25 00:00:00
     Bugs : 921970 - CVE-2013-1860 kernel: usb: cdc-wdm buffer overflow ...
          : 1062577 - CVE-2014-0055 kernel: vhost-net: insufficient ...
          : 1064253 - CVE-2014-0069 kernel: cifs: incorrect handling of...
          : 1070705 - CVE-2014-0101 kernel: net: sctp: null pointer ...
     CVEs : CVE-2013-1860
          : CVE-2014-0101
          : CVE-2014-0055
          : CVE-2014-0069
 Descript : The kernel packages contain the Linux kernel, the core of any
          : Linux operating system.
          : 
          : * A flaw was found in the way the get_rx_bufs()
          :   function in the vhost_net implementation in the
          :   Linux kernel handled error conditions reported
          :   by the vhost_get_vq_desc() function. A
          :   privileged guest user could use this flaw to
          :   crash the host. (CVE-2014-0055, Important)
          ...

 Severity : Important
Es importante aquí destacar la información que el primero comando nos da, pudiendo diferenciar rápidamente los tipos de vulnerabilidades por su criticidad (Important, Moderate, bugfix, etc.).
Por supuesto, una vez obtenemos este listado, actualizar el paquete en cuestión es muy sencillo, aunque ir paquete a paquete no es lo más eficiente. Para actualizar todos aquellos paquetes con un bug de seguridad, simplemente,
shell> yum --security update-minimal
Ya no hay excusas para no estar informado de aquellos problemas de seguridad y cómo afectan a nuestros sistemas, ni por supuesto, tener los sistemas sin el adecuado parche. Una de las mejoras cosas que tiene GNU/Linux es que los parches de seguridad salen casi tan rápido como los fallos se publican.
Leer más

Cómo crear un daemon en python

Una de los grandes problemas que suelen presentarse a nivel de programación de sistemas es la creación, de forma correcta, de un daemon o servicio que se ejecute en segundo plano y que haga el trabajo correctamente.
La forma más cutre que existe de hacer esto es ejecutando el comando y pasarlo luego a segundo plano, dejando así el software en cuestión trabajando, pero no en forma de daemon.
Hoy vamos a ver cómo programar un daemon en Python.
Para ello, lo primero que necesitamos es asegurarnos de que las librerías de Python necesarias están instaladas y en caso contrario, instalarlas. Una vez instaladas, ya podemos comenzar a programar el servicio de forma sencilla y eficiente.

shell> apt-get install python-daemon python-lockfile
En este caso, lo que vamos a realizar es un programa trivial y sin lógica, pero que nos servirá de ejemplo. A continuación os dejo el código.
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import logging
import time
from daemon import runner

class App():
   def __init__(self):
      self.stdin_path      = '/dev/null'
      self.stdout_path     = '/dev/tty'
      self.stderr_path     = '/dev/tty'
      self.pidfile_path    =  '/var/run/test.pid'
      self.pidfile_timeout = 5

   def run(self):
      i = 0
      while True:
         logger.info("message %s" %i++)
         i += 1
         time.sleep(1)

if __name__ == '__main__':
   app = App()
   logger = logging.getLogger("testlog")
   logger.setLevel(logging.INFO)
   formatter = logging.Formatter("%(asctime)s - %(name)s - %(message)s")
   handler = logging.FileHandler("/var/log/test.log")
   handler.setFormatter(formatter)
   logger.addHandler(handler)

   serv = runner.DaemonRunner(app)
   serv.daemon_context.files_preserve=[handler.stream]
   serv.do_action()
Como veis, el código es sencillo y con él ya creamos un pequeño servicio que se ejecutará en segundo plano y que se encargará de escribir cada segundo un mensaje en el log (fichero /var/log/test.log). A mayores también controla perfectamente que sólo haya una instancia del servicio ejecutándose al mismo tiempo (fichero de bloqueo /var/run/test.pid). Y como era de esperar, están incluidos por defecto aquellos métodos de arranque y parada de servicio (start, stop y restart). Para probar el funcionamiento del daemon, podemos hacerlo tal que así,
shell> python /usr/local/bin/test.py
usage: test.py start|stop|restart

shell> python /usr/local/bin/test.py start
started with pid 32547

shell> tail -f /var/log/test.log
2014-04-04 10:00:17,342 - testlog - Info message 3
2014-04-04 10:00:18,343 - testlog - Info message 4
2014-04-04 10:00:19,344 - testlog - Info message 5
2014-04-04 10:00:20,346 - testlog - Info message 6
2014-04-04 10:00:21,347 - testlog - Info message 7

shell> python /usr/local/bin/test.py stop
Terminating on signal 15
Por supuesto, para dejarlo listo y poder tenerlo instalado como un servicio en nuestro sistema, lo único que no falta es un fichero de arranque (/etc/init.d/test). Para ello, creamos uno muy sencillo.
#!/bin/bash

# /etc/init.d/test

### BEGIN INIT INFO
...
### END INIT INFO

case "$1" in
   start)
      echo "Starting server"
      python /usr/local/bin/test.py start 
      ;;

   stop)
      echo "Stopping server"
      python /usr/local/bin/test.py stop
      ;;

   restart)
      echo "Restarting server"
      python /usr/local/bin/test.py restart
      ;;

   *)
      echo "Usage: /etc/init.d/demonioprueba.sh {start|stop|restart}"
      exit 1
      ;;
esac
exit 0
Y ya podemos levantar nuestro servicio cuando sea necesario. Lógicamente, dentro del método run, de la clase App habrá que meter el código necesario para que el servicio tenga sentido, pero eso ya es cosa de cada uno. Aquí la idea era enseñar a levantar un servicio escrito en Python.
Leer más

VirtualBox add extension

VirtualBox es una excelente plataforma de virtualización a nivel doméstico. Tanto para trabajar como para uso en casa y aprender cosas nuevas está genial.
El otro día trabajando en una máquina de pruebas, me saltó un curioso fallo que me impedía arrancar la máquina y no sabía por qué, así que tocó investigar un poco. Lo único que hice fue darle soporte a la máquina que comenzó a fallar para tener soporte de USB 2.0, pues tenía que copiar unas cosas e iba muy lento con el USB 1.1. Tras modificar la configuración, tal como se muestra en la imagen de abajo, la máquina daba un fallo y no arrancaba.
Tras aplicar la configuración, y como resalté en rojo, el sistema ya nos estaba avisando de que algo estaba mal: "Configuración inválida detectada". Si lo ignoramos y decidimos intentar arrancar la máquina virtual, lo que obtenemos es el siguiente fallo.
Lo que nos viene a decir es básicamente lo que hicimos antes. Habilitamos el soporte para USB 2.0 y directamente no es capaz de arrancar. ¿VirtualBox no trae soporte para USB 2.0?


Fallo al abrir una sesión para la máquina virtual XXX.

Implementation of the USB 2.0 controller not found!

Because the USB 2.0 controller state is part of the saved VM state, the VM cannot be started. To fix this problem, either install the 'Oracle VM VirtualBox Extension Pack' or disable USB 2.0 support in the VM settings (VERR_NOT_FOUND)

Código Resultado: NS_ERROR_FAILURE (0x80004005)
Componente: Console
Interfaz: IConsole {8ab7c520-2442-4b66-8d74-4ff1e195d2b6}
Puesto que no me lo creí, decidí investigar un poco por mi cuenta y vi que efectivamente y de forma nativa no hay soporte para UBS 2.0, vídeo RDP ni tarjetas a 1000Mb. Estas cosas, puesto que nunca las empleé no me habían fallado, ahora que comenzaba, empezaban los fallos.

Cómo habilito entonces soporte para UBS 2.0

Lógicamente nos interesa tener soporte para todo esto y por suerte VirtualBox tiene una extensión, que no trae de fábrica, que añade dicho soporte. Antes de seguir, necesitamos saber qué versión del software tenemos. En mi caso tengo VirtualBox 4.3.0 r89960. Esto es importante, ya que las extensiones van por versión. Para saber qué versión tienes, puedes ir a "Ayuda/Acerca de VirtualBox...". Una vez sepas la versión, vas a la URL del fabricante y te descargar el pack de extensiones para la versión que tengas. Si tienes la misma versión que yo, de tejo aquí el link.
Una vez descargado el fichero, de extensión .vbox-extpack, debemos proceder a instalarlo en el sistema. Para ello vamos a "Archivo/Preferencias" y ahí, a la parte de "Extensiones", para a continuación añadir la nueva extensión que hemos descargado. Si nos fijamos, nos indica aquellas cosas para las que vamos a dar soporte.
Tener presente que esta extensión no es por usuario, sino del sistema, por lo que os pedirá la contraseña de administrador. Tras la instalación de dicha extensión, ya máquina con soporte USB 2.0 ya podrá arrancar perfectamente y tendremos una velocidad digna en dicho dispositivo.
Leer más

Rotar log de slow querys en MySQL

El otro día hablamos de cómo rotar el log de errores de MySQL y hoy vamos a ver cómo hacerlo con el log de las slow-querys, en caso de que estén activadas.
Tener un servidor de MySQL con slow querys no es buena idea, ya que penalizará bastante el rendimiento de la aplicación que emplee la base de datos, pero peor idea es no tener registro de que esto esté sucediendo. Así que te aconsejo que si no lo tienes activado, mires cómo hacerlo.
Si ya tienes esta facility funcionando, entonces toca mantenerla, es decir, consultarla y cada cierto tiempo realizar un purgado del fichero, para evitar que crezca de forma descontrolada.
En GNU/Linux existe un sistema de rotado de logs, logrotate, que se puede emplear para hacer este proceso. Las dos técnicas que emplear son:
  • copytruncate
    Copia el fichero con un nuevo nombre y trunca el original
  • no copytruncate
    Renombra el fichero con un nuevo nombre y envía una señal al proceso que lo maneja para que vuelva a abrir el log
El problema es que MySQL tiene un mutex sobre dicho fichero, por lo que emplear un truncado del fichero puede provocar que el servicio se quede bloqueado. Así que la mejor forma es enviar una señal HUP al servicio para que reabra el fichero de log después del renombrado o la mejor forma, emplear "FLUSH LOGS" en combinación con una parada en el registro de las querys.
Os dejo aquí el pequeño script desarrollado para logrotate que hace todas las funciones de rotado del log de forma automática.
/var/log/mysql/slow_querys.log {
  nocompress
  create 660 mysql mysql
  size 1G
  dateext
  missingok
  notifempty
  sharedscripts
  postrotate
    /usr/bin/mysql -e 'select @@global.long_query_time into @lqt_save; \
                       set global long_query_time=2000; select sleep(2); \
                       FLUSH LOGS; select sleep(2); \
                       set global long_query_time=@lqt_save;'
  endscript
  rotate 150
Por defecto, este es bastante permisivo y necesitamos tener nuestro servidor de MySQL muy poco protegido, cosa que no interesa. Así que vamos a cambiar la línea de postrotate por otra igual, pero pasándole un usuario que tendrá los permisos necesarios para hacer estas tareas administrativas.
/usr/bin/mysql -u logrotate -ppasswd \
               -e 'select @@global.long_query_time into @lqt_save; \
                   set global long_query_time=2000; select sleep(2); \
                   FLUSH LOGS; select sleep(2); \
                   set global long_query_time=@lqt_save;'
El comando a ejecutar es el mismo, lo único que cambiamos es que ahora le pasamos un usuario con contraseña, que previamente tenemos que crear en el servidor. Como nos interesa darle los mínimos permisos posibles, estos serán:
  • SELECT y FILE, para el "select ... into"
  • SUPER, para los "set global"
  • RELOAD, para el "flush slow logs"
Por lo tanto, la creación del usuario quedaría tal que así,
mysql> GRANT select, file, super, reload \
       ON *.* \
       TO 'logrotate'@'localhost' \
       IDENTIFIED BY 'passwd';
mysql> FLUSH PRIVILEGES;
Ya sólo nos quedará probarlo,
shell> logrotate -vf /etc/logrotate.d/mysql-slow
Si el resultado fue el correcto y esperado, el fichero de slow-querys quedará con un tamaño 0 y comenzarán a registrarle en él las nuevas querys que aparezcan. Habrá un fichero al lado de éste con las viejas querys, el cual podremos borrar o mover, pues ya no se usará. Es el histórico.

Más información: mysqlperformanceblog.com
Leer más

Formulario de contacto

Nombre

Correo electrónico *

Mensaje *

Últimos comentarios