SSH Cliente
OpenSSH es hoy día la forma habitual de administrar un servidor con Linux; nos brinda tanto las prestaciones de seguridad de red, como las limitaciones de acceso a recursos y las ventajas de automatización de los procesos de administración. En definitiva, un administrador de servidores con Linux que domine SSH va a tener muchas ventajas para el desempeño de sus tareas, frente al que no tiene dominio de esta herramienta.
Cliente - Servidor
Para entender OpenSSH hay que tener en cuenta que hablamos de una tecnología cliente-servidor. Como servidor, el SSH es un servicio (daemon) que correo en el sistema y el programa es el sshd, ese daemon está esperando conexiones de los clientes. Como cliente, es el programa ssh, que invoca el usuario cuando se desea hacer una conexión a una máquina que tiene corriendo el servidor SSH.
En este capítulo trataremos a fondo el cliente SSH y veremos como utilizarlo para los procesos de administración. En otro capítulo estará contemplado el servidor, pero eso más adelante.
Uso básico del comando ssh
Para conectarse a un servidor se utiliza ssh servidor
(o su IP)
ssh 192.168.0.23
pero en este caso ssh asume varias cosas por defecto:
- puerto de conexión (por defecto utiliza el tcp/22)
- usuario en el servidor remoto (por defecto será el mismo nombre que el usuario que inicia la conexión en la máquina local, es decir, si Ud. es
martin
en su máquina local, el servidor le estará pidiendo la clave demartin
en remoto, aunque ese usuario no exista allí, en cuyo caso no podrá acceder) - certificado RSA que se ofrecerá al destino para validar el acceso (por defecto, se utilizará el certificado
~/.ssh/id_rsa
)
Entonces, es posible comenzar a modificar la forma por defecto que se conecta ssh a un servidor pasándole parámetros:
ssh -i ~/.ssh/otro_cert_rsa -p 331 jose@192.168.0.23
En el ejemplo anterior, se fuerza un certificado (-i IdentityFile), un puerto (-p Port) y un usuario válido en el remoto (jose, también podría usarse -l jose
para no usar el arroba)
Automatizando la conexion SSH
Algnas veces nos ha tocado escribir líneas de ssh bastante complejas, como por ejemplo:
ssh -1 -p 23 -l root -i /etc/ssh/key01 -o CheckHostIP=no 192.134.27.24
que realmente terminan siendo un incordio, cuando esa conexión debe ser vuelta a realizar para repetir tareas de administración remota. En esta sección abordamos cómo hacer para crear un perfil de conexión que simplifique al máximo la linea de comandos de ssh.
El nombre
Escribir la IP 192.134.27.24 cada vez que me conecto es antidiluviano y no escala a IPv6. Así que lo ideal es disponer de un DNS bien configurado al cuál recurrir.
También, muchas veces se asignan nombres a las máquinas que resultan más difíciles de recordar que la propia dirección IPv4, algo como por ejemplo: sssd2p1r3db.sss.com
, que significa sss
es el nombre de la empresa, datacenter 2, piso 1, rack 3, db
pues es el server de base de datos. Fantástico para algun informe y la consultoría! pero cómo recordarlo? y terminamos utilizando la vieja y querida IP.
Así que llamemos a nuestro servidor 192.134.27.24 sssd2p1r3db
como tito (o cualquier otro nombre que me resulte fácil de recordar)
Para que funcione el ssh a tito debo llegar a la IP. Y esta tarea de personalización de los nombres en la red la hace el archivo /etc/hosts
. Edito el archivo y agrego:
# Servidor sssd2p3r3db 192.134.27.24 tito
A partir de ahora, todo lo que yo haga a nivel de red con el nombre tito
va a funcionar desde ssh tito
, ping tito
, hasta http://tito
en el Firefox.
Las opciones ssh
Las opciones del ssh que son necesarias para esta conexión de ejemplo son: -1 -p 23 -l root -i /etc/ssh/key01 -o CheckHostIP=no, que no es necesario explicar su significado, pues todas estas opciones están a un man de distancia.
El archivo que permite automatizar todo esto para todos los usuarios es /etc/ssh/ssh_config y para un usuario en específico es el archivo $HOME/.ssh/config. Edito el archivo y creo una entrada Host acorde a mis necesidades:
Host tito Protocol 1 Port 23 User root IdentityFile /etc/ssh/key01 CheckHostIP no
Y ya está!
Ahora puedo escribir ssh tito y mi conexión va a ser realizada exactamente como si escribiera toda la linea del principio.
Solo una aclaración: la sentencia Host funciona por string, es decir que si escribo ssh 192.134.27.24 no va a producir el mismo efecto de levantar los datos del ssh_config, aunque me esté conectando al mismo servidor.
Bash completion
Y por último, hacer que mi Bash permita usar tabulador para los nombres caprichozos y fáciles que he colocado a mis servidores… porque?, a ver: nadie pretende que me acuerde que el server se llama “tito”, es mucho más acordarme que empieza con “t” y sigue con “algo” ;)
Edito ~/.bashrc y agrego:
_completossh () { actual=${COMP_WORDS[COMP_CWORD]}; COMPREPLY=($(compgen -W ‘$(cat /etc/ssh/config | grep “^Host\b” – | sed -e “s/Host //”)’ — $actual)) } complete -F _completossh ssh
Y ahora puedo escribir ssh t + tabulador, y me completará “tito”. Y si tengo más de un servidor que comience con “t” pues dar dos veces tabulador y me muestra la lista.
Validar Certificado del servidor
Error de certificado al conectar
Este capítulo debe contener:
- crear certificado de usuario
- mandar certificado al servidor
- cambiar passphrasse
- correr comandos en el servidor por ssh y pipe
- SSH comandos con BatchMode
- Multiples conexiones: SSH Control Master
- Multiples conexiones: screen (básico)
- SCP (y scp -B)