Si eres un administrador de sistemas UNIX para cualquier número de servidores, necesitas construirte una caja de saltos de Linux secure shell (SSH). Hágalo ahora! Tener una ubicación centralizada que puedes usar para «saltar» rápidamente a cualquier caja ahorra un montón de tiempo. No sólo eso, abre oportunidades para acelerar las tareas repetitivas, e incluso automatizar las tareas.
Aquí describiré algunas de las cosas que he incorporado en mi SSH Jumpbox, incluyendo algunos guiones que puedes poner a trabajar por ti mismo de inmediato.

Llaves SSH
Todo comienza con las llaves de SSH.
SSH puede usar un conjunto de claves privadas/públicas para autentificar su sesión. Tu clave privada residirá en tu Jumpbox, y tu clave pública será copiada a cada uno de los servidores objetivo que vas a administrar.
En lugar de utilizar su contraseña UNIX en esos servidores (que puede que no sean todos iguales), utilizará una única frase de contraseña que acompañe a su clave privada para realizar la autenticación. Incluso puedes aprovechar el Agente de Autenticación SSH para que sólo tengas que teclear esa frase de contraseña un par de veces a lo largo del día.
Para generar la clave, sólo tienes que usar el comando «ssh-keygen».
[[correo electrónico protegido] ~]$ ssh-keygenGenerar par de claves rsa públicas/privadas.Introducir archivo en el que guardar la clave (/home/me/.ssh/id_rsa): {ACCEPT DEFAULT}Directorio creado $0027/home/me/.ssh$0027.Introducir frase de contraseña (vacía para ninguna frase de contraseña): {YOUR PASSPHRASE}Introducir la misma frase de contraseña de nuevo: Su identificación ha sido guardada en /home/me/.ssh/id_rsa. Su clave pública ha sido guardada en /home/me/.ssh/id_rsa.pub. La huella digital de la clave es:3d:84:37:43:59:05:ca:e6:2d:59:de:90:36:06:17:24 [correo electrónico protegido]
Echemos un vistazo más de cerca a lo que esto creó:
[[correo electrónico protegido] ~]$ ls -l ${HOME}/.sshtotal 8-rw-------. 1 me me 1743 Jun 26 14:14 id_rsa-rw-r--r--. 1 me me 390 Jun 26 14:14 id_rsa.pub
En tu directorio principal, ahora tendrás un directorio «.ssh». En ese directorio tendrás dos archivos. «id_rsa» es la clave privada que permanecerá en la caja de saltos. «id_rsa.pub» es la clave pública que copiarás en los servidores de destino.
Ahora es el momento de subir la clave privada a su servidor de destino. La forma más fácil de hacerlo es usando «sftp».
[[correo electrónico protegido] ~]$ sftp [correo electrónico protegido]Conectando con el objetivo...La autenticidad del objetivo del host (x.x.x.x)$0027 no puede ser establecida.La huella digital de la clave RSA es 40:4b:f7:f3:a1:da:dc:59:9c:19:d5:e3:21:f8:a9:ea.¿Está seguro de que quiere continuar conectando (sí/no)? síAdvertencia: Añadido permanentemente target,x.x.x.x (RSA) a la lista de hosts conocidos. Contraseña de [email protected]: {YOUR PASSWORD}sftp> mkdir .sshsftp ]; chmod 700 .sshModo de cambio en /home/me/.sshsftp ]; put . ssh/id_rsa.pub .ssh/authorized_keysSubir .ssh/id_rsa.pub a /home/me/.ssh/authorized_keyssftp> chmod 600 .ssh/authorized_keysCambiar modo en /home/me/.ssh/authorized_keyssftp> quit
Así que, pasando por los comandos de arriba:
Si es la primera vez que te conectas a este host, SFTP te preguntará si confías en este host.
A continuación, se le pedirá que proporcione su contraseña UNIX para autenticarse. Con suerte, esta es la última vez que tendrás que escribir esa contraseña.
Ahora creará el directorio .ssh (mkdir .ssh) y bloqueará los permisos (chmod 700 .ssh) en ese directorio para que sólo este usuario pueda ver los archivos de ese directorio.
A continuación, subirá la clave pública discutida anteriormente y la almacenará como un archivo authorized_keys (put .ssh/id_rsa.pub .ssh/authorized_keys). Lo bloqueará para que sólo este usuario pueda ver y alterar este archivo (chmod 600 .ssh/authorized_keys).
ADVERTENCIA:
Si ya tienes un archivo authorized_keys , entonces añade tu nueva clave al archivo existente authorized_keys en lugar de sobrescribirlo. SFTP el archivo hasta su servidor con un nombre diferente. Luego inicia sesión en un shell para agregar el contenido de tu nuevo archivo al archivo original.
Eso debería ser todo lo que necesitas hacer. Ahora, pruebe su configuración.
[[correo electrónico protegido] ~]$ ssh [correo electrónico protegido]Introduzca la frase de contraseña para la clave $0027/home/me/.ssh/id_rsa$0027: {YOUR PASSPHRASE}[[correo electrónico protegido] ~]$exit[[correo electrónico protegido] ~]$
Si no funcionara, la sección de solución de problemas al final de este artículo podría serle útil.
Opciones de configuración de SSH
Hay algunas opciones comunes de clientes de SSH que tal vez quieras considerar.
EscapeChar @
SSH proporciona un mecanismo de «escape» que le permite interactuar con el cliente de SSH desde una sesión activa. El uso más común de esto sería matar la sesión actual si por alguna razón tu shell se cuelga.
El carácter de escape por defecto es un tilde (~). Un problema: ese es el personaje de escape por defecto para «punta» en Solaris, y para algunas herramientas de manejo de apagado de luces. Si estás ejecutando varias herramientas, no sabrás qué herramienta atrapará primero al personaje de escape.
La solución es cambiar tu personaje de escape de SSH a algo único. Me gusta usar «@». Ninguna otra herramienta que yo conozca usa eso. Ahora, si tu sesión se cuelga, simplemente presiona » @». » y, dejarás caer tu conexión. También puedes pulsar » @? » para ver qué otras opciones están disponibles para ti.
ForwardX11 sí
Necesitarás reenviar el tráfico de X11 para poder abrir ventanas gráficas del servidor de destino. Habrá más sobre este tema más tarde.
StrictHostKeyChecking no
El cliente de SSH mantiene un caché de claves públicas del host. Cuando te conectes a nuevos hosts, se te pedirá regularmente que añadas entradas al archivo known_hosts . Desactiva esta opción y SSH guardará automáticamente estas entradas en la caché sin preguntarte primero.
Todas estas opciones están disponibles desde la línea de comando usando la opción -o.
Porque los usarás una y otra vez, guárdalos en el archivo de configuración del cliente SSH.
Querrás guardarlos en ${HOME}/.ssh/config .
También tendrás que cambiar el permiso del archivo para que sólo tú puedas acceder a él: chmod 600 ${HOME}/.ssh/config .
Agente de autenticación de SSH (ssh-agent)
La siguiente característica útil es el Agente de Autenticación de SSH. La idea aquí es cargar su clave SSH (es decir, introducir su frase de contraseña sólo una vez), y luego usar esa clave para establecer nuevas sesiones.
Aquí hay una sesión de muestra:
[[correo electrónico protegido] ~]$ ssh-agentSSH_AUTH_SOCK=/tmp/ssh-jVTDW14623/agent.14623; exportar SSH_AUTH_SOCK;SSH_AGENT_PID=14624; exportar SSH_AGENT_PID;echo Agent pid 14624;[[correo electrónico protegido] ~] SSH_AUTH_SOCK=/tmp/ssh-jVTDW14623/agent.14623[[correo electrónico protegido] ~] exportar SSH_AUTH_SOCK[[correo electrónico protegido] ~] SSH_AGENT_PID=14624[[correo electrónico protegido] ~] exportar SSH_AGENT_PID[[correo electrónico protegido] ~]$ ssh-add -t 14400Introducir frase de contraseña para /home/me/.ssh/id_rsa: {YOUR PASSPHRASE}Identidad añadida: /home/me/.ssh/id_rsa (/home/me/.ssh/id_rsa)Tiempo de vida configurado a 14400 segundos [[email protegido] ~]$ ssh [email protegido]Último acceso: Thu Jun 27 12:58:16 2013 desde la caja de saltos[[email protegido] ~]$exit[[email protegido] ~]
Hagamos la transacción.
El comando «ssh-agent» pone en marcha al agente. Informa al usuario de dónde se está ejecutando dándonos algunas variables de entorno para cargar en el shell. Establece esas variables como detalladas por la salida del agente.
A continuación, cargue nuestra clave privada actual y su frase de contraseña. Se almacenará en el agente. La opción -t establece el «tiempo de vida» de la clave. Mi preferencia es un tiempo de vida de cuatro horas (4 horas * 60 minutos/hora * 60 segundos/minuto = 14.440 segundos). Esto significa que se te pide una llave cuando empiezas el día, y otra vez cuando vuelves de comer.
Inicie una sesión que utilice esa tecla. Fíjese que no pidió una frase de contraseña. Recuperó esa información del agente.
El guión de ssh2host
Aquí hay un guión que une todo esto. En la primera ejecución, inicia el Agente de Autenticación SSH, carga su clave privada en la memoria, y luego inicia una sesión SSH al cliente. En ejecuciones posteriores, se conecta al agente existente y a las claves que ha cargado, así que no se te pedirá la contraseña de nuevo.
Pero aquí está lo más interesante. Crea enlaces duros a este script con nombres que coinciden con los de los hosts de destino (y se asegura de que esos archivos estén en la ruta del sistema). Ahora puedes enviar SSH a estos sistemas simplemente escribiendo su nombre.
#!/bin/bash############################################################################################################################################################################### Tratará de ssh a # un cliente con ese nombre. (En ssh2host target) ####################################################### Donde almacenar y leer información sobre el agente actual.SSH_AGENT_INFO=${HOME}/. ssh_agent_info [ -f${SSH_AGENT_INFO} ] && . ${SSH_AGENT_INFO}>/dev/null # El SSH_AGENT_PID debe tener el PID del agente actual. # Y sólo debería haber un agente ssh corriendo con ese PID.ALL_GOOD=YES # Asume que todo está bien para empezar.si [ !-n «${SSH_AGENT_PID}» ] # La variable no está establecida.entonces ALL_GOOD=NO else# El agente ssh no está corriendo. si [ «ps -ef | grep «ssh-agent»| grep «${SSH_AGENT_PID}»||| grep -v grep | wc -l` -ne1 ] entonces ALL_GOOD=NO fi fi # Si tenemos problemas – arranca el ssh-agent. [ «${ALL_GOOD}»=»NO» ] &&/usr/bin/ssh-agent>${SSH_AGENT_INFO}&& . ${SSH_AGENT_INFO}>/dev/null # ¿Está cargada la llave? Si no, cárgala ahora. /usr/bin/ssh-add -l>/dev/null [ $?-ne0 ] &&/usr/bin/ssh-add -t 14400# Hora de iniciar la sesión SSH al host../usr/bin/ssh -X -e @-o StrictHostKeyChecking=no `nombre base $0`
Este es el guión en acción. Mi servidor objetivo se llama «objetivo».
[[correo electrónico protegido] ~]$ targetEntre la frase de contraseña para /home/me/.ssh/id_rsa: {ENTER PASSPHRASE}Identidad añadida: /home/me/.ssh/id_rsa (/home/me/.ssh/id_rsa)Tiempo de vida configurado a 14400 segundosÚltimo acceso: Thu Jun 27 16:36:13 2013 desde el objetivo[[email protegido] ~]$exitlogoutConexión al objetivo cerrada.[[email protegido] ~]$ targetÚltimo acceso: Thu Jun 27 16:36:44 2013 from target[[email protected] ~]$exitlogoutConexión al objetivo cerrada.
Solución de problemas:
Llaves de huésped caducadas
Echa un vistazo a los archivos en tu directorio .ssh. Notarás que ahora tienes un archivo known_hosts . Aquí es donde se almacenan las claves del host de destino.
[[correo electrónico protegido] ~]$ ls -l ${HOME}/.sshtotal 12-rw-------. 1 me me 1743 Jun 26 15:17 id_rsa-rw-r--r--. 1 me me 390 Jun 26 15:17 id_rsa.pub-rw-r--r--. 1 me me 790 Jun 26 15:27 known_hosts
Si cambias la IP en un servidor, o si reinstalas el SO en un servidor, es muy probable que acabes con discrepancias en tu archivo known_hosts , y se te presentará el siguiente mensaje de error amenazador durante el inicio de sesión. Si estás seguro de que no hay nada sospechoso, simplemente edita el archivo known_hosts y elimina la línea ofensiva identificada en el mensaje de error.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ADVERTENCIA: LA IDENTIFICACIÓN DEL ANFITRIÓN A DISTANCIA HA CAMBIADO! ¡ES POSIBLE QUE ALGUIEN ESTÉ HACIENDO ALGO NATURAL! ¡Alguien podría estar espiándote ahora mismo (ataque de hombre en medio)! También es posible que la clave RSA del host haya sido cambiada. La huella de la clave RSA enviada por el host remoto es 40:4b:f7:f3:a1:da:dc:59:9c:19:d5:e3:21:f8:a9:ea. Póngase en contacto con el administrador del sistema.Añada la clave correcta del host en /home/me/.ssh/known_hosts para deshacerse de este mensaje.la clave ofensiva en /home/me/.ssh/known_hosts:2La autenticación de la contraseña está desactivada para evitar ataques man-in-the-middle.la autenticación interactiva del teclado está desactivada para evitar ataques man-in-the-middle.el reenvío X11 está desactivado para evitar ataques man-in-the-middle.
Cuestiones de DNS
Si después de ejecutar el comando SSH, la conexión se establece, pero toma un minuto más o menos para llegar a cualquier parte, busque los problemas de DNS.
Asegúrate de que tanto tu Jumpbox como tus servidores de destino estén correctamente configurados (tanto hacia adelante como hacia atrás) en tu servidor DNS. Si esto no es posible, entonces falsifique el DNS poniendo IP$0027s en /etc/hosts tanto en el Jumpbox como en el servidor objetivo.
También puedes ver cómo deshabilitar el DNS del demonio SSH en el servidor de destino. (Busca la entrada «UseDNS» en el archivo /etc/ssh/sshd_config en tu servidor de destino).
Cortafuegos del lado del anfitrión
Las tablas IP están habilitadas en la mayoría de los sistemas Linux. Necesitarás abrir el puerto SSH en el servidor de destino para asegurarte de que el tráfico SSH pueda entrar en tu servidor de destino.
/sbin/iptables -A INPUT -p tcp –dport 22 -j ACCEPT
Otro método común para restringir el acceso a los servidores de destino es el TCP Wrappers. Si eso está habilitado en tu servidor de destino, deberías añadir una entrada a tu archivo hosts.allow para el protocolo SSH.
eco «sshd»: TODOS»>> /etc/hosts.allow
Permisos de archivo
A SSH le gusta que sus archivos de configuración estén bloqueados. Los modos de archivos y directorios deben ser configurados de manera que no se concedan permisos de «grupo» u «otros».
chmod -R go= ${HOME}/.ssh
También puedes mirar el demonio SSH en tu servidor de destino y desactivar la directiva «StrictModes» en el archivo /etc/ssh/sshd_config .
Inicios de sesión de la raíz
Se desaconseja el acceso directo a la raíz como práctica general por razones de seguridad. Sin embargo, esa es una práctica que suelo ignorar para poder hacer otras cosas interesantes.
Si quieres entrar como root directamente, busca la directiva «PermitRoot» en el archivo /etc/ssh/sshd_config de tu servidor de destino. Recomiendo la configuración «sin contraseña». Esto le permitirá iniciar sesión con un par de claves privadas/públicas, y aún así evitará el acceso directo de root con nombre de usuario/contraseña.
¿Listo para probar tus habilidades en Unix? Mira cómo se acumulan con esta evaluación de Smarterer. Comienza este test de Unix ahora
Contenidos
- Llaves SSH
- Opciones de configuración de SSH
- EscapeChar @
- ForwardX11 sí
- StrictHostKeyChecking no
- Agente de autenticación de SSH (ssh-agent)
- El guión de ssh2host
- Solución de problemas:
- Llaves de huésped caducadas
- Cuestiones de DNS
- Cortafuegos del lado del anfitrión
- Permisos de archivo
- Inicios de sesión de la raíz