Algo de Linux: febrero 2013

martes, 26 de febrero de 2013

pslurp: Copiar archivos de varias máquinas a una máquina central en paralelo

pslurp es otra de las herramientas que uso en ocasiones para copiar archivos en paralelo desde un conjunto de máquinas, como los servidores ltsp, a mi máquina pasarela.
Como ya comenté en el artículo sobre pscp, me es bastante cómodo porque tengo pasada una clave pública de la máquina pasarela a dichos servidores y no me pide password, aunque como ya dije, ésto no es imprescindible proque podemos indicarle a pscp la password con la que queremos realizar la copia haciendo uso del parámetro --askpass.
Además, como en la máquina pasarela, uso también dsh, dispongo de archivos con listas de máquinas sobre las que actuar de forma remota. Por ejemplo: 
  • /etc/dsh/machines.list
  • /etc/dsh/group/servidoresltsp.list
  • /etc/dsh/group/pizarras.list
La sintaxis básica del comando es la siguiente:

# pslurp [OPTIONS] remote local

Para ver las opciones disponibles:

# pslurp --help
Veamos un ejemplo práctico:

Supongamos que tengo un fichero con la lista de servidores ltsp de mi centro (/etc/dsh/group/servidoresltsp) y quiero copiar la clave pública de cada servidor ltsp a mi máquina, sabiendo que la clave pública de cada servidor ltsp se encuentra almacenada en el directorio /root/.ssh/id_rsa.pub. Para lograrlo, no tengo más que recurrir a pslurp:


# pslurp -h /etc/dsh/group/servidoresltsp -L /home/gestor/claves-publicas-ltsp/ /root/.ssh/id_rsa.pub id_rsa.pub

¿Qué es lo que va a hacer pslurp? Simplemente, va a copiar el archivo /root/.ssh/id_rsa.pub de las máquinas remotas especificadas en /etc/dsh/group/servidoresltsp y lo va a almacenar en el directorio local /home/gestor/claves-publicas-ltsp de mi máquina con el nombre id_rsa.pub. Pero no va a copiar directamente el archivo id_rsa.pub dentro del directorio /home/gestor/claves-publicas-ltsp, sino que va a crear un subdirectorio dentro de /home/gestor/claves-publicas-ltsp con el nombre de cada máquina, donde almacenará el archivo que estamos copiando.

Si lo que queremos copiar es un directorio con archivos y/o subdirectorios, podremos hacerlo con la opción -r. Por ejemplo: Siguiendo con el ejemplo anterior, si quisiéramos copiar el directorio .ssh completo, en lugar de copiar solamente el archivo id_rsa.pub:

# pslurp -h /etc/dsh/group/servidoresltsp -L /home/gestor/claves-publicas-ltsp/ -r /root/.ssh ssh

viernes, 22 de febrero de 2013

update-alternatives: Plugins de java y flash para firefox e iceweasel

Hay tres alternativas básicas en Debian que, con toda probabilidad, necesitaremos gestionar:
  • /etc/alternatives/iceweasel-javaplugin.so (plugin de java en iceweasel)
  • /etc/alternatives/mozilla-javaplugin.so (plugin de java en firefox)
  • /etc/alternatives/flash-mozilla.so (plugin de flash)
Para listar las alternativas del plugin de java para iceweasel:

# update-alternatives --list iceweasel-javaplugin.so

Y se nos mostrarán las alternativas que tengamos definidas:

/usr/lib/jvm/j2re1.7-oracle/lib/i386/libnpjp2.so
/usr/lib/jvm/java-6-sun/jre/lib/i386/libnpjp2.so
/usr/lib/jvm/jre-7.15-oracle-i586/lib/i386/libnpjp2.so


Una vez que hemos visto las posibles alternativas, podemos cambiar la alternativa a usar por defecto de la siguiente manera:

# update-alternatives --config iceweasel-javaplugin.so

Nos mostrará las alternativas y nos permitirá seleccionar la alternativa que queremos usar:

Existen 3 opciones para la alternativa iceweasel-javaplugin.so (que provee /usr/lib/iceweasel/plugins/libjavaplugin.so).
  Selección   Ruta                                                    Prioridad  Estado
------------------------------------------------------------
* 0           /usr/lib/jvm/j2re1.7-oracle/lib/i386/libnpjp2.so             316       modo automático
  1            /usr/lib/jvm/j2re1.7-oracle/lib/i386/libnpjp2.so             316       modo manual
  2            /usr/lib/jvm/java-6-sun/jre/lib/i386/libnpjp2.so              63        modo manual
  3            /usr/lib/jvm/jre-7.15-oracle-i586/lib/i386/libnpjp2.so   316       modo manual

Pulse para mantener el valor por omisión [*] o pulse un número de selección:

Para establecer la opción marcada como automática:

# update-alternatives --auto iceweasel-javaplugin.so

Si quisiéramos crear una nueva alternativa de java para iceweasel:

# update-alternatives --install /usr/lib/iceweasel/plugins/iceweasel-javaplugin.so iceweasel-javaplugin.so /usr/lib/jvm/j2re1.7-oracle/lib/i386/libnpjp2.so 316

Y si quisiéramos crear una nueva alternativa de java para firefox:

# update-alternatives --install /usr/lib/mozilla/plugins/mozilla-javaplugin.so mozilla-javaplugin.so /usr/lib/jvm/j2re1.7-oracle/lib/i386/libnpjp2.so 316

Hoy me encontré con una máquina que no tenía ninguna alternativa para el plugin de flash de mozilla y tuve que creársela de la siguiente manera:

# update-alternatives --install /usr/lib/mozilla/plugins/flash-mozilla.so flash-mozilla.so /usr/lib/flashplugin-nonfree/libflashplayer.so 15

Y si la alternativa fuera para iceweasel:

# update-alternatives --install /usr/lib/iceweasel/plugins/flash-mozilla.so flash-mozilla.so /usr/lib/flashplugin-nonfree/libflashplayer.so 15

Paquetes de firefox 19.0 para instalar en las máquinas de los IES

A continuación dejo dos enlaces para descargar los paquetes de 32 y 64 bits creados "de forma rápida" para instalar firefox 19.0 en el directorio /opt/firefox/ de las máquinas del instituto. 


Importante: Estos paquetes tan sólo colocan firefox en /opt/firefox/. No cambian el enlace de /usr/bin/iceweasel a /opt/firefox/firefox para que se siga pudiendo usar iceweasel como navegador por defecto. 

Para realizar el cambio de iceweasel a firefox o firefox a iceweasel, tengo dos tareas puppet:
  • activa-firefox 
  • activa-iceweasel 
De este modo, si quiero que los portátiles, los servidores ltsp o los workstation usen firefox, les pongo la tarea activa-firefox y si quiero que usen iceweasel, les pongo la tarea activa-iceweasel.

jueves, 21 de febrero de 2013

Ajustes de configuración de iceweasel y firefox

Esta entrada es más que nada una chuleta para recordar dónde guardamos los ajustes de firefox e iceweasel, más que nada porque uno se vuelve loco con tantos archivos y tantas configuraciones diferentes...

En firefox:
/opt/firefox/defaults/pref/local-settings.js
/opt/firefox/firefox.cfg

En iceweasel:
/etc/iceweasel/pref/iceweasel.js

In-Seguridad en los routers Amper ASL 26555 de Movistar

En agosto de 2012, Alberto Ortega publicaba en securitybydefault un artículo en el que hablaba de la configuración, uso avanzado y una posible backdoor para obtener la clave de administrador del router y lograr el control total del dispositivo con permisos de administración.

La gestión simple del router nos permite modificar pocas cosas accediendo a través de su IP: 

http://192.168.1.1

Por otro lado, existe un acceso a una gestión avanzada (es decir a la configuración total del router) a través de un panel web con autenticación que corre en el puerto 8000:

http://192.168.1.1:8000

Hasta ahí todo perfecto y muy bien pensado. 

El problema es que en este servidor web existe un directorio llamado /APIS/, para el que no se requiere autenticación de acceso.  Vamos, que el acceso a este directorio es seguro, pero a su contenido no.

Podemos comprobar directamente en nuestro navegador que al acceder a este directorio nos devuelve error 404:

http://192.168.1.1:8000/APIS/

Pero si conocemos el nombre de los archivos alojados en este directorio, a ellos sí podemos acceder sin ningún problema. Y si, accedemos en particular al archivo returnJSON.htm, el router nos mostrará la clave del administrador. Por ejemplo, si abrimos un terminal y ejecutamos:

$ wget http://192.168.1.1:8000/APIS/returnJSON.htm

Obtendremos una salida parecida a la siguiente:

{
"RETURN":{
"success": true,
"errorDescription": "ERROR_GENERAL"
},
"USER":{
"USERNAME": "admin",
"PASSWORD": "mipassword"
}
}

Esto es una vulnerabilidad importantísima que cualquiera puede explotar conectando un equipo a la red o simplemente con usar un equipo de los que hay conectados a la red.

El router adsl que teníamos montado era bastante antiguo, se averió. y mira por donde, nos montaron un Amper ASL 26555 de Movistar. Y yo pensé:

Bueno, esta vulnerabilidad está publicada desde agosto de 2012 y estamos en febrero, así que el problema debe estar resuelto.

Abrí un terminal en mi máquina, ejecuté "$ wget http://192.168.1.1:8000/APIS/returnJSON.htm" y puede comprobar que NO, que el agujero de seguridad seguía ahí y que podía obtener la clave del router con estar solamente conectado a la red sin privilegios de seguridad, con un usuario cualquiera.

Me puse en contacto con Movistar a través del servicio de chat y me atendieron muy amablemente, todo hay que decirlo. Después de explicarles el problema, me dijeron que abrían una incidencia para que me cambiaran el router.

Avisaron a los técnicos que cambiaron el router y éstos volvieron a llamarme para preguntarme por el problema. Volví a explicarlo de nuevo, y me informaron de que no tenían otro modelo de router, y que ese era el único modelo que se estaba montando actualmente. La solución fue montarme un router más antiguo.

Algo que me resultó gracioso cuando les expliqué el tema fue que me dijeron que nosotros teníamos que tener nuestros mecanismos de seguridad. No sé si quería decir que en cualquier caso ellos no eran responsables de la seguidad. Me reí y le dije: "Yo puedo tener todas las medidas de seguridad que quiera, pero si montamos su router estamos abriendo un agujero de seguridad a toda la red que echará abajo todos los mecanismos que yo pudiera tener."

Así que nada. Si tenéis este router montado en vuestras instalaciones, pedid que os lo cambien. Y no seáis malos y no le hagáis la puñeta a vuestro amigo, que el no tiene la culpa de tener un router como éste.

lunes, 18 de febrero de 2013

pscp: Copiar archivos en paralelo a varias máquinas

Muchas veces recurro a pscp para copiar archivos en paralelo desde mi máquina pasarela a los servidores ltsp. 

Me es bastante cómodo porque tengo pasada una clave pública de la máquina pasarela a dichos servidores y no me pide password. En cualquier caso, ésto no es algo imprescindible porque podemos indicarle a pscp la password con la que queremos realizar la copia haciendo uso del parámetro --askpass.

Además, como en la máquina pasarela, uso también dsh, dispongo de archivos con listas de máquinas sobre las que actuar de forma remota. Por ejemplo: 
  • /etc/dsh/machines.list
  • /etc/dsh/group/servidoresltsp.list
  • /etc/dsh/group/pizarras.list
La sintaxis básica del comando es la siguiente:

# pscp [OPTIONS] local remote

De este modo, si quiero copiar un script que tengo en mi máquina al directorio /usr/sbin/ de todos los servidores de terminales, podría ejecutar el comando pscp de la siguiente manera:

# pscp -h /etc/dsh/group/servidoresltsp.list actualizakernelchroot.sh /usr/sbin/  

Si quisiera copiar un directorio el directorio flashplugin-nonfree que tengo almacenado dentro del directorio /root y su contenido de forma recursiva en las máquinas remotas podría hacerlo del siguiente modo:

# pscp -h /etc/dsh/group/servidoresltsp.list -r /root/flashplugin-nonfree /var/cache/

Y si quisiera  obtener información acerca del resultado de la ejecución de la copia:

# pscp -h /etc/dsh/group/servidoresltsp.list -r -v /root/flashplugin-nonfree /var/cache/

domingo, 17 de febrero de 2013

Convertir extensiones de iceweasel en extensiones globales para todos los usuarios

Cuando un usuario añade extensiones en Iceweasel, éstas se instalan en  un directorio llamado extensions dentro de su perfil de usuario. Por ejemplo:

/home/enavas/.mozilla/firefox/3e52gm3r.default/extensions/

Si queremos instalar de forma global para todos los usuarios las extensiones de nuestro perfil, no tenemos más que copiarlas al directorio:

/usr/lib/mozilla/extensions/



/usr/lib/mozilla-firefox/extensions/

Por ejemplo:

# cp /home/enavas/.mozilla/firefox/3e52gm3r.default/extensions/* /usr/lib/mozilla-firefox/extensions/

Para instalar las extensiones de forma global para todos los usuarios en la imagen de los terminales ltsp, he tenido que copiar las extensiones en:

/opt/ltsp/i386/usr/lib/iceweasel/extensions/

PSSH: Parallel SSH Tools, un conjunto de herramientas útiles para administradores

PSSH (http://code.google.com/p/parallel-ssh/) nos proporciona una versión de herramientas ssh escritas en python que se lanzan en paralelo sobre un conjunto de máquinas:
  • pssh, para ejecutar comandos en paralelo sobre un conjunto de máquinas.
  • pscp, para copiar archivos en paralelo a un conjunto de máquinas.
  • prsync, para hacer un rsync en paralelo sobre un conjunto de máquinas.
  • pnuke, para matar procesos en paralelo en un conjunto de máquinas.
  • pslurp, para copiar archivos en paralelo desde un conjunto de hosts a una máquina local.
Veamos a continuación como instalar pssh.
Primero, descargamos el código fuente:

$ cd ~ ; wget http://parallel-ssh.googlecode.com/files/pssh-2.3.1.tar.gz  

Segundo, descomprimimos en /usr/src:

$ tar xfvz ~/pssh-2.3.1.tar.gz -C /usr/src

Tercero, nos desplazamos al directorio donde hemos descomprimido el código fuente:

$ cd /usr/src/pssh-2.3.1 

Cuarto, instalamos:

$ sudo python setup.py install

Y veremos una salida como la siguiente:

running install
running build
running build_py
creating build
creating build/lib.linux-i686-2.6
creating build/lib.linux-i686-2.6/psshlib
copying psshlib/__init__.py -> build/lib.linux-i686-2.6/psshlib
copying psshlib/task.py -> build/lib.linux-i686-2.6/psshlib
copying psshlib/manager.py -> build/lib.linux-i686-2.6/psshlib
copying psshlib/askpass_server.py -> build/lib.linux-i686-2.6/psshlib
copying psshlib/cli.py -> build/lib.linux-i686-2.6/psshlib
copying psshlib/askpass_client.py -> build/lib.linux-i686-2.6/psshlib
copying psshlib/version.py -> build/lib.linux-i686-2.6/psshlib
copying psshlib/color.py -> build/lib.linux-i686-2.6/psshlib
copying psshlib/psshutil.py -> build/lib.linux-i686-2.6/psshlib
running build_scripts
creating build/scripts-2.6
copying and adjusting bin/pssh -> build/scripts-2.6
copying and adjusting bin/pnuke -> build/scripts-2.6
copying and adjusting bin/prsync -> build/scripts-2.6
copying and adjusting bin/pslurp -> build/scripts-2.6
copying and adjusting bin/pscp -> build/scripts-2.6
copying and adjusting bin/pssh-askpass -> build/scripts-2.6
changing mode of build/scripts-2.6/pssh from 644 to 755
changing mode of build/scripts-2.6/pnuke from 644 to 755
changing mode of build/scripts-2.6/prsync from 644 to 755
changing mode of build/scripts-2.6/pslurp from 644 to 755
changing mode of build/scripts-2.6/pscp from 644 to 755
changing mode of build/scripts-2.6/pssh-askpass from 644 to 755
running install_lib
creating /usr/local/lib/python2.6/dist-packages/psshlib
copying build/lib.linux-i686-2.6/psshlib/__init__.py -> /usr/local/lib/python2.6/dist-packages/psshlib
copying build/lib.linux-i686-2.6/psshlib/task.py -> /usr/local/lib/python2.6/dist-packages/psshlib
copying build/lib.linux-i686-2.6/psshlib/manager.py -> /usr/local/lib/python2.6/dist-packages/psshlib
copying build/lib.linux-i686-2.6/psshlib/askpass_server.py -> /usr/local/lib/python2.6/dist-packages/psshlib
copying build/lib.linux-i686-2.6/psshlib/cli.py -> /usr/local/lib/python2.6/dist-packages/psshlib
copying build/lib.linux-i686-2.6/psshlib/askpass_client.py -> /usr/local/lib/python2.6/dist-packages/psshlib
copying build/lib.linux-i686-2.6/psshlib/version.py -> /usr/local/lib/python2.6/dist-packages/psshlib
copying build/lib.linux-i686-2.6/psshlib/color.py -> /usr/local/lib/python2.6/dist-packages/psshlib
copying build/lib.linux-i686-2.6/psshlib/psshutil.py -> /usr/local/lib/python2.6/dist-packages/psshlib
byte-compiling /usr/local/lib/python2.6/dist-packages/psshlib/__init__.py to __init__.pyc
byte-compiling /usr/local/lib/python2.6/dist-packages/psshlib/task.py to task.pyc
byte-compiling /usr/local/lib/python2.6/dist-packages/psshlib/manager.py to manager.pyc
byte-compiling /usr/local/lib/python2.6/dist-packages/psshlib/askpass_server.py to askpass_server.pyc
byte-compiling /usr/local/lib/python2.6/dist-packages/psshlib/cli.py to cli.pyc
byte-compiling /usr/local/lib/python2.6/dist-packages/psshlib/askpass_client.py to askpass_client.pyc
byte-compiling /usr/local/lib/python2.6/dist-packages/psshlib/version.py to version.pyc
byte-compiling /usr/local/lib/python2.6/dist-packages/psshlib/color.py to color.pyc
byte-compiling /usr/local/lib/python2.6/dist-packages/psshlib/psshutil.py to psshutil.pyc
running install_scripts
copying build/scripts-2.6/prsync -> /usr/local/bin
copying build/scripts-2.6/pslurp -> /usr/local/bin
copying build/scripts-2.6/pscp -> /usr/local/bin
copying build/scripts-2.6/pnuke -> /usr/local/bin
copying build/scripts-2.6/pssh-askpass -> /usr/local/bin
copying build/scripts-2.6/pssh -> /usr/local/bin
changing mode of /usr/local/bin/prsync to 755
changing mode of /usr/local/bin/pslurp to 755
changing mode of /usr/local/bin/pscp to 755
changing mode of /usr/local/bin/pnuke to 755
changing mode of /usr/local/bin/pssh-askpass to 755
changing mode of /usr/local/bin/pssh to 755
running install_data
copying man/man1/pssh.1 -> /usr/local/man/man1
copying man/man1/pscp.1 -> /usr/local/man/man1
copying man/man1/prsync.1 -> /usr/local/man/man1
copying man/man1/pslurp.1 -> /usr/local/man/man1
copying man/man1/pnuke.1 -> /usr/local/man/man1
running install_egg_info
Writing /usr/local/lib/python2.6/dist-packages/pssh-2.3.1.egg-info

Si os fijáis en la salida del comando de instalación, veréis que todas estas utilidades se instalan en /usr/local/bin/ y que los archivos de ayuda se instalan en /usr/local/man

lunes, 4 de febrero de 2013

Instalar extensiones de LibreOffice desde un terminal

Si queremos instalar extensiones de LibreOffice desde un terminal y que estén disponibles para todos los usuarios, no tenemos más que usar unopkg.

Por ejemplo:

# unopkg add --shared Sun_ODF_Template_Pack_2_ES.oxt

Con ésto instalamos el pack de plantillas "Professional Template Pack II", un paquete de plantillas para Writer, Calc, Draw e Impress en español, que os recomiendo instalar en LibreOffice.