educación, informática y demás

Administración remota con ssh: Secure Shell

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

  1. Instalando servidor SSH en un sistema GNU/Linux Debian 12
  2. Accediendo a un sistema remoto con SSH desde GNU/Linux Debian 12
  3. Accediendo a un sistema remoto con SSH desde Windows 10
  4. Generar y almacenar contraseña de acceso RSA
  5. Copiando ficheros de forma segura con scp
  6. Configurar el servidor y el cliente SSH
  7. Gestión de conexiones
  8. 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:

http://help.ubuntu.com/

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.