Fallo de seguridad en BIND



Ayer fue descubierta una nueva vulnerabilidad 0-day en el servidor DNS Bind, que parece afectar a todas las versiones, provocando una denegación de servicio (DoS). El código asociado a dicha vulnerabilidad es el (CVE-2011-4313) y el fallo reportado es el siguiente:



Los servidores afectados fallan luego de registrar un error en query.c con el siguiente mensaje: "INSIST(! dns_rdataset_isassociated(sigrdataset))".
Hay reportes de múltiples versiones afectadas, incluyendo todas las versiones de ISC BIND9 soportadas en producción para este momento.
ISC está investigando activamente la causa raíz y trabajando para producir actualizaciones que previenen la falla.
La solución propuestas es actualizar a una versión con un parche paliativo, todavía no oficial del Bind9.
Más info:
https://www.isc.org/advisorycve20114313ES
Leer más

dig, solicitar transferencia de zona

dig es un comando muy complejo, que como ya se vio permite realizar consultas al DNS para obtener diversa información de una IP o de un dominio, pero también permite realizar transferencias de zona. Para realizarlo, únicamente es necesario al final del comando "axfr".
Un ejemplo de ejecución, tras el salto.

shell> dig mydomain.com @192.168.1.3 axfr

; <<>> DiG 9.3.4-P1 <<>> mydomain.com @192.168.1.3 axfr
; (1 server found)
;; global options:  printcmd
mydomain.com.  86400  IN  SOA  ns1.mydomain.es. ...
mydomain.com.  86400  IN  A    192.168.1.160
mydomain.com.  86400  IN  NS   ns2.mydomain.com.
mydomain.com.  86400  IN  NS   ns1.mydomain.com.
mydomain.com.  86400  IN  MX   mail.mydomain.com.
(...)
;; Query time: 11 sec
;; SERVER: 192.168.1.3#53(192.168.1.3)
;; WHEN: Fri Nov 15 19:32:57 2011
;; XFR size: 29 records (messages 1)
Y en caso de que la transferencia falle,
shell> dig mydomain.com @192.168.1.3 axfr
; <<>> DiG 9.7.3 <<>> mydomain.com @192.168.1.3 axfr
;; global options: +cmd
; Transfer failed.
Leer más

Extraer contenido de un paquete .rpm

Si ya hablamos en su momento de cómo extraer el contenido de un paquete debian, lo mismo se puede hacer para el sistema de paquetes RedHat/Suse, los *.rpm. En este caso, realizar dicha labor es algo más complicado, ya que no hay una herramienta que permita extraer de forma directa el contenido sino que hay que pasarlo por un pipe. Primero convertimos los archivos del rpm en ficheros y luego los componemos y volvemos a crear. Para ello usamos los comandos rpm2cpio y cpio, tal como se muestra a continuación.
shell> rpm2cpio nautilus-dropbox-0.7.0-1.rpm | cpio -idmv
./usr/bin/dropbox
./usr/share/applications/dropbox.desktop
./usr/share/icons/hicolor/16x16
...
shell> ls
usr   nautilus-dropbox-0.7.0-1.fedora.i386.rpm 

Las opciones "idmv" de cpio significan:
  • i, restaura los archivos.
  • d, crear directorios en caso de ser necesario.
  • m, mantiene los archivos en caso de que ya existan.
  • v, modo verboso.
Si lo que necesitas es ver el contenido del paquete RPM, pero no extraer sus ficheros, puedes usar el comando rpm con las opciones:
  • q, consulta el archivo rpm
  • l, lista los archivos en el paquete
  • p, especifica el nombre del paquete
shell> rpm -qlp nautilus-dropbox-0.7.0-1.rpm
/usr/bin/dropbox
/usr/share/applications/dropbox.desktop
/usr/share/icons/hicolor/16x16
...
Leer más

LaTeX: pifont, enumeraciones

LaTeX permite realizar enumeraciones como cualquier otro editor de textos, pero también permite definir el marcador que pondrá según nuestro interés de entre todos los disponibles. Un gran número de ellos están el el paquete pifont, concretamente todos los que se muestran en la imagen de la izquierda.
Por defecto LaTeX emplea los básicos de siempre ·, -, *, sin embargo éstos se pueden cambiar con el comando \renewcommand{}{} por el que más nos guste. Este comando permite alterar los puntos según los niveles de profundidad hasta 4 niveles.
\renewcommand{\labelitemi}{\ding{42}}
pondrá la mano que está en la columna del 40, fila del 2. Si por ejemplo nos interesase poner un corazón, habría que usar el 164.
Para obtener la salida anterior, el código escrito fue el siguiente.
\usepackage{pifont}
....
\renewcommand{\labelitemi}{\ding{230}}
\renewcommand{\labelitemii}{\ding{47}}
\begin{itemize}
  \item Requirements
  \begin{itemize}
    \item Hardware requirements
    \item Supported Platforms
    \item Software Requirements
  \end{itemize}
  \item Components
  \begin{itemize}
    \item Zabbix Server
    \item Zabbix Proxy
  \end{itemize}
  \item Installation from Source
  \begin{itemize}
    \item Software requirements
    \item Structure of Zabbix distribution
  \end{itemize}
  \item Upgrading
  \renewcommand{\labelitemii}{\ding{118}}
  \begin{itemize}
    \item Change level releases
  \end{itemize}
\end{itemize}
Leer más

LDAP: Restaurar copia

En la entrada anterior hablamos de cómo hacer un backup de la base de datos de LDAP. Este es un proceso que todo el mundo debería de hacer regularmente, para tener solución a algún problema que pueda suceder.
Si el problema de que LDAP se corrompe sucede, tener backup es importante y por lo tanto, vamos a ver cómo restaurar desde la copia de seguridad.
Para restaurar la copia, los pasos a seguir son:
  1. Para LDAP
    shell> /etc/init.d/slapd stop
    
  2. Restaurar los datos de LDAP
    shell> slapadd -l /var/backups/ldap.ldif
    
  3. Rehacer los índices
    shell> slapindex -v -f /etc/ldap/slapd.conf
    
  4. Arrancar LDAP
    shell> /etc/init.d/slapd start
    
De forma sencilla hemos logrado volver a tener el servicio activo y sin demasiado trabajo extra para el fallo ocasionado.
Leer más

Autenticación en linux vía USB

A quién no se le pasó por la cabeza realizar la autenticación de un usuario con un dispositivo USB. Tú llegas a un equipo, enchufas el pen y automáticamente el sistema detecta qué usuario eres y te permite el acceso. Esto, además de práctico es perfecto. Cada pen es realmente un usuario y en entornos universitarios, que solían regalarte un dispositivo de estos, pues quedaría muy bien.
En GNU/Linux conseguir es relativamente sencillo, lo único que se necesita en el dispositivo ("el usuario"), previamente creado y mucha imaginación, ya que, con tiempo, hay muy pocas cosas imposibles.
Para empezar, instalaremos las librerías necesarias. Como siempre, partimos de nuestra distro preferida y tiramos de repositorios oficiales.
shell> apt-get install libpam-usb pamusb-tools
Una vez instalado el software necesario sólo queda crear el token de autenticación en dicho dispositivo. Para simplificar la tarea, yo recomiendo que sólo se conecte un dispositivo al sistema y así simplificar las cosas y evitar equivocarse. Aunque nos equivocásemos la información del pen no se perdería, por eso no habría problema. La información extra que vamos a introducir no realiza cambios en el sistema de ficheros. Para crear el token:
shell> pamusb-conf --add-device token
 Please select the device you wish to add.
  * Using "SanDisk U3 Cruzer Micro (SanDisk_U3-0:0)" (only option)

 Which volume would you like to use for storing data ?
  * Using "/dev/sdf1 (UUID: A3AD-3572)" (only option)

 Name   : token
 Vendor : SanDisk
 Model  : U3 Cruzer Micro
 Serial : SanDisk_U3_Cruzer_Micro_25851207EFD19790-0:0
 UUID   : A3AD-3572

 Save to /etc/pamusb.conf ?
 [Y/n] Y
 Done.
Ahora asociamos el token creado con un usuario concreto. En mi caso con el usuario javier. Toda esta información se está almacenando en el fichero /etc/pamusb.conf y podría ser consultada o exportada a otros equipos, lo que garantizaría que esta operación aquí descrita sólo hubiera que realizarla en un único equipo la primera vez.
shell> pamusb-conf --add-user javier
 Which device would you like to use for authentication ?
  * Using "token" (only option)

 User   : javier
 Device : token

 Save to /etc/pamusb.conf ?
 [Y/n] Y
 Done.
Ahora, antes de realizar los cambios en el sistema para que permita la autenticación vía USB, vamos a comprobar que todo quedó correcto. Aquí lo importante es conseguir que todo esté correcto (Access granted), que será lo que nos garantice que todo funcione. Una salida correcta, sería la que se ve a continuación.
shell> pamusb-check javier
 * Authentication request for user "javier" (pamusb-check)
 * Device "token" is connected (good).
 * Performing one time pad verification...
 * Regenerating new pads...
 * Access granted.
Tras esto, únicamente queda indicarle a pam que la autenticación de los usuarios la realice también a través del módulo usb, que se llama pam_usb.so. Para ello, hay que editar el fichero /etc/pam.d/common-auth y añadirle la siguiente línea:
auth sufficient pam_usb.so
Tras ello, salimos de la sesión y comprobamos que se puede iniciar perfectamente sesión al introducir el pen en el equipo en la pantalla de login y también desbloquear una sesión ya iniciada.

Hay que recordar que en este proceso en ningún momento se altera el contenido del sistema de ficheros del dispositivo y aunque se intentanse realizar una copia bit a bit del pen, no se podría copiar el usuario por que los datos asociados son el fabricante, el UUID del dispositivo y el Nº de serie, una combinación que cuando menos se considera difícil de replicar.

Con lo dicho aquí y lo escrito en otro post sobre UUID no sería demasiado complejo asociar un pen con la home de usuario y con su autenticación.
Leer más

Clonar sistema debian

Los sistemas de backup son una muy buena opción a la hora de realizar una copia segura de todos los datos, sin embargo no son lo óptimo que debieran. Esto es por que realizar un backup completo de los sistemas puede ser muy costoso, tanto en tiempo como en espacio. Las cintas suelen ser lentas y copiar todo el sistema, binarios incluido, no suele compensar. Entonces... ¿cómo hacemos para recuperar el sistema en caso de desastre?
La forma más simple es que nuestro sistema de backup tenga los datos y las configuraciones y luego tengamos un listado de los paquetes instalados en el sistema, para que en caso de desastre completo, recuperar el sistema sea más simple. Instalamos los mismos paquetes en el nuevo sistema y luego restauramos configuraciones y datos.
Por suerte, para hacer esto, en sistemas debian/ubuntu, dpkg tiene opciones especiales, get-selections y set-selections. Con el primero sacamos un listado de paquetes con el estado de los mismos y con el segundo cargamos el nombre de dichos paquetes en el sistema, para luego gracias a la opción dselect-upgrade de apt, poder instalarlos y desde un sistema con lo mínimo instalado poder pasar al estado final del sistema.
Primero sacamos un listado de los paquetes de nuestro sistema.
shell> dpkg --get-selections
a2ps     install
acpi-support-base   install
acpid     install
adduser     install
adjtimex    install
adobe-certs    install
adobereader-esp    install
aide     install
aide-common    install
alien     install
alsa-base    deinstall
...
shell> dpkg --get-selections> /var/backups/instalados.list

Luego lo cargamos e instalamos en el nuevo sistema, para tener una copia de los paquetes insalados.
shell> dpkg --set-selections < /var/backups/instalados.list
shell> apt-get dselect-upgrade
Leer más

Repositorios debian backports

La mayor crítica que se suele escuchar de debian es que los paquetes de la versión estable suelen ser muy antiguos respecto del resto de distros. Esto es motivado por la seguridad que tienen los paquetes en la rama estable y la gran cantidad de filtros que pasan antes de entrar en dicha rama. Lo que para servidores puede ser una buena noticia, menos bug's, puede ser en ocasiones un problema si necesitas una versión más actual de un paquete determinado. Esto se soluciona, en muchos casos con el repositorio backports de debian, que tiene versiones más actuales compiladas con opciones de la versión estable. Así podremos instalar en una squeeze, actual estable, un paquete de testing o unstable, pero con las mismas librerías de la rama estable. Para agregar este nuevo repositorio, únicamente habrá que añadir la siguiente línea a nuestro /etc/apt/sources.list.
deb http://backports.debian.org/debian-backports squeeze-backports main
Con el nuevo repositorio ya en el sistema, cada vez que queramos instalar un nuevo paquete disponible desde backports, simplemente,
shell> apt-get update
shell> apt-get -t squeeze-backports install "paquete"

Así mantendremos nuestro sistema siempre en la versión estable y sólo "tiraremos" del nuevo repositorio si se lo especificamos.
En caso de que nos interese tener sus paquetes por defecto y que se actualice todo el equipo con estos, habrá que modificar las preferencias (/etc/apt/preferences.d/backports) del sistema con el siguiente contenido:
Package: *
Pin: release a=squeeze-backports
Pin-Priority: 200

Más info en:
http://backports-master.debian.org/Instructions
Leer más

Percona: fallo al obtener clave GPG

No se exactamente el motivo por el que sucede, pero parece que las claves GPG de percona no están ya disponibles en los servidores oficiales gpg y por lo tanto no se puede obtener. Para sistemas RedHat, desde yum se puede instalar el paquete percona-release-0.0-1.x86_64.rpm e importar la clave. Sin embargo, para sistemas debian, la importación de las claves GPG para apt, se realiza de otra forma, según la documentación oficial:
shell> gpg --keyserver  hkp://keys.gnupg.net \
       --recv-keys 1C4CBDCDCD2EFD2A
shell> gpg -a --export CD2EFD2A | apt-key add -

Ahora mismo si hacemos eso, obtenemos un bonito error y por lo tanto nos quedamos sin clave y los paquetes que instalemos no serán de confianza para el sistema y habrá que aceptarlos manualmente. Este fallo se repite usemos el servidor de claves que usemos. Aquí dos ejemplos.
shell> gpg --keyserver hkp://keys.gnupg.net
       --recv-keys 1C4CBDCDCD2EFD2A
gpg: solicitando clave CD2EFD2A de hkp servidor keys.gnupg.net
?: keys.gnupg.net: Connection timed out
gpgkeys: HTTP fetch error 7: couldn't connect:Connection timed out
gpg: no se han encontrados datos OpenPGP válidos
gpg: Cantidad total procesada: 0
shell> gpg --keyserver  hkp://pgp.mit.edu \
       --recv-keys 1C4CBDCDCD2EFD2A
gpg: solicitando clave CD2EFD2A de hkp servidor pgp.mit.edu
?: pgp.mit.edu: Connection timed out
gpgkeys: HTTP fetch error 7: couldn't connect:Connection timed out
gpg: no se han encontrados datos OpenPGP válidos
gpg: Cantidad total procesada: 0

Para importar la clave, encontré este truco, que no consiste en otra cosa que no sea descargar la clave directamente desde el servidor percona oficial y luego importarla manualmente. Para ello:
shell> wget -q http://www.percona.com/redir/downloads/RPM-GPG-KEY-percona 
shell> gpg --import RPM-GPG-KEY-percona
gpg: clave CD2EFD2A: clave pública "Percona MySQL Team" importada
gpg: Cantidad total procesada: 1
gpg:               importadas: 1
shell> gpg -a --export CD2EFD2A | apt-key add -
OK
Leer más

Percona: instalación en debian squeeze

El servidor de base de datos, percona, un fork de MySQL con parches de optimización y rendimiento se puede instalar de prácticamente todas las distros existentes. En nuestro caso, para instalarla en debian squeeze, usaremos los repositorios oficiales y para hacerlo, simplemente habrá que añadir un nuevo repositorio a nuestro sources.list con la siguiente línea.
deb http://repo.percona.com/apt squeeze main
Y a continuación, instalar el servidor que más nos convenga. Para ello...
shell> apt-get update
...
W: Error de GPG: http://repo.percona.com squeeze Release: Las firmas siguientes no se pudieron verificar porque su llave pública no está disponible: NO_PUBKEY 1C4CBDCDCD2EFD2A
shell> apt-cache search percona
libmysqlclient-dev - Percona Server database development files
libmysqlclient15-dev - Percona Server database development files
libmysqlclient16 - Percona Server database client library
libmysqlclient18 - Percona Server database client library
percona-server-client - Percona Server database client
percona-server-client-5.1 - Percona Server database client
percona-server-client-5.5 - Percona Server database client
percona-server-common - Percona Server database common files
percona-server-common-5.5 - Percona Server database common files
percona-server-server - Percona Server database server
percona-server-server-5.1 - Percona Server database server
percona-server-server-5.5 - Percona Server database server
percona-server-test-5.5 - Percona Server database test suite
shell> apt-get install percona-server-server-5.5
¿Desea continuar [S/n]? 
AVISO: ¡No se han podido autenticar los siguientes paquetes!
  libmysqlclient16 libmysqlclient18 percona-server-common-5.5
percona-server-client-5.5 percona-server-server-5.5
¿Instalar estos paquetes sin verificación [s/N]? s

La instalación avisará de que la clave GPG no es válida. Para aceptarla de forma continua y evitar el error, simplemente la agregamos como clave válida a nuestro sistema apt.
shell> gpg --keyserver hkp://keys.gnupg.net \
       --recv-keys 1C4CBDCDCD2EFD2A
shell> gpg -a --export CD2EFD2A | apt-key add -
Leer más

Percona: fallo en permisos debian-sys-maint

Percona, un clon de MySQL, ofrece todas las funcionalidades del producto original, pero con una serie de parches y mejoras que lo hacen más estable, potente y versátil.
Gracias a la gente de Percona, la instalación en equipos Debian es sencilla, ya que existe un pequeño repositorio con los paquetes necesarios para su instalación y que Debian no tiene.
deb http://repo.percona.com/apt squeeze main
Sin embargo, tras la instalación del paquete cuando procedemos a arrancar el servicio éste arranca, pero observamos un pequeño error heredado de paquetes de MySQL especialmente preparados para Debian.
shell> /etc/init.d/mysql start
Starting MySQL (Percona Server) database server: mysqld . ..
Checking for corrupt, not cleanly closed and upgrade needing tables..
ERROR 1045 (28000): Access denied for user 'debian-sys-maint'@'localhost' (using password: YES)
Aunque el fallo no afecta a la hora de iniciar el servicio sí es cierto que queda feo, por lo tanto para solucionarlo nos llegará con crear el usuario debian-sys-maint en la nueva base de datos recién instalada y que no se hace por defecto. La contraseña es generado de forma aleatoria por el sistema y está almacenada en el fichero /etc/mysql/debian.cnf. Una vez obtenida la contraseña, simplemente accedemos al MySQL y creamos el usuario tal como sigue:
mysql> GRANT ALL PRIVILEGES ON *.* \
   TO 'debian-sys-maint'@'%' \
   IDENTIFIED BY '0tyzQO8xBV1vcnDr' \
   WITH GRANT OPTION MAX_QUERIES_PER_HOUR 0 \
   MAX_CONNECTIONS_PER_HOUR 0 \
   MAX_UPDATES_PER_HOUR 0 \
   MAX_USER_CONNECTIONS 0;
Query OK, 0 rows affected (0.00 sec)
En el próximo arranque del servicio ya no tendremos el fallo del acceso denegado ;-)
Leer más

Cambiar idioma de teclado en consola


En algunas ocasiones nos encontramos con un equipo que tiene el teclado físico en español, pero el teclado configurado está en inglés. Esto es un gran problema, ya que muchas de las teclas están cambiadas.
Esto suele pasar generalmente con distribuciones live-cd y sabiendo cómo cambiar el idioma del teclado, el trabajo será más rápido, ya que no habrá que adivinar las teclas. Para cargar el nuevo mapa de teclado emplearemos el comando loadkeys. Bajo /usr/share/keymaps/ están todas las distribuciones de teclado que GNU/Linux soporta, así que únicamente elegir la que deseemos.
shell> loadkeys /usr/share/keymaps/i386/qwerty/es.kmap.gz
Leer más

Comandos interesantes: tleds

Hoy quiero compartir esta entrada sobre el que considero un comando programa interesante, aunque también un poco friki curioso.
tleds es un programilla que permite enviar la existencia de comunicación en la tarjeta de red al teclado. Esto es, hacer que los led's del teclado (numérico y lock) se comporten como los led's de la tarjeta de red y parpadeen cuando los de la tarjeta lo hagan. La utilidad que se le puede encontrar es mas bien escasa, pero puede quedar divertido probarlo y ejecutarlo alguna vez. Está en los repositorios oficiales debian/ubuntu, así que para instalarlo:
shell> apt-get install tleds

Luego nos aseguramos de matar todas las instancias primero, opción -k para luego lanzarlo nuevamente sobre el interfaz de red que nos interese, en este caso eth2. Soporta interfaces virtuales y wireless.
shell> tleds -k
  One moment...(1 sec)...
  Killed. (The old PID was 31274)
shell> tleds -c eth2
  Setting keyboard LEDs based on changes of Receive/Transmit
  packets of eth2 in /proc/net/dev
  Delay between updates is 50 milliseconds.

El efecto es cuando menos curioso. Yo no lo llegué a probar en un portátil, si alguien lo prueba y quiere comentar algo, perfecto :-)
Leer más

MySQL: innotop

innotop es una herramienta para la monitorización de MySQL escrita en perl y es muy simple. La información que nos proporciona es similar a la obtenida por mytop, del que ya hablamos anteriormente, pero con mayores funcionalidades. En el manual se describe como una herramienta de monitorización de MySQL que permite controlar el estado de la replicación master-slave, control de query's, transacciones, etc.
Su ejecución pide ciertos parámetros de conexión, pero tras conectarse, el funcionamiento es muy similar al del comando top de GNU/Linux, pero para un servidor mysql.
En equipos debian/ubuntu está disponible en los repositorios, dentro del paquete mysql-client-5.X. Una vez instalado, únicamente habrá que ejecutarlo y conectarse a la BD deseada.
shell> innotop -c /etc/mysql/my.cnf
Enter a name: mysql
Enter a DSN string: DBI:mysql:;host=localhost;port=3306
Do you want to specify a username for mysql?: root
Do you want to specify a password for mysql?: passwd
Enter password for 'root' on mysql: 
Save password in plain text in the config file?: no
...

InnoDB Txns (? for help)

CXN    History  Versions  Undo   Dirty   Buf  Used Bufs
mysql  2922     0         0.00%  94.81%  1    00:00         

Y el listado de query's que se están ejecutando en el servidor al que nos hemos conectado.
Query List (? for help)

CXN   Cmd        Cnt ID    User   Host      Time  Query

mysql Query          53852 root   localhost 00:00 SHOW ENGINE...
mysql Query      49  12933 webusr localhost 09:38 SELECT * FROM...
mysql Sending Da 23   2383 webusr localhost 02:43 SELECT col1,...
mysql Sleep      120   140 webusr localhost 18:12
mysql Statistics 12  19213 webusr localhost 01:19 SELECT * FROM...

Si necesitamos más ayuda para poder establecer nuevas conexiones a otros servidores o cambiar los valores, presionando la tecla '?', nos saldrá la siguiente ayuda.
InnoDB Txns (? for help)

Switch to a different mode:
  B InnoDB Buffers   I InnoDB I/O Info    Q Query List
  C Command Summary  L Locks              R InnoDB Row Ops
  D InnoDB Deadlocks M Replication Status S Variables & Status
  F InnoDB FK Err    O Open Tables        T InnoDB Txns

Actions:
  a Toggle the innotop process   k Kill a transaction's connection
  c Choose visible columns       n Switch to the next connection
  d Change refresh interval      p Pause innotop
  e Explain a thread's query     q Quit innotop
  f Show a thread's full query   r Reverse sort order
  h Toggle the header on and off s Change the display sort column
  i Toggle inactive transactions x Kill a query

Other:
TAB Switch to the next server group / Quickly filter what you see
  ! Show license and warranty       = Toggle aggregation
  # Select/create server groups     @ Select/create connections
  $ Edit configuration settings     \ Clear quick-filters
Leer más

LDAP: Copia de seguridad

En nuestro servidor samba/ldap es una práctica muy necesaria y recomendada realizar un backup diario o cada X tiempo de toda su estructura, por si por cualquier motivo se pierden dichos datos o se corrompe la base de datos, poder restaurarlo de forma rápida e inmediata. En el siguiente post mostraremos cómo restaurar la copia, pero primero es necesario realizar la copia. Para hacer eso, usaremos el comando slapcat. Aunque se puede realizar el backup con el servidor corriendo, por seguridad lo realizaremos con él apagado, para asegurarnos que no se crea un nuevo registro mientras se realizar el backup.
shell> /etc/init.d/slapd stop
shell> slapcat > /var/backups/ldap.ldif
shell> /etc/init.d/slapd start

A continuación se muestra un pequeño script que realiza un backup diario, al programarlo en cron por cada día de la semana.
#!/bin/sh
[ -x /usr/sbin/slapcat ] || exit 0
/usr/sbin/slapcat | gzip -c > /var/backups/ldap-$(date +%u).gz
Leer más

Ruby: fallo de seguridad criptográfica


Justo antes de ir a dormir me entero vía unaaldía y el canal svn  de Ruby que se acaba de publicar un importante fallo de seguridad en los sistemas de cifrado de Ruby. Concretamente en la librería que se encarga de generar las claves de los algoritmos RSA. Esto deja al sistema un poco indefenso ante ataques de fuerza bruta a la hora de adivinar la clave RSA, ya que dejan de ser todo lo aleatorias que debería. Algo similar al fallo CVE-2008-0166 de Debian en OpenSSL.
El anuncio oficial se dio en el canal SVN de Ruby:
ext/openssl/ossl_pkey_rsa.c (rsa_generate): [SECURITY] Set RSA exponent value correctly. Awful bug. This bug caused exponent of generated key to be always '1'. By default, and regardless of e given as a parameter.

!!! Keys generated by this code (trunk after 2011-09-01) must be re-generated !!! (ruby_1_9_3 is safe)
Ya hay una nueva release que corrige el fallo detectado, por lo que es muy recomendable actualizar y generar nuevamente las claves RSA si la versión usada está afectada y se han generado claves con ella.

Más info:
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=33633
http://unaaldia.hispasec.com/2011/11/horrible-fallo-de-seguridad.html
Leer más

Comandos interesantes: sysv-rc-conf

sysv-rc-conf es una de esas utilidades que sirven para editar los niveles de arranque de nuestro sistema debian/ubuntu. Aunque esto se puede hacer de forma manual con el comando update-rc.d, gracias a esta utilidad la gestión de estos niveles es más simple y visual.
Permite configurar por niveles cada uno de los servicios de forma completamente independiente.
shell> apt-cache search sysv-rc-conf
sysv-rc-conf-SysV init runlevel configuration tool for terminal
shell> apt-get install sysv-rc-conf
shell> sysv-rc-conf

Un ejemplo de ejecución:

Leer más

Comandos interesantes: rcconf

En un post anterior ya vimos el comando sysv-rc-conf que permite configurar los niveles de arranque y los servicios que se ejecutan en cada uno. rcconf es otro utilidad que hace exactamente lo mismo, pero de forma mucho más sencilla, ya que la configuración es automática y no deja seleccionar los niveles, simplemente servicios. La configuración es automática.
En sistemas debian/ubuntu está incluido en los repositorios oficiales, por lo que,
shell> apt-cache search rcconf
rcconf - Debian Runlevel configuration tool
shell> apt-get install rcconf
shell> rcconf
Una captura del programa en ejecución tras el salto.


Leer más

puppet: usando parámetros para mejorar legibilidad

puppet permite realizar configuraciones complejas basadas en parámetros, lo cual permite la posterior exportación de las configuraciones a otros sistemas y arquitecturas de una forma mucho más simple.
Escenificándolo, se podría crear una clase, params, sobre la cual se definirán los diversos valores que podrán coger las variable, en función de determinados parámetros, por ejemplo $operatingsystem.
class basico::params {
   $provider = $operatingsystem ? {
      /(ubuntu|debian)/ => "debian",
      default           => "init",
   }
   $atoppack = $operatingsystem ? {
      default           => "atop",
   }
}
Y luego sólo habría que incluir dicha subclase donde se desee usar y llamar a sus variables, que siempre tendrán un valor.
class basico::atop {
   require bascio::params

   package { "atop":
      name     => "${basico::params::atoppack}",
      ensure   => installed;
   }
}
En este ejemplo, el paquete atop está únicamente disponible para sistemas debian/ubuntu, en caso de que ahora aparezca un nuevo sistema redhat, en el que el paquete atop tiene otro nombre, atop.noarch, éste no se podría instalar desde puppet sin modificar la clase basico::atop con un case. Al tener la clase de params definida, únicamente habría que añadir un nuevo valor redhat para la variable $atoppack, tal como sigue,
class basico::params {
   $atoppack = $operatingsystem ? {
      redhat  => "atop.noarch",
      default => "atop",
   }
}
Aunque su utilidad pueda no parecer muy grande, realmente sí lo es, por que la toma de decisiones en función de casos está en un único fichero y no dentro del propio manifiesto, lo que asegura que no se altere el funcionamiento. Aunque en el caso presentado su utilidad puede no ser excesiva, el uso de una subclase para los parámetros es altamente recomendable.
Leer más

Comandos interesantes: cpulimit

Recientemente hablamos de trickle, un programa que permite limitar el uso de la red a nivel de usuario. Hoy vamos a comentar otro de esos comandos de interés, cpulimit. Como su nombre bien indica, es un programa que permite limitar el uso de CPU de un determinado programa, ya sea por nombre o por PID. Este control puede resultar muy útil en caso de que algún usuario esté realizando un consumo excesivo de recursos de la máquina o también es caso de que un programa esté consumiendo muchos recursos poder bajárselos. Aunque hay muchas otras formas de realizar estos, cpulimit es muy simple de instalar
shell> apt-cache search cpulimit
cpulimit - tool for limiting the CPU usage of a process
shell> apt-get install cpulimit

Y también de usar
shell> cpulimit -e chrome -l 35

En caso de que no se sepa el nombre del programa que está realizando el consumo de CPU, también se puede pasar el PID del mismo a cpulimit. El PID de podría obtener de forma simple gracias a top y luego paśarselo.
shell> top
14:06:38 up 14 days, 6:15, 2 users, load average: 0.07, 0.24, 0.20
Tasks: 171 total, 1 running, 165 sleeping, 0 stopped, 5 zombie
Cpu(s):1.5%us,1.5%sy,0.0%ni,97.1%id,0.0%wa,0.0%hi,0.0%si,0.0%st
Mem: 2065160k total,1993824k used,  71336k free,320940k buffers
Swap:1951888k total,  58920k used,1892968k free,747152k cached

 PID USER    PR NI  VIRT RES  SHR S %CPU %MEM    TIME+  COMMAND
9085 javier  20  0  211m 93m  23m S    0  4.6  1:32.03   chrome
1872 root    20  0 87964 75m 3004 S    0  3.7 45:19.17   puppet
8259 javier  20  0  214m 75m  21m S    0  3.7  1:51.54   chrome
2406 javier  20  0  196m 31m 8264 S   65  1.6  3:42.59   dropbox

shell> cpulimit -p 2406 -l 20

Con esto conseguimos que el consumo de CPU de dropbox nunca se exceda del 20% del total de la CPU.
Leer más

LaTeX: mezclar texto e imágenes

En LaTeX una de las cosas más complicadas que hay es el manejo de tablas e imágenes, especialmente la segunda. Aunque incluir una imagen puede ser algo muy fácil, colocar una imagen en el punto exacto que deseemos puede ya no ser tan trivial. En este post, vamos a explicar cómo realizar dicha tarea. La idea es obtener una imagen integrada en el texto y no separada del mismo, como se muestra en la siguiente captura, donde se ve una imagen a la derecha del texto y éste a la izquierda del mismo. Esto es lo que se conoce como una caja flotante.

Para realizar esto, es necesario usar el paquete wrapfig, que nos permite usar la sentencia wrapfigure e introducir ahí la imagen y decirle hacia dónde queremos orientarla, alignment, derecha (r) o izquierda (l), así como definir el ancho, width. La fucnión:
\begin{wrapfigure}{alignment}{width}

Un ejemplo del código necesario para conseguir la captura anteriormente mostrada es el siguiente:
\usepackage{wrapfig} %preámbulo
...
\chapter{¿Qué es Ruby?}
\begin{wrapfigure}{c}{0.5cm}
  \scalebox{0.5}{
    \includegraphics{./imagen/ruby_logo.png}
    %\caption{Descripción si se desea}
  }
\end{wrapfigure}
Ruby es un lenguaje de programación...

Leer más

samba+ldap: grupos de dominio


Según la documentación oficial de microsoft, bajo el protocolo netbios, existen 3 tipos de grupos que forman parte de un dominio y sobre los que se pueden realizar diferentes tipos de tareas y manteniemitno. Estos són:

  • Grupo local
    Es un grupo de samba-ldap local al dominio. Esto quiere decir que éste grupo sólo estará disponible para el dominio local y en caso de que haya dominios de confianza, no estará disponible para los otros dominios del "grupo".
    Cada uno de los dominios que pertenezcan a un dominio de confianza pueden tener los mismos grupos locales, que no serán visibles entra ellos.
  • Grupo global
    Tienes las mismas propiedades que un grupo local, pero éste se distribuye entre el resto de miembros de un dominio de confianza. Los grupos globales están disponibles para todos los miembros del dominio y las personas o grupos que pertenezcan a él pueden ser aceptados y tener los permisos que se establezcan en todos los equipos miembro.
  • Grupo universal
    Un grupo universal es lo mismo que un grupo global pero a nivel de bosques miembros. Permiten asignar permisos a grupos y usuarios en cualquier equipo del bosque.
    Estos grupos son los menos empleados y solo se verían en grandes dominios con integraciones globales a dominios miembro.
Mi recomendación, siempre usar grupos locales para un dominio propio y dejar la posibilidad de usar grupos globales por si un día se forma parte de un dominio de confianza. El uso de grupos locales asegura que los permisos nunca se pierda aunque el sistema con posterioridad escale.

Leer más

MySQL: intercambiar valor de columnas



En algunas ocasiones, por algún motivo nos puede interesar intercambiar los valores de una columna por los de otra. Escenificando un poco más, partimos de la siguiente tabla test, en la que queremos intercambiar los valores de la columna long por los de la columna lat.




mysql> show create table test;
+-------+---------------------------------+
| Table | Create Table                    |
+-------+---------------------------------+
| users | CREATE TABLE `test` (           |
|       | `id` int(11) DEFAULT '0',       |
|       | `name` varchar(100) DEFAULT '', |
|       | `long` int(11) DEFAULT NULL,    |
|       | `lat` int(11) DEFAULT NULL,     |
|       | ) ENGINE=InnoDB                 |
+-------+---------------------------------+
mysql> select * from test;
+----+------+------+------+
| id | name | long | lat  |
+----+------+------+------+
|  1 | x    |   -1 |    1 |
|  2 | y    |   -2 |    2 |
|  3 | z    |   -3 |    3 |
+----+------+------+------+
3 rows in set (0.00 sec)

Para realizarlo no sirve con lanzar un update del estilo,
mysql> update test set long=lat,lat=long;
ya que mysql no permite realizar este tipo de updates. Para solucionar este problema, el update necesario sería el que sigue tras el salto.
mysql> update test t1,test t2 set t1.long=t2.lat,
 t1.lat=t2.long
 where t1.id=t2.id;
Query OK, 3 rows affected (0.04 sec)
Rows matched: 3  Changed: 3  Warnings: 0

mysql> select * from test;
+----+------+------+------+
| id | name | long | lat  |
+----+------+------+------+
|  1 | x    |    1 |   -1 |
|  2 | x    |    2 |   -2 |
|  3 | x    |    3 |   -3 |
+----+------+------+------+
3 rows in set (0.00 sec) 

Si los campos son de tipo VARCHAR, entonces también se podría realizar utilizando una variable temporal de mysql, y filtrando que los campos nunca estén a NULL.
mysql> update test set long=lat,
 lat=@temp
 where (@temp:=long) IS NOT NULL;
Leer más

Fallo de seguridad en apache

Desde la web halfdog se ha notificado un fallo de seguridad importante que afecta a todas las versiones de apache inferior a la 2.2.20 y que permite a un usuario local una escalada de privilegios, consiguiendo los mismo que tenga el servidor apache (por defecto, en sistemas debian, www).
La vulnerabilidad está localizada en la función ap_pregsub, del fichero server/util.c, llamado desde el módulo mod_setenvif. Por un desbordamiento del buffer, un posible atacante puede manipular el fichero .htaccess, especialmente creado y conseguir la escalada de privilegios. Para conseguir explotar este fallo, es necesario que apache esté empleando el módulo mencionado y crear el .htaccess.
Las consecuencias de un ataque, podrían ser, desde enlentecer el servidor hasta ejecución de código con los privilegios del servidor apache.
Para ciertas empresas, como por ejemplo donde trabaja un colega mio, este fallo puede tener ampliar consecuencias.
Las soluciones propuestas:
  1. Dejar de usar el módulo afectado (mod_setenvif).
  2. Impedir el uso del fichero .htaccess en los directorios en los que el usuario tenga permisos de escritura, con la secuencia "AllowOverride None".
Leer más

Cómo agregar un repositorio a RedHat


En la entrada anterior explicamos cómo saber qué repositorios se están empleando en nuestro sistema y por lo tanto, desde cuales tenemos paquetes disponibles para instalar/actualizar, pero...

¿Cómo agregamos un nuevo repositorio en Red Hat?

Existen dos formas de hacerlo, crear el fichero de repositorio directamente o usar la herramienta que incorpora RedHat/CentOS para tal efecto, yum-config-manager.
  1. Fichero de configuración del repositorio
    Bajo la carpeta /etc/yum.repos.d están localizados los ficheros de repositorio de RedHat.
    Cada uno de estos ficheros maneja los repositorios y para agregar uno nuevo o deshabilitar uno existente llega con crear un nuevo fichero con la estructura deseada, o cambiar el valor de la variable enabled a 1, respectivamente.
    shell> ls /etc/yum.repos.d/
    Dag.repo  epel.repo  epel-testing.repo  rhdp.repo
    shell> cat /etc/yum.repos.d/epel.repo
    [epel]
    name=Extra Packages for Enterprise Linux 6 - $basearch
    baseurl=http://download.fedoraproject.org/pub/epel/6/$basearc
    failovermethod=priority
    enabled=0
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
    
  2. yum-config-manager
    Es la forma más sencilla de agregar un nuevo repositorio y sólo hay que saber la URL del mismo. Toda la creación del fichero y la configuración del repositorio se hace de forma automática. Por lo tanto, para agregar un repositorio:
    shell> yum-config-manager --add-repo= \
    http://download.fedoraproject.org/pub/epel/6/$basearch
    
    Una vez agregado lo podemos manejar, siempre referenciándolo por su nombre. Para activarlo,
    shell> yum repolist all
    Loaded plugins: rhnplugin
    ...
    rhn-tools-rhel-x86_64-server-6 RHN Tools for RHEL enabled: 52
    repolist: 5,781
    shell> yum-config-manager --enable "RHN Tools for RHEL"
    
    Y también desactivar,
    shell> yum-config-manager --disable "RHN Tools for RHEL"
Leer más

LaTeX: acrónimos

En documentos largos y formales, especialmente textos técnicos y cietíficos, se suele dar el caso de que sea necesario usar acrónimos y LaTeX, como era de esperar, tiene un paquete que facilita dicha tarea, acronym. Un acrónimo no es más término acortado de una palabra real, que se especifica por su claridad y también para ahorrar espacio en texto. Así mismo, si la palabra empleada es compleja, el uso de acrónimos suele ser una práctica muy recomendada, ya que evita posibles faltas a la hora de escribirla. Se escribirá una vez y luego al compilarla, LaTeX hará las sustituciones pertinentes. Esta es una buena práctica que se puede usar un muchos casos, una acrónimos para simplificar la escritura.
A continuación, se mostrarán los diferentes usos que se le pueden dar a los acrónimos y por lo tanto, las diferentes utilidades del paquete acronym.
Primero, hay que definir los acrónimos que se usarán en el documento. Para ello importamos el paquete acronym y luego definimos los acrónimos que deseemos con acrodef{acrónimo}{Texto descriptivo}.
\usepackage{acronym}

\acrodef{VB}{Visula Basic}
\acrodef{FP}{Formación Profesional}
\acrodef{SIDA}{Síndrome de Inmunodeficiencia Adquirida}

Para referenciar cualquier acrónimo definido, únicamente hay que referenciarlo con ac{acrónimo}. La primera vez que se use, aparecerá el texto descriptivo primero y entre paréntesis el acrónimo (texto corto). Las siguientes veces, aparecerá el acrónimo directamente.
En la educación actual la \ac{FP} es uno de los pilares básicos....

El paquete acronym aparte de las funciones acrodef{}{} y ac{}, también define otra función de interés, como es acf{} que hace que siempre aparezca el texto completo del acrónimo correspondiente. Ésta puede resultar muy útil a la hora de escribir palabras o texto repetitivo, ya que simplifica la forma de escribirlo.

Otras funciones que incluye el paquete son:
  • acp{}, incluye el plural del acrónimo (por defecto añade una s al final del acrónimo).
  • acs{}, hace que aparezca la versión córta del acrónimo.
  • acresetall{}, resetea todos los acrónimos de forma que se establecen como "no usados".
  • acused{}, marca el acrónimo como "usado".
Leer más

Comandos interesantes: time


En muchas ocasiones se nos pide, o nos interesa, saber el tiempo que un determinado comando tarda en ejecutarse. Existen diversas formas de hacerlo, pero la verdad es que la de coger un reloj y mirar el tiempo, no es de las más fiables y la de ejecutar date antes y después del comando, pues también hace que perdamos tiempo. Para dar solución a estos problemas, GNU/Linux optó por tener un comando, time, que hace justamente lo que necesitamos, darnos el tiempo que tarda un determinado comando en ejecutarse.

shell> time df -h
S.ficheros      Size  Used Avail Use% Montado en
/dev/sda3        28G  6,6G   20G  26% /
tmpfs          1009M  916K 1008M   1% /dev/shm
/dev/sda1       464M   47M  393M  11% /boot
/dev/sda5        37G   17G   19G  46% /home

real 0m0.035s
user 0m0.004s
sys 0m0.000s

Como se observa en la salida del comando anterior, time nos muestra 3 tiempos:
  • user, es el tiempo empleado por el proceso en modo usuario.
  • sys, es el tiempo empleado por el sistema en manejar el proceso.
  • real, es el tiempo completo desde que se inició hasta que se terminó la ejecución.
time resulta muy útil para comprobar las diferencias de tiempo y rendimiento que hay entre dos sistemas al ejecutar un comando, o los diferentes tiempos que da un mismo sistema ante un mismo comando, ya que ofrece una salida más ajustada de los tiempos.
Leer más

Manejar repositorios RedHat

RedHat tiene un sistema de paquetes "similar" a Debian, pero con extensión '.rpm'. Dichos paquetes están disponibles en repositorios que se pueden activar y desactivar dependiendo de lo que nos interese en cada momento.
La configuración de los repositorios a los que acceder, en realidad son ficheros de texto bajo la carpeta /etc/yum.repos.d/ y son éstos los que yum lee para poder a continuación hacer un fetch de los paquetes disponibles. Desde el propio yum también se pueden consultar los repositorios configurados, así como saber cuales de éstos están disponibles, cuales deshabilitados, y también el número de paquetes que ofrece cada uno.
  • Listado de repositorios
    shell> yum repolist
    Loaded plugins: rhnplugin
    repo id                         repo name                                 status
    rhel-x86_64-server-6            RH Enterprise Linux                        5,489
    rhel-x86_64-server-fastrack-6   RHEL Server FasTrack                         240
    rhn-tools-rhel-x86_64-server-6  RHN Tools for RHEL                            52
    repolist: 5,781
    
  • Listado de repositorios 'enabled'
    shell> yum repolist enabled
    Loaded plugins: rhnplugin
    repo id                         repo name                                 status
    rhel-x86_64-server-6            RH Enterprise Linux                        5,489
    rhel-x86_64-server-fastrack-6   RHEL Server FasTrack                         240
    rhn-tools-rhel-x86_64-server-6  RHN Tools for RHEL                            52
    repolist: 5,781
    
  • Listado de repositorios 'disabled'
    shell> yum repolist disabled
    Loaded plugins: rhnplugin
    repo id                         repo name
    dag                             Dag RPM Repository for RHEL
    epel                            Extra Packages for EL-6 - x86_64
    epel-debuginfo                  Extra Packages for EL-6 - x86_64 - Debug
    epel-source                     Extra Packages for EL-6 - x86_64 - Source
    epel-testing                    Extra Packages for EL-6 - Testing - x86_64
    repolist: 0
    
  • Listado completo de repositorios
    shell> yum repolist all
    Loaded plugins: rhnplugin
    repo id                        repo name                                  status
    dag                            Dag RPM Repository for RHEL                disabled
    epel                           Extra Packages for EL-6 - x86_64           disabled
    epel-debuginfo                 Extra Packages for EL-6 - x86_64 - Debug   disibled
    epel-source                    Extra Packages for EL-6 - x86_64 - Source  disibled
    epel-testing                   Extra Packages for EL-6 - Testing - x86_64 disabled
    rhel-x86_64-server-6           Red Hat Enterprise Linux Server            enabled: 5,489
    rhel-x86_64-server-fastrack-6  RHEL Server FasTrack                       enabled:   240
    rhn-tools-rhel-x86_64-server-6 RHN Tools for RHEL                         enabled:    52
    repolist: 5,781
    
En la próxima entrada veremos cómo agregar y activar/desactivar los repositorios.
Leer más

Comandos interesantes: trickle

trickle es una herramienta que permite a usuarios de GNU/Linux limitar el ancho de banda que se consume, tanto de subida como de bajada, con valores diferentes. Las ventajas de trickle es que es muy simple de usar y que además permite trabajar a nivel de aplicación de usuario, no es necesario ser root, como a nivel de daemon, limitando y controlando el ancho de banda de equipos a nivel global.
Para realizar esto, el fichero de configuración /etc/trickled.conf, define limitaciones por protocolo. Por ejemplo, damos más prioridad a las conexiones ssh y descartamos prioridad y ancho de banda a las aplicaciones web.

shell> vi /etc/trickled.conf
 [ssh]
  Priority = 1
  Time-Smoothing = 0.1
  Length-Smoothing = 2

 [www]
  Priority = 8
  Time-Smoothing = 5
  Length-Smoothing = 20

Las variables Length-Smoothing y Time-Smoothing permiten definir las fluctuaciones de ancho de banda y el tiempo de control de ajuste. Priority establece la prioridad del protocolo, menos valor, mayor prioridad.
Si en vez de emplear trickle como un daemon, lo empleamos directamente en aplicaciones o procesos que sabemos que van a consumir un gran ancho de banda, tendremos las mismas limitaciones de consumos.
shell> trickle -d 100 apt-get upgrade

Para ver todas las opciones que trickle ofrece, se puede consultar su man, pero las más destacadas,
shell> trickle --help
  -d   Límite de descarga en KB/s.
  -u   Límite de subida en KB/s.
  -t   Establece la ventana de tiempo en segundos.
Leer más

Formulario de contacto

Nombre

Correo electrónico *

Mensaje *

Últimos comentarios