h1

Acceder por SSH con claves públicas sin introducir la contraseña cada vez

15/11/2008

Actualización de seguridad (octubre de 2026): el artículo original utiliza claves DSA, que deben considerarse obsoletas para nuevas configuraciones. No reutilices los comandos de generación DSA del ejemplo histórico.

Procedimiento actual recomendado

ssh-keygen -t ed25519 -C "acceso-ssh"
ssh-copy-id -i ~/.ssh/id_ed25519.pub usuario@servidor
ssh usuario@servidor

Protege la clave privada con una frase de paso, usa un agente SSH cuando corresponda y revisa los permisos de ~/.ssh (700) y de la clave privada (600). El archivo authorized_keys se encuentra en el servidor de destino. No desactives la autenticación por contraseña hasta confirmar que el acceso con clave funciona y disponer de un método de recuperación.

Relacionado: automatizar copias de seguridad con SSH.


Hay veces que tenemos que entrar sucesivamente a una máquina por ssh, y se pierde mucho tiempo en el login. Para ello hay una utilidad de SSH que permite el logueo automático sin que ello signifique decremento de seguridad. Para ello se genera una clave pública y se exporta a la otra máquina, asumiendo el demonio de ssh a partir de entonces el acceso desde esa máquina, con ese usuario y con esa clave, como permitido:

carlos@host1:~$ ssh-keygen -t dsa
carlos@host1:~$ ssh-copy-id -i .ssh/id_dsa.pub pepito@host2

De esta manera el usuario carlos puede entrar en host2 como usuario «pepito» sin tener que teclear siempre la contraseña. Es una solución util para interacciones automática entre sistemas sin tener que almacenar la contraseña del usuario en texto plano, cron o demás.

A parte, es conveniente en sistemas compartidos modificar los permisos de acceso a los ficheros de claves generados para evitar malos usos:
carlos@WhenIGrewUp:~$ chmod 700 .ssh
carlos@WhenIGrewUp:~$ chmod 600 .ssh/authorized_keys
carlos@WhenIGrewUp:~$ chmod 600 .ssh/id_dsa
carlos@WhenIGrewUp:~$ chmod 744 .ssh/id_dsa.pub

En determinadas ocasiones no funciona esta solución. Para ello es conveniente unificar la versión de servidor ssh existente en los nodos. Se puede averiguar facilmente con la utilidad scanssh:

carlos@WhenIGrewUp:~$ sudo scanssh 172.26.9
172.26.0.9:22 SSH-2.0-OpenSSH_4.6p1 Debian-5ubuntu0.6
Effective host scan rate: 3.91 hosts/s

carlos@WhenIGrewUp:~$ sudo scanssh 172.26.5
172.26.0.5:22 SSH-2.0-OpenSSH_5.1p1 Debian-3ubuntu1
Effective host scan rate: 1.52 hosts/s

carlos@shirley:~$ sudo scanssh 172.26.0.4
172.26.0.4:22 SSH-2.0-OpenSSH_4.7p1 Debian-8ubuntu1.2
Effective host scan rate: 3.33 hosts/s

Otros artículos relacionados: Automatizar respaldos usando SSH

h1

Importar ficheros de correo (Mbox, PST, etc) en Gmail

13/11/2008

Para facilitar al Gran Hermano su labor podemos importar en nuestras cuentas de Gmail ese fichero de correo de cientos, a veces gigas, de correo que ya es inamovible de nuestro ordenador (y por tanto inaccesible desde otras localizaciones).

Para ello existe GML (GoogleMail Loader), un script en Python para procesar ficheros de correo en formato Mbox (Netscape, Mozilla Thunderbird), MailDIR (Qmail), MMDF (Mutt), NH (NHM) o Babyl (Emacs Rmail). El formato PST de Outlook se puede transformar facilmente con la herramienta «readPST» a formato Mbox.

GML se puede descargar desde aquí, donde también hay versión para Windows. Tras descomprimirlo, se ejecuta mediante el intérprete de Phyton:

carlos@WhenIGrewUp:~/gmlw$ python gmlw.py

La ejecución es muy sencilla, se muestra un GUI en el que hay que elegir la dirección de correo, el fichero almacén y el login en el SMTP correspondiente. Posteriormente el proceso comenzará incorporándose los correos en Gmail con la fecha y destinatarios originales. Lo único que cambiará será el remitente si utilizas el smtp de Gmail, que incluirá tu dirección de Gmail pero mantendrá el nombre del remitente verdadero para facilitar el seguimiento (límites de la seguridad frente al spam en los SMTP’s habituales). Es un proceso automático y lento.

En esta portabilidad de correos siempre es recomendable que antes de empezar que cambies tu contraseña de Gmail. Ésta ya es visible en la GUI y en la consola. Si utilizas como SMTP el de Gmail, viajará encriptada. Posteriormente puedes volver a establecer tu contraseña anterior.

Posibles problemas:

a) Al iniciar una importación, se produce el siguiente problema:
mBox (Netscape, Mozilla, Thunderbird) at location /home/carlos/tmp/Inbox Opened Successfully.
Done. Stats: 0 success 0 error 0 skipped.

El fichero no es un Mbox, pese a que el aviso indique que si.

b) El fichero está corrupto o no lo reconoce.
Se puede aplicar un programa de limpieza del fichero descargable aquí.

carlos@WhenIGrewUp:~/tmp$ python cleanmbox.py varios
Reading messages from 'varios'
Processing 55 messages... done.
Wrote to 'varios.cleaned'
Cleaned 1 mailbox(es).

c) Al ejecutarlo se produce el siguiente error:
carlos@WhenIGrewUp:~/gmlw$ python gmlw.py
Traceback (most recent call last):
File "gmlw.py", line 42, in
import os, sys, mailbox, smtplib, time, Pmw, webbrowser, tkFileDialog, re
ImportError: No module named Pmw

en caso de obtener ese error, se necesitará instalar la librería correspondiente:
carlos@WhenIGrewUp:~/gmlw$ apt-cache search pmw
python-pmw - Pmw -- Python MegaWidgets
python-pmw-doc - Pmw -- Python MegaWidgets
carlos@WhenIGrewUp:~/gmlw$ sudo apt-get install python-pmw

Al estar descontinuado GML, han surgido forks o modificaciones de este programa. A parte, hay otra opción como Gexodus.

h1

Monitorizar servicios Linux con Monit y reiniciarlos ante fallos

02/11/2008

Actualización (octubre de 2026): el ejemplo de Monit de 2008 es histórico: las rutas de configuración, los comandos de arranque y los nombres de servicios pueden haber cambiado. Comprueba tu versión instalada y valida la configuración antes de reiniciar servicios.

Seguridad: el ejemplo original incluye una credencial demostrativa admin:monit. No la utilices en un equipo real. Si habilitas la interfaz web de Monit, restringe su acceso y usa una contraseña robusta y exclusiva. No expongas el puerto de administración sin controles adecuados.

Relacionado: monitorización de máquinas VirtualBox con Monit.


Frecuentemente es necesario tener servicios y procesos monitorizados y levantados las 24h. Para ello existen utilidades que monitorizan y rearracan en caso de caída o condiciones críticas del sistema, a la vez que envían alertas al administrador. Y lo hacen no sólo en base al estado del proceso si no también, si se desea, en función del entorno (RAM en uso, espacio libre en disco, etc), así como permite crear tareas de mantenimiento para evitar entrar en situaciones críticas.

En GNU/Linux uno de los más utilizados es Monit. De una manera sencilla permite controlar procesos, servicios, ficheros, memoria, CPU, puertos ó comunicaciones. En Debian ó Ubuntu se instala de manera sencilla:

$sudo apt-get install monit

Y crea el servicio que se arrancará en todos los reinicios. A contiinuación, es necesario activarlo configurando los parámetros generales de la aplicación:

$sudo nano /etc/default/monit
# You must set this variable to for monit to start
startup=1
# To change the intervals which monit should run uncomment
# and change this variable.
CHECK_INTERVALS=180

y posteriormente indicar los parámetros personalizados (condiciones a monitorizar). El fichero viene totalmente comentado por un ejemplo de cada tipología de evento monitorizable (fichero que cambia, procesos que mueren, consumo de memoria o de CPU, puerto inalcanzable…), de modo que es bastante fácil de configurar y de adaptar a situaciones persanlizadas. En mi caso pongo de ejemplo una condición para mantener demonio de aMule (amuled) arrancado si cae:

# sudo nano /etc/monit/monitrc
set daemon  60
set logfile syslog facility log_daemon
set httpd port 2812 and
use address localhost  # only accept connection from localhost
allow localhost        # allow localhost to connect to the server and
allow admin:monit      # require user 'admin' with password 'monit'
(...)
#--------------- AMULE DAEMON
check process aMule with pidfile /home/carlos/.aMule/muleLock
start program = "/etc/init.d/amule-daemon start"
stop program  = "/etc/init.d/amule-daemon stop"
if failed host localhost port 4712 then restart
(...)

Comentar que el  «set httpd port 2812» configura un interfaz web cómodo para acceder a las estadísticas de Monit vía web. A parte, las estadísticas se pueden ver en el syslog o en el fichero que se especifique en la configuración.

Otros artículos relacionados: Automatizar copias de seguridad con Bash y SSH

h1

Eventum no envía correos: configuración de tareas cron

23/07/2008

Eventum, el gestor de incidencias, tiene una utilidad muy cómoda para enviar un correo a los «afectados» cuando se crea o modifica una incidencia. Para hacerlo funcionar, a parte de tener que configurar sus parámetros, es necesario meter en el cron las siguientes líneas:

* * * * * cd /home/webadmin/htdocs/eventum/misc; /usr/bin/php -q process_mail_queue.php
*/10 * * * * cd /home/webadmin/htdocs/eventum/misc; /usr/bin/php -q check_reminders.php

h1

Cómo ver las opciones de superusuario de Eventum (smtp, etc)

20/07/2008

En algunos casos con el usuario que manejamos perdemos la categoría de superusuario, y por tanto no se muestran esas opciones de configuración. Basta con conectarse a la base de datos, localizar el ID correspondiente al usuario y alterar sus categoría.

Conectar a MySQL:
pilar002:/var/www/eventum/config# mysql --user=usuarioEventum --password=clavesecreta nombre_de_la_BD
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 235
Server version: 5.0.32-Debian_7etch6-log Debian etch distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

Obtener el ID (en este caso es «3») del usuario al que queremos promocionar:


mysql> SELECT usr_id FROM eventum_user WHERE usr_email='email@delAdministrador.com';
+--------+
| usr_id |
+--------+
| 3 |
+--------+
1 row in set (0.00 sec)

Promocionar al usuario con id=3:

mysql> UPDATE `eventum_project_user` SET `pru_role` = '7' WHERE `pru_usr_id` = '3'  ;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0

En realidad todo se resume en cambiar el tipo de permiso de todas las ocurrencias del usuario a promocionar en la tabla eventum_project_user poniéndolas a 7

h1

Apache: error «Invalid command RewriteEngine» y redirección HTTP a HTTPS

20/07/2008

Revisión (octubre de 2026): el error Invalid command 'RewriteEngine' suele indicar que Apache no reconoce esa directiva en el contexto utilizado, por ejemplo porque el módulo correspondiente no está cargado. Verifica los módulos activos y la ubicación de las reglas antes de reiniciar.

Las directivas RewriteLog y RewriteLogLevel del ejemplo son históricas y no se utilizan de la misma forma en Apache 2.4. Para redireccionar HTTP a HTTPS, revisa el virtual host, certificados, proxies y posibles bucles; prueba la configuración con apache2ctl configtest antes de recargarla. No presupongas que una regla antigua sirve para todos los sitios.

Relacionado: activar mod_rewrite y recargar Apache.


Si tras configurar un sitio con una redirección, por ejemplo uno que redireccione todo el tráfico http a https:

pilar002:/etc/apache2/sites-available# cat redir
NameVirtualHost *:80
RewriteEngine on
RewriteLog /var/log/apache2/https_rewrite.log
RewriteLogLevel 1
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^/(.*) https://%{SERVER_NAME}/$1 [L,R]

Fuente: http://crysol.inf-cr.uclm.es/node/198

Se produce el siguiente error:

pilar002:/etc/apache2/sites-available# /etc/init.d/apache2 restart
Forcing reload of web server (apache2)...Syntax error on line 3 of /etc/apache2/sites-enabled/redir:
Invalid command 'RewriteEngine', perhaps misspelled or defined by a module not included in the server configuration
failed!

La solución es tan sencilla como cargar el módulo de rewrite:
pilar002:/etc/apache2/mods-available# a2enmod rewrite
Module rewrite installed; run /etc/init.d/apache2 force-reload to enable.

h1

Generación de claves para SSL en Apache2 SIN «apache2-ssl-certificate»

20/07/2008

Update: Gracias a Boriel, se puede utilizar estas instrucciones más sencillas:
$ mkdir /etc/apache2/ssl
$ make-ssl-cert /usr/share/ssl-cert/ssleay.cnf /etc/apache2/ssl/server.pem

 

El script apache2-ssl-certificate ya no se incluye en el paquete de Apache2 de Debian, por lo que la habitual instrucción:

  • # apache2-ssl-certificate —force -days 365 -set_serial 2
    ó si ocurre:
    # apache2-ssl-certificate: command not found

    viene a ser sustituida por:

    # openssl genrsa -des3 -out server.key 1024
    # openssl rsa -in server.key -out server.pem
    # openssl req -new -key server.key -out server.csr
    # openssl x509 -req -days 360 -in server.csr -signkey server.key -out server.crt


    Opcional: para que no se pida la clave cada vez que se arranca el servidor:

    # mv key.pem key.pem.SEGURA #openssl rsa -in key.pem.SEGURA -out key.pem
h1

como instalar la impresora hp photosmart c6100 ó 6180 en Kubuntu

06/07/2008

La HP photosmart c6100 (ó c6180) no funciona por defecto en Kubuntu Hardy Heron. Es necesario instalar unas versión posterior de HPLIP. Para ello se desinstalará la versión actual, se descargará la última versión de la web de HPLIP y se ejecutará:

sudo apt-get remove --purge hpoj
chmod 777 hplip-2.8.6.run
./hplip-2.8.6.run

h1

Linux: identificar y terminar procesos de un usuario sin afectar a otros

05/06/2008

Advertencia (octubre de 2026): el comando original usa kill -9 sobre un conjunto de PID obtenido mediante filtros de texto. No lo ejecutes a ciegas: puede terminar procesos no deseados y causar pérdida de datos.

Para localizar procesos de un usuario, comienza por ps -u usuario -o pid,comm,args; para buscar una aplicación propia, utiliza pgrep -a -u usuario nombre. Comprueba los PID antes de enviar señales y, si es posible, intenta una finalización normal (SIGTERM) antes de recurrir a SIGKILL.

Relacionado: diagnóstico de procesos y archivos abiertos.


Como matar todos los procesos de un usuario o que cumplan una condición:

kill -9 `ps auxww | grep [nombre] | egrep -v grep | awk ‘{print $2}’`

h1

Cómo recargar Apache sin cortar las conexiones con graceful

07/05/2008

Actualización (2026): el mecanismo graceful permite a Apache realizar una recarga gradual, pero no garantiza ausencia absoluta de interrupciones en toda configuración o despliegue. Comprueba la configuración antes de la recarga, por ejemplo con apachectl configtest, y utiliza las rutas y el servicio de tu instalación, no necesariamente las del ejemplo de 2008.

Relacionado: administración de servidores y aplicaciones web.


En ocasiones, sobre todo en entornos de producción, es necesario reiniciar Apache sin pérdida de servicio (en caliente) para utilizar una configuración distinta (httpd.conf), de modo que siga atendiendo peticiones constantemente y los usuarios no lo noten.

Para ello se puede utilizar la opción «graceful».

$ /usr/local/apache2/bin/apachectl -f /export/home/usuario/apache/conf/httpd_NUEVA.conf -k graceful

De este modo Apache toma como configuración «httpd_NUEVA.conf» como nueva configuración para las posteriores peticiones, mientras que para los presentes forks se continuará utilizando la antigua. De este modo se puede reiniciar Apache sin pérdida de servicio. Además, la opción graceful chequea la validez del nuevo fichero httpd.conf, de modo que si no es aceptable las peticiones se seguirán atendiendo con la config antigua, aumentando la calidad y fiabilidad del servicio.

Además, previamente se puede chequear la validez del archivo mediante «apachectl configtest»

Otros artículos relacionados: Revisar la configuración PHP de Joomla