- Estréllate y Arde - https://www.estrellateyarde.org -
Conexión remota segura en Linux: SSH
SSH (Secure SHell) es un protocolo similar a Telnet que permite abrir un shell en una máquina remota, con la diferencia de que SSH encripta toda la información que viaja por la red utilizando criptografía híbrida. Este procolo se implementa con arquitectura cliente-servidor, por lo que necesita:
En Linux se utiliza la implementación SSH de OpenBSD, denominada OpenSSH (openssh.com/es/, paquetes openssh-server openssh-client), que proporciona varias aplicaciones:
Recursos
Veamos detallamente cómo funciona una conexión SSH:
$ ssh usuario@servidor
Podemos utilizar la IP o el nombre del servidor. Si no especificamos el usuario, utilizará el usuario que está realizando la conexión. Por ejemplo, si el usuario francis desde la máquina asterix quiere conectarse a obelix como mario, ejecutará:
francis@asterix:~$ ssh mario@obelix
The authenticity of host obelix (192.168.1.3) can't be established. DSA key fingerprint is e9:df:72:2c:eb:1d:bf:b2:3a:38:96:2a:3b:6b Are you sure you want to continue connecting (yes/no)?
Para confirmarlo el usuario debería obtener el fingerprint por otro medio alternativo y seguro: correo electrónico cifrado, por teléfono, correo postal, en persona, etc. Confirmar la clave sin verificarla adecuadamente implica asumir el riesgo de una posible suplantación. Si confiamos en la clave, le decimos al cliente que continúe con la conexión:
yes Warning: Permanently added obelix (DSA) to the list of known hosts.
Como hemos confiado en la clave pública recibida, el cliente nos informa de que ésta se ha añadido al archivo ~/.ssh/known_hosts, donde se almacenan los hosts conocidos. En adelante cada vez que el cliente se conecte a ese servidor comparará la clave pública recibida al iniciar sesión con la almacenada:
key_read failed The authenticity of host obelix (192.168.1.3) can't be established. DSA key fingerprint is e9:df:72:2c:eb:1d:bf:b2:3a:38:96:2a:3b:6b Are you sure you want to continue connecting (yes/no)?
mario@obelix's password:
Si el login es válido y no hay restricciones adicionales obtendremos un shell en el servidor SSH, de modo que podremos usar el sistema como si estuviéramos sentados allí, con los privilegios que tenga ese usuario:
mario@obelix:~$
Identificación del cliente mediante clave pública
El cliente puede identificarse mediante clave pública, sin password. Para ello:
- creamos en el cliente una clave RSA:
francis@asterix:~$ ssh-keygen -t rsa -f ~/.ssh/id_rsa
- activamos ssh-agent en el cliente para que no nos pida la pass-phrase:
francis@asterix:~$ eval `ssh-agent -s` Agent pid 12297 francis@asterix:~$ ssh-add Enter passphrase for /home/francis/.ssh/id_rsa: Identity added: /home/francis/.ssh/id_rsa (/home/francis/.ssh/id_rsa)
- copiamos en el servidor la clave pública (~/.ssh/id_rsa.pub):
francis@asterix:~$ scp ~/.ssh/id_rsa.pub mario@obelix:~/.ssh/id_rsa.pub
- la añadimos en el servidor al final del fichero ~/.ssh/authorized_keys:
mario@obelix:~$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
- y comprobamos que podemos iniciar una sesión SSH sin password ni pass-phrase:
francis@asterix:~$ ssh mario@obelix
mario@obelix:~$
mario@obelix:~$ exit
logout
Connection to obelix closed
francis@asterix:~$
En vez de obtener un shell en la máquina remota, podemos simplemente ejecutar un comando en ella. Para ello, usaremos el cliente SSH con la siguiente sintaxis:
$ ssh usuario@servidor "comando"
Usaremos comillas dobles para evitar que el cliente interprete el comando. Una vez introducido el password se ejecutará el comando, retornando directamente al shell de la máquina cliente. Por ejemplo:
francis@asterix:~$ ssh mario@obelix "cat /etc/hostname"
mario@obelix's password:
obelix
francis@asterix:~$
El comando scp (secure copy) nos permite intercambiar ficheros o directorios (tanto enviar como recibir) entre el cliente y el servidor utilizando SSH. Para copiar recursivamente un directorio usaremos la opción -r. La sintaxis es:
$ scp origen destino
$ scp archivo_local usuario@servidor:directorio_remoto
Por ejemplo:
francis@asterix:~$ scp file1 mario@obelix:/home/mario/
$ scp usuario@servidor:archivo_remoto directorio_local
Por ejemplo:
francis@asterix:~$ scp mario@obelix:/home/mario/file2 ./
En ambos casos nos pedirá el password. Introducimos la contraseña y se copiará el archivo, retornando directamente al shell de la máquina cliente:
Password: file1 100% 2837 KB 702.7 KB/s 00:06 mario@pc266:~$
OpenSSH incluye un servidor SFTP que permite enviar y recibir ficheros utilizando SSH: es un servidor FTP encriptado. Cuando un cliente SFTP se conecta al servidor SSH bajo el esquema sftp://, el servidor SSH lanza el proceso hijo sftp-server, que pide el password y establece la conexión.
OpenSSH incluye también un cliente SFTP interactivo de línea de comandos, sftp, que utiliza los mismos comandos que ftp (cd, lcd, get, put, mkdir...) y cuya sintaxis es:
$ sftp usuario@servidor
sftp>
Pero es mucho más cómodo conectar desde un cliente SFTP gráfico como Konqueror:
Con OpenSSH se puede crear un túnel encriptado entre dos máquinas y enviar a través de él los datos de otros protocolos (es un tipo de VPN, Virtual Private Network, Red Privada Virtual). Esto es útil, por ejemplo:
El único requisito para configurar un túnel SSH es que sea un protocolo basado en TCP, por lo que este método no se puede aplicar a servicios UDP como DHCP, NFS, NetBIOS, etc.
Vamos a verlo con un ejemplo. Desde el cliente queremos hacer consultas al servidor de base de datos MySQL instalado en el servidor. Pero MySQL no soporta conexiones seguras entre los clientes y el servidor, de manera que la identificación de los usuarios remotos y los datos de las consultas serán visibles a cualquier máquina de la red. Por ello, utilizaremos SSH para establecer una conexión segura, de la siguiente manera:
Veamos cuál es el procedimiento a seguir:
[mysqld] #skip-networking bind-address = 127.0.0.1 port = 5000
Una vez reiniciado el servidor MySQL, sólo podremos conectar con la base de datos desde localhost, en la máquina local.
francis@asterix:~$ ssh -N -L 3306:127.0.0.1:5000 usuario@servidor
Password:
francis@asterix:~$ mysql -u root -h 127.0.0.1 -p test
Enter password:
mysql>
El cliente SSH Putty (chiark.greenend.org.uk/~sgtatham/putty/) nos permitirá conectar con un servidor SSH Linux desde Windows.
Article printed from Estréllate y Arde: https://www.estrellateyarde.org
URL to article: https://www.estrellateyarde.org/discover/ssh
Click here to print.
Copyright © 2010 Estrellate y Arde