Contenidos
En este documento vamos a trabajar con ssh como herramienta para la conexión remota a sistemas a través de comandos. Utilizaremos un sistema GNU/Linux Debian 12 sin interfaz gráfica de usuario como servidor remoto al que nos conectaremos para realizar tareas de administración a través de ssh. Usaremos como hipervisor VirtualBox con una máquina virtual conectada a una Red NAT que estamos utilizando en nuestro banco de pruebas de casos prácticos.
¿Qué es Secure Shell?
SSH es un protocolo de red de nivel de aplicación que permite la conexión entre sistemas remotos de forma segura en redes no seguras utilizando técnicas de cifrado de mensajes de extremo a extremo.
Para que el protocolo funcione necesita una aplicación servidora, que será la que reciba peticiones de red y una aplicación cliente que será la que permita conectarse a la aplicación servidora y poder utilizar los servicios que proporciona la aplicación a través de SSH.
Los servicios, básicamente, son los de poder iniciar sesión con una terminal de forma segura en un sistema remoto. La comunicación entre sistemas remotos se cifra extremo a extremo con lo que se garantiza seguridad en la comunicación aún cuando nos conectemos utilizando una red no segura como puede ser Internet.
Este servicio se utiliza sobre todo para conectar con sistemas Unix-Like remotos, es decir sistemas basados en GNU/Linux, Unix o FreeBSD, aunque existen implementaciones de servidores SSH para otros sistemas operativos como Windows.
La suite de herramientas de ssh más utilizada es la proporcionada por OpenSSH. Dentro de esta suite nos encontramos con las herramientas: ssh, scp y sftp, que nos permitirán iniciar una sesión segura en un sistema remoto, copiar ficheros y conectarnos a un servidor FTP todo ello de forma segura gracias al cifrado.
Cliente ssh
Existen clientes ssh para varios sistemas operativos. Para distribuciones de GNU/Linux podemos utilizar el cliente openSSH. De hecho, en la mayoría de distribuciones GNU/Linux viene instalado el paquete openSSH Client por defecto. Para ejecutarlo tan solo tenemos que escribir ssh en la terminal de bash.
Si queremos, podemos consultar más ayuda en la página de manual de ssh.
Para sistemas Windows tenemos la opción de utilizar la aplicación PuTTY. https://www.putty.org/
Servidor ssh
Para que un sistema acepte peticiones de conexión remotas a través de SSH necesita estar ejecutando un servidor SSH. Podemos instalar el servidor OpenSSH en nuestros sistema GNU/Linux utilizando la herramienta apt e instalar el paquete openssh-server.
Para ver cómo funciona todo el proceso de conexión lo ideal es probarlo. Para ello, a continuación se proporcionan una serie de casos prácticos a través de los cuales instalaremos servidores SSH en nuestros sistemas, servidores principalmente, y utilizaremos clientes ssh para conectarnos a ellos.
Casos prácticos
- Instalando servidor SSH en un sistema GNU/Linux Debian 12
- Accediendo a un sistema remoto con SSH desde GNU/Linux Debian 12
- Accediendo a un sistema remoto con SSH desde Windows 10
- Generar y almacenar contraseña de acceso RSA
- Copiando ficheros de forma segura con scp
- Configurar el servidor y el cliente SSH
- Gestión de conexiones
- Configurar el servidor y el cliente SSH: Gestión de usuarios y grupos
Cliente ssh en GNU/Linux
Por defecto el cliente ssh viene instalado en la mayoría de las distribuciones de Linux. El cliente se implementa en el comando ssh.
alumno@alumno-server:~$ ssh
usage: ssh -1246AaCfgKkMNnqsTtVvXxY -b bind_address -c cipher_spec
[-D bind_address:port] -e escape_char -F configfile
-i identity_file [-L bind_address:port:host:hostport]
-l login_name -m mac_spec -O ctl_cmd -o option -p port
[-R bind_address:port:host:hostport] -S ctl_path
[-w local_tun:remote_tun] user@hostname command
Si queremos obtener ayuda sobre como usar este comando, podemos consultar la ayuda.
alumno@alumno-server:~$ man ssh
Conexión a un host remoto
Para conectarse a un host remoto bastará con pasar como parámetro al comando ssh el nombre o dirección IP del host remoto.
alumno@alumno-server:~$ ssh 192.168.1.1
alumno@192.168.1.1’s password:
Si no se especifica ningún usuario, ssh tratará de conectarse utilizando el usuario actual en el host local. En el ejemplo, tratará de iniciar sesión en 192.168.1.1 con el usuario «alumno».
Si queremos iniciar sesión con un usuario determinado, debemos pasar en el parámetro el nombre de dicho usuario. Según la sintaxis del comando: user@hostname. Supongamos que queremos iniciar sesión con el usuario javier.
alumno@alumno-server:~$ ssh javier@192.168.1.1
javier@192.168.1.1’s password:
Linux SMR-Server00 2.6.31-22-server #70-Ubuntu SMP Thu Dec 2 00:00:57 UTC 2010 x86_64
javier@SMR-Server00:~$ whoami
javier
javier@SMR-Server00:~$ who
javier pts/0 2011-02-22 11:09 (192.168.1.230)
Cerrar una sesión remota
Se utiliza el comando exit.
javier@SMR-Server00:~$ exit
logout
Connection to 192.168.1.1 closed.
Ejecutar un comando remoto
También se puede ejecutar un solo comando en un host remoto con ssh. Veamos la parte de la sintaxis que nos interesa: ssh user@hostname command
alumno@alumno-server:~$ ssh javier@192.168.1.1 «ls -l»
Con esto, se inicia la sesión en la máquina remota, se ejecuta el comando y se termina la sesión.
Iniciar sesión remota con soporte para X-Windows
Ssh permite iniciar sesion y ejecutar comandos en modo texto. ¿Qué sucede si se desea ejecutar una aplicación con interfaz gráfica de X-Windows?.
ssh -X user@hostname command
Por supuesto, en el host destino deberá estar instalado el servidor X-Windows (interfaz gráfica).
Servidor ssh
La implementación libre del servidor SSH disponible para GNU/Linux está implementada en el paquete OpenSSH. Para instalar este paquete utilizamos apt-get.
alumno@alumno-server:~$ sudo apt-get install openssh-server
Proceso de OpenSSH
Vamos a comprobar el proceso que utiliza el servidor OpenSSH.
alumno@alumno-server:~$ ps -A | grep ssh
4743 ? 00:00:00 sshd
El servidor ssh se implementa con el demonio sshd. Podemos comprobar si el servidor está activo mostrando los procesos cuyo nombre sean sshd.
Script de control del servidor OpenSSH
El script de control del servidor ssh es ssh, que está en /etc/init.d/
alumno@alumno-server:~$ /etc/init.d/ssh
* Usage: /etc/init.d/ssh {start|stop|reload|force-reload|restart|try-restart}
Parar el servicio
Si se para el servicio, no se permiten nuevas conexiones. Sin embargo, las conexiones iniciadas, siguen funcionando.
alumno@alumno-server:~$ who
alumno tty7 2010-12-13 10:06 (:0)
alumno pts/0 2011-02-11 13:15 (:0.0)
alumno pts/1 2011-02-11 13:36 (:0.0)
alumno pts/2 2011-02-18 12:42 (:0.0)
ser pts/3 2011-02-22 11:35 (192.168.1.230)
ser pts/4 2011-02-22 11:35 (192.168.1.240)
ser pts/5 2011-02-22 11:35 (smr00-4.local)
ser pts/6 2011-02-22 11:36 (smr00-10.local)
ser pts/7 2011-02-22 11:36 (smr00-8.local)
ser pts/8 2011-02-22 11:36 (smr00-11.local)
alumno@alumno-server:~$ sudo /etc/init.d/ssh stop
sudo password for alumno:
* Stopping OpenBSD Secure Shell server sshd OK
Si comprobamos, las conexiones siguen activas:
alumno@alumno-server:~$ ps -A | grep ssh
24575 pts/2 00:00:00 ssh
24576 ? 00:00:00 sshd
24579 ? 00:00:00 sshd
24654 ? 00:00:00 sshd
24656 ? 00:00:00 sshd
24729 ? 00:00:00 sshd
24804 ? 00:00:00 sshd
24806 ? 00:00:00 sshd
24808 ? 00:00:00 sshd
24850 ? 00:00:00 sshd
24961 ? 00:00:00 sshd
25039 ? 00:00:00 sshd
25041 ? 00:00:00 sshd
25115 ? 00:00:00 sshd
25118 ? 00:00:00 sshd
alumno@alumno-server:~$ who
alumno tty7 2010-12-13 10:06 (:0)
alumno pts/0 2011-02-11 13:15 (:0.0)
alumno pts/1 2011-02-11 13:36 (:0.0)
alumno pts/2 2011-02-18 12:42 (:0.0)
ser pts/3 2011-02-22 11:35 (192.168.1.230)
ser pts/4 2011-02-22 11:35 (192.168.1.240)
ser pts/6 2011-02-22 11:36 (smr00-10.local)
ser pts/7 2011-02-22 11:36 (smr00-8.local)
ser pts/8 2011-02-22 11:36 (smr00-11.local)
ser pts/9 2011-02-22 11:36 (smr00-9.local)
ser pts/10 2011-02-22 11:36 (192.168.1.246)
Cerrar las sesiones remotas iniciadas
Para cerrar las sesiones iniciadas, podemos matar los procesos sshd que les están dando servicio.
alumno@alumno-server:~$ sudo killall sshd
alumno@alumno-server:~$ who
alumno tty7 2010-12-13 10:06 (:0)
alumno pts/0 2011-02-11 13:15 (:0.0)
alumno pts/1 2011-02-11 13:36 (:0.0)
alumno pts/2 2011-02-18 12:42 (:0.0)
Configuración del servidor OpenSSH
El fichero de configuración del servidor ssh se encuentra en el directorio /etc/ssh, su ruta es /etc/ssh/sshd_config. En este fichero se configura, a través de parámetros de configuración, los distintos aspectos del funcionamiento del servidor OpenSSH.
Si necesitamos ayuda sobre los parámetros de configuración del servidor SSH podemos consultar la ayuda.
man sshd_config
Vamos a analizar algunos de estos parámetros de configuración.
Configurar el puerto
Por defecto el protocolo SSH utiliza el puerto 22. Sin embargo, por motivos de seguridad, puede ser interesante cambiar este puerto a otro distinto. Para ello utilizamos el parámetro de configuración Port.
# What ports, IPs and protocols we listen for
Port 22
# Port <número de puerto>
Por ejemplo, podríamos utilizar el puerto 2200, cambiando el parámetro de configuración Port
Port 2200
De esta forma, se cambiaría el puerto que utilizará el servidor para recibir peticiones SSH de clientes al puerto 2200.
Control de usuarios (permitidos / denegados)
Por defecto, el servidor ssh permitirá que cualquier usuario en el sistema pueda iniciar una sesión remota utilziando ssh. Es decir, cualquier cuenta de usuario en el sistema podrá iniciar sesión tanto en local como en remoto.
Sin embargo, esto no es lo más adecuado, puesto que provoca un problema para la seguridad del sistema. Para evitar esto, el servidor ssh nos permite determinar que usuarios o grupos tienen permiso para iniciar sesión y/o que usuarios están denegados.
Tenemos cuatro directivas de configuración:
- DenyUsers. Deniega usuarios. Si se deniega un usuario, éste no podrá iniciar sesión remota.
- AllowUsers. Permite usuarios. Si se definen usuarios en este parámetro, solo estos usuarios podrán iniciar sesión remota. ¿qué pasa con el resto?, no pueden iniciar. Hay que tener cuidado si se utiliza esta directiva con AllowGroups.
- DenyGroups Deniega grupos. Si se deniega un grupo, ningún usuario de dicho grupo podrá acceder al sistema. Hay que tener cuidado si se usa con DenyUsers.
- AllowGroups. Permite grupos. Si se permite un grupo, todos los miembros del grupo podrán iniciar sesión remota. Hay que tener cuidado con AllowUsers.
Cada lista estará formada por nombres de usuarios / grupos, según el parámetro, separados por un espacio
Este es el orden en que se procesan. Hay que tener cuidado con la configuración, puesto que si utilizamos allowUsers, solo podrán iniciar sesión los usuarios que hayamos definido. Si después definimos AllowGroups, las directivas de configuración se sobreponen, es decir, solo podrán acceder los usuarios que estén a la vez en AllowUsers y en alguno de los grupos de AllowGroups.
Se pueden utilizar indistintamente, es decir, podemos utilizar un solo parámetro o combinaciones de los mismos. Pero es importante que lo comprendamos.
Ejemplo de conexión
alumno@alumno-server:~$ ssh albertohp@192.168.0.209
The authenticity of host ‘192.168.0.209 (192.168.0.209)’ can’t be established.
RSA key fingerprint is cd:33:a8:24:28:c0:f6:df:c0:b6:cc:32:e6:a0:94:c6.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘192.168.0.209’ (RSA) to the list of known hosts.
albertohp@192.168.0.209’s password:
Linux alumno-server 2.6.24-26-generic #1 SMP Tue Dec 1 18:37:31 UTC 2009 i686
The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.
To access official Ubuntu documentation, please visit:
albertohp@alumno-server:~$ ls
Examples infobadajoz
albertohp@alumno-server:~$ whoami
albertohp
albertohp@alumno-server:~$ ifconfig
eth3 Link encap:Ethernet direcciónHW 08:00:27:09:5e:78
inet dirección:192.168.0.209 Difusión:192.168.0.255 Máscara:255.255.255.0
dirección inet6: fe80::a00:27ff:fe09:5e78/64 Alcance:Vínculo
ARRIBA DIFUSIÓN CORRIENDO MULTICAST MTU:1500 Métrica:1
RX packets:85160 errors:0 dropped:0 overruns:0 frame:0
TX packets:13005 errors:0 dropped:0 overruns:0 carrier:0
colisiones:0 txqueuelen:1000
RX bytes:32093713 (30.6 MB) TX bytes:1148308 (1.0 MB)
Dirección base: 0xd010 Memoria:f0000000-f0020000
lo Link encap:Bucle local
inet dirección:127.0.0.1 Máscara:255.0.0.0
dirección inet6: ::1/128 Alcance:Anfitrión
ARRIBA LOOPBACK CORRIENDO MTU:16436 Métrica:1
RX packets:2200 errors:0 dropped:0 overruns:0 frame:0
TX packets:2200 errors:0 dropped:0 overruns:0 carrier:0
colisiones:0 txqueuelen:0
RX bytes:132231 (129.1 KB) TX bytes:132231 (129.1 KB)
albertohp@alumno-server:~$ exit
logout
Connection to 192.168.0.209 closed.