¿QUÉ ES SSH?
SSH o Secure Shell es el protocolo y programa que nos permite el acceso seguro a nuestros sistemas locales y remotos. No solo nos permite conexiones a sistemas Unix, sino también a MS Windows, además de esto cuenta con funcionalidades adicionales que nos permiten copiar datos de forma segura (scp/sftp), generar claves publicas y privadas (ssh-keygen), tunneling mediante SSH, ejecución de programas gráficos remotos, etc.
En un principio solo existían Telnet y Rlogin para acceder a los sistemas, pero estas comunicaciones viajaban de forma insegura, es aquí cuando nace SSH. La primera versión del protocolo y el programa eran libres, desarrollados por Tatu Ylönen, posteriormente su licencia cambio y surgió la compañía SSH Communications Security. Como alternativa a esto en 1999 se comenzó a desarrollar una nueva versión de implementación libre llamada OpenSSH creada por el proyecto OpenBSD
COMPONENTES SSH.
SERVIDOR SSH.
OpenSSH-Server – Disponible para sistemas Unix y MS Windows. Ejecuta el servicio SSH en el puerto 22 (predeterminado) y acepta las conexiones seguras en el lado del servidor.
CLIENTE SSH.
OpenSSH-Client - Instalado de forma predeterminada en la mayoría de los sistemas operativos incluyendo MS Windows (PuTTY es otro programa que nos permite realizar la misma acción). Su sintaxis es muy sencilla, solo hay que especificar el usuario y la dirección a donde deseamos conectarnos. Si el servidor SSH acepta el nombre de usuario y la contraseña (o la clave SSH), se nos proporcionara acceso al sistema.
UTILIDADES SSH.
- ssh-copy-id: Nos permite copiar, instalar y configurar una clave SSH en el servidor para iniciar sesión sin contraseña y SSO.
- ssh-agent: Es un programa auxiliar que nos facilita rastrear las claves de identidad y sus frases contraseñas, de las cuales SSH deriva una clave de cifrado, y permite al usuario usar las claves sin necesidad de introducir la frase de contraseña (passphrase).
- ssh-add-: Se usa para agregar una clave al agente de autenticación SSH y se usa con ssh-agent para implementar SSO por SSH.
- scp: Su Funcionalidad es copiar archivos de una computadora a otra, remplaza a rcp.
- sftp: De igual manera que scp, nos permite copiar archivos de una computadora a otra, es una versión cifrada de FTP por SSH.
- sshd: Demonio de OpenSSH, inicia los servicios de OpenSSH-Server. Escucha la conexión de los clientes.
Instalación del OpenSSH-Server.
Para comprender mejor el funcionamiento de SSH, realizaremos las pruebas dentro de la LAN, ya que los servicios en el Nube ya cuentan con todo configurado. En mi caso usare la distribución de Ubuntu GNU/Linux 2021.04.
Actualizaremos los repositorios de paquetes e instalaremos OpenSSH-Server con el siguiente comando: sudo apt update && sudo apt install openssh-server
naek@nkf:~$ sudo apt update && sudo apt install openssh-server
Hit:1 http://mx.archive.ubuntu.com/ubuntu hirsute InRelease
Hit:2 http://mx.archive.ubuntu.com/ubuntu hirsute-updates InRelease
Hit:3 http://mx.archive.ubuntu.com/ubuntu hirsute-backports InRelease
Hit:4 http://mx.archive.ubuntu.com/ubuntu hirsute-security InRelease
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
6 packages can be upgraded. Run 'apt list --upgradable' to see them.
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
openssh-client openssh-server openssh-sftp-server
Suggested packages:
keychain libpam-ssh monkeysphere ssh-askpass molly-guard
The following packages will be upgraded:
openssh-client openssh-server openssh-sftp-server
3 upgraded, 0 newly installed, 0 to remove and 3 not upgraded.
Need to get 1087 kB of archives.
After this operation, 0 B of additional disk space will be used.
Do you want to continue? [Y/n]
A continuacion habilitamos el arranque automatico de OpenSSH-Server con el comando: sudo systemctl enable ssh
, posteriormente ejecutamos los commandos sudo service ssh start
y sudo service ssh status
para iniciar los servicios y comprobar su estado.
naek@nkf:~$ sudo systemctl enable ssh
Synchronizing state of ssh.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable ssh
naek@nkf:~$ sudo service ssh start
naek@nkf:~$ sudo service ssh status
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2021-08-13 14:27:36 UTC; 5min ago
Docs: man:sshd(8)
man:sshd_config(5)
Main PID: 6638 (sshd)
Tasks: 1 (limit: 2209)
Memory: 1.0M
CGroup: /system.slice/ssh.service
└─6638 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
Aug 13 14:27:36 nkf systemd[1]: Starting OpenBSD Secure Shell server...
Aug 13 14:27:36 nkf sshd[6638]: Server listening on 0.0.0.0 port 22.
Aug 13 14:27:36 nkf sshd[6638]: Server listening on :: port 22.
Aug 13 14:27:36 nkf systemd[1]: Started OpenBSD Secure Shell server.
INICIO DE SESION.
La forma mas sencilla de realizar una conexión por SSH es mediante el siguiente comando.
ssh username@host
En nuestro caso usaremos el usuario ‘naek’ y la dirección IP 172.16.104.8 Posteriormente nos solicitara la contraseña del usuario y en caso de ser correcta podremos acceder al host. Algunos parámetros a tener en cuenta son: -i (para especificar la clave privada SSH) y -p (para especifica el puerto del servidor).
┌─[root@7300b9c10bc0]─[/]
└──╼ #ssh naek@172.16.104.8
naek@172.16.104.8's password:
Welcome to Ubuntu 21.04 (GNU/Linux 5.11.0-25-generic x86_64)
Generación de claves Privadas/Publicas.
Para la generación de estas claves usaremos la utilidad ssh-keygen sin ningún parámetro adicional, y como se muestra a continuación. Por defecto usara el algoritmo RSA, y nos solicita la ruta donde se van a guardar y si queremos ingresar alguna frase de contraseña (passphrase) para nuestra clave privada, en nuestro caso dejaremos todo por default.
┌─[✗]─[root@7300b9c10bc0]─[/]
└──╼ #ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:CW4mn1MRyRaVl0OEC/d8vmQ4SzSPsuZ89UUtFdnOKDs root@7300b9c10bc0
The key's randomart image is:
+---[RSA 3072]----+
| .o+.=o. .+|
| =.+ + .o|
| ...o = . =.|
| . . o. * + =|
| . + S . X o |
| = o . E * .|
| + + B o.|
| . .o o . .|
| oo. |
+----[SHA256]-----+
Una ves generadas las claves, tenemos que ingresar nuestra clave publica en la configuración del servidor SSH, para realizar esta acción necesitamos copiar todo el contenido del fichero id_rsa.pub (cat /hom/user/.ssh/id_rsa.pub), posteriormente creamos el fichero authorized_keys (con el contenido copiado) dentro del servidor(echo ‘string_id_rsa.pub’ > /home/user/.ssh/authorized_keys) para permitir el inicio de sesión sin proporcionar contraseña, además de esto, necesitamos cambiar los permisos con al fichero authorized_keys (chmod 600 /home/user/.ssh/authorized_keys) y por ultimo tenemos que reiniciar los servicios con el comando sudo service ssh restart.
Como podemos ves es algo laborioso el proceso, y para ello usaremos la herramienta ssh-copy-id para automatizar el proceso y realizar toda la configuración del servidor solo proporcionado la contraseña de SSH del usuario.
┌─[root@7300b9c10bc0]─[/]
└──╼ #ssh-copy-id naek@172.16.104.8
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
naek@172.16.104.8's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'naek@172.16.104.8'"
and check to make sure that only the key(s) you wanted were added.
Usos Prácticos con SSH.
Copiar Archivos a través de SSH con SCP.
SCP nos permite copiar ficheros de forma segura entre dos o mas computadoras. A continuación, podemos ver la sintaxis para copiar un fichero desde nuestro computador hacia el segundo host. Datos a tener en cuenta:
file-secret.txt : Es nuestro fichero que copiaremos, también podemos ingresar directorios.
naek@172.16.104.8 : Es el inicio de sesión con nuestro usuario y host a donde deseamos copiar el/ los fichero(s).
:/home/naek/Desktop: Es la ruta en nuestro servidor donde se copiará todo.
┌─[✗]─[root@7300b9c10bc0]─[/]
└──╼ #scp file-secret.txt naek@172.16.104.8:/home/naek/Desktop/
file-secret.txt 100% 0 0.0KB/s 00:00
SCP también nos permite copiar ficheros de un host remoto a nuestro equipo, en el siguiente ejemplo podemos ver la sintaxis. Primero tenemos que escribir el comando scp seguido del inicio de sesión ssh (naek@172.16.104.8), posteriormente ingresamos la ruta del fichero del servidor remoto (:/home/naek/Desktop/smb-credentials.txt) y finalmente especificamos nuestra ruta local (en mi caso /tmp/tmp.65ynCMwMMR/)
┌─[root@7300b9c10bc0]─[/tmp/tmp.65ynCMwMMR]
└──╼ #scp naek@172.16.104.8:/home/naek/Desktop/smb-credentials.txt /tmp/tmp.65ynCMwMMR/
smb-credentials.txt 100% 0 0.0KB/s 00:00
SSH Tunnel (port forward)
En este ejemplo crearemos un puerto local sea renviado a un puerto de un host remoto, para esto usaremos el siguiente comando: ssh -L 8080:127.0.0.1:80 naek@172.16.104.8
que nos permitirá crear la conexión e iniciara la sesión de SSH (cuando se termina la sesión SSH se deshabilitan los puertos)
Parametros: -L: espeficica que es un TCP port forward Local.
8080: será muestro puerto Local.
127.0.0.1: es la dirección remota donde corre el servicio.
80: Es el puerto remoto del host
naek@172.16.104.8: Sesión remota SSH
naek@nkf ~ % ssh -L 8080:127.0.0.1:80 naek@172.16.104.8
Welcome to Ubuntu 21.04 (GNU/Linux 5.11.0-25-generic x86_64)
Para realizar la comprobación podemos usar el comando: que nos mostrara los programas que están usando ese puerto. También podemos acceder mediante el navegador web, seguido el puerto local y nos mostrara el contenido.
naek@nkf ~ % sudo lsof -i:8080
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ssh 8547 naek 5u IPv4 0x209579631e0687b1 0t0 TCP localhost:http-alt (LISTEN)
ssh 8547 naek 6u IPv6 0x209579631d9d0999 0t0 TCP localhost:http-alt (LISTEN)
Túnel inverso SSH
En este ejemplo usare un servidor de AWS para conectarme al puerto local de SSH y así dar acceso a una tercera persona para configurar mi maquina local. Esto se hará configurando un puerto de escucha en el servidor remoto que se conectará a mi puerto local en una LAN.Para ello ejecutamos el siguiente comando en nuestro equipo local: ssh -R 2020:127.0.0.1:22 ubuntu@18.222.255.69 -i aws.pem
ubuntu@ip-172-31-46-32:~$ curl ifconfig.co
18.222.255.69
ubuntu@ip-172-31-46-32:~$ sudo lsof -i:2020
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 841 ubuntu 10u IPv6 25197 0t0 TCP ip6-localhost:2020 (LISTEN)
sshd 841 ubuntu 11u IPv4 25198 0t0 TCP localhost:2020 (LISTEN)
ubuntu@ip-172-31-46-32:~$ ssh naek@127.0.0.1 -p 2020
naek@127.0.0.1's password:
Welcome to Ubuntu 21.04 (GNU/Linux 5.11.0-25-generic x86_64)
naek@nkf:~$ hostname -I
172.16.104.8
Una ves iniciada la conexión en nuestro servidor local, iniciaremos sesión en AWS y comprobaremos que tenemos configurado el puerto 2020, y finalmente nos conectaremos en el usuario y la dirección local 127.0.0.1 seguido del puerto 2020.
Conclusión
El uso de SSH es muy fácil de usar y de implementar, y nos permite realizar conexiones seguras a equipos remotos y locales. El uso de claves SSH nos permite autenticarnos de una mejor manera y agregar mas seguridad a nuestros equipos, pero también se deben resguardar correctamente. En un próximo articulo veremos como asegurar correctamente nuestros servidores SSH siguiendo las mejores practicas.
Escrito Por:
Jesús Flores
Security Engineer