Implementar la autenticación basada en claves SSH en Linux
SSH (Secured Shell) es un protocolo que crea una conexión criptográficamente segura entre el cliente SSH y los servidores remotos.
Utilizando SSH puede gestionar y administrar servidores remotos de forma segura. Esto puede ser útil de muchas maneras.
- Despliegue de varios servidores
- Parada/arranque de servicios a distancia
- Automatización
y toda su creatividad (esperemos)…
Como administrador de sistemas, esto es algo básico que hay que saber.
Aprendamos cómo…
Voy a generar una clave privada y una clave pública. La clave privada debe almacenarse en su máquina cliente ssh y debe mantenerse segura. La clave pública debe copiarse en el servidor remoto para iniciar sesión en ese servidor desde la máquina cliente SSH sin necesidad de contraseña.
Aprenderá lo siguiente.
- Instalar SSH (no es necesario si ya está instalado)
- Generar claves SSH
- Copiar la clave SSH a un servidor remoto
- Iniciar sesión en el servidor remoto utilizando SSH
Para fines de demostración, tengo 2 servidores con las siguientes direcciones IP, un sistema es un cliente y el otro es un servidor en el que voy a iniciar sesión a través de ssh desde una máquina cliente.
- Cliente (usuario -> geekflare) : 192.168.56.102
- Remoto (usuario -> ubuntu) : 192.168.56.101
Instalación de SSH
Antes de seguir los pasos mencionados en este artículo, asegúrese de que openssh-server
está instalado en los servidores. Si no está instalado, ejecute los siguientes comandos para instalarlo.
sudo apt-get install openssh-server
sudo systemctl enable ssh
sudo systemctl start ssh
Puede ejecutar el comando ssh para comprobar si está instalado en el sistema o no.
geekflare@geekflare:~$ ssh
uso: ssh [-46AaCfGgKkMnqsTtVvXxYy] [-B bind_interface]
[-b bind_address] [-c cipher_spec] [-D [bind_address:]port]
[-E log_file] [-e escape_char] [-F configfile] [-I pkcs11]
[-i archivo_identidad] [-J [usuario@]host[:puerto]] [-L dirección]
[-l nombre_usuario] [-m mac_spec] [-O ctl_cmd] [-o opción] [-p puerto]
[-Q opción_consulta] [-R dirección] [-S ruta_ct] [-W host:puerto]
[-w local_tun[:remote_tun]] destino [comando]
Generar claves SSH
Esto debe hacerse en un servidor cliente.
Ejecute el comando ssh-keygen
para generar una clave SSH. Simplemente pulse intro cuando le pida el archivo, la frase de contraseña, la misma frase de contraseña. Genera un par de claves en el directorio ~/.ssh por defecto. Id_rsa es la clave privada e id_rsa.pub es la clave pública asociada.
geekflare@geekflare:~$ ssh-keygen
Generar par de claves rsa pública/privada.
Introduzca el archivo en el que desea guardar la clave (/home/geekflare/.ssh/id_rsa):
Introduzca la frase de contraseña (vacía si no hay frase de contraseña):
Vuelva a introducir la misma frase de contraseña:
Su identificación se ha guardado en /home/geekflare/.ssh/id_rsa.
Su clave pública se ha guardado en /home/geekflare/.ssh/id_rsa.pub.
La huella digital de la clave es
SHA256:3XDm62tzJegGm8oAmFYCyeFZovJOuU42zNgyn9GzH30 geekflare@geekflare
La imagen randomart de la llave es
---[RSA 2048]----
|o .. |
| o |
|oo . . . o |
|.. * . * |
| B . S . o. |
| O o . . . .. .|
| @ o o . E=. o |
| B o .o.= . |
| ... o. oo |
----[SHA256]-----
Generará dos nuevos archivos en el directorio ~/.ssh
.
Copiar la clave SSH al servidor remoto
Debe copiar la clave privada en la carpeta ~/ .ssh
de un servidor remoto. La mayoría de los servidores ya deberían tener esta carpeta, si no es así, deberá crearla.
Para ello
- Inicie sesión en el servidor remoto con el usuario con el que desea conectarse. En mi caso, es
ubuntu
- Asegúrese de que el directorio de trabajo actual es el directorio personal del usuario y, a continuación, cree una carpeta .ssh. También puede utilizar el siguiente comando único para crear una
mkdir -p ~/.ssh
Si ya tiene la carpeta .ssh entonces haga una copia de seguridad de la misma.
A continuación, vamos a empujar la clave pública de un servidor cliente.
En la máquina cliente (192.168.56.102), ejecute el siguiente comando para copiar la clave pública en el servidor remoto dentro de un archivo authorized_keys
en el directorio .ssh.
geekflare@geekflare:~$ cat .ssh/id_rsa.pub | ssh ubuntu@192.168.56.101 'cat >> .ssh/authorized_keys'
ubuntu@192.168.56.101's password:
Ejecute el siguiente comando para establecer los permisos en el archivo authorized_keys del servidor remoto.
geekflare@geekflare:~$ ssh ubuntu@192.168.56.101 "chmod 700 .ssh; chmod 640 .ssh/authorized_keys"
Genial, esto concluye la clave se intercambia y el permiso está todo establecido.
Inicie sesión en el servidor remoto mediante SSH
¡Hagamos una prueba para ver si funciona!
Iniciemos sesión en el servidor remoto (192.168.56.101) desde una máquina cliente (192.168.56.102) como usuario geekflare.
Ejecute el siguiente comando para probar, esta vez no le pedirá contraseña.
geekflare@geekflare:~$ ssh ubuntu@192.168.56.101
Bienvenido a Ubuntu 16.04.6 LTS (GNU/Linux 4.4.0-151-generic i686)
* Documentación: https://help.ubuntu.com
* Gestión: https://landscape.canonical.com
* Soporte: https://ubuntu.com/advantage
346 paquetes actualizables.
11 actualizaciones son de seguridad.
Última conexión: Lun 17 jun 00:10:32 2019 desde 192.168.56.101
Aquí tiene…
He iniciado sesión en el servidor remoto con éxito. Ejecutando el siguiente comando obtendrá los detalles de la IP de la máquina remota.
ubuntu@ubuntu:~$ ifconfig
enp0s3 Link encap:Ethernet HWaddr 08:00:27:9b:47:86
inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0
dirección inet6: fe80::5c62:3267:b752:fe5d/64 Alcance:Enlace
UP BROADCAST RUNNING MULTICAST MTU:1500 Métrica:1
RX paquetes:20239 errores:0 abandonados:0 desbordamientos:0 trama:0
TX paquetes:5406 errores:0 abandonados:0 desbordamientos:0 trama:0
colisiones:0 txqueuelen:1000
Bytes de recepción:22678039 (22,6 MB) Bytes de transmisión:701710 (701,7 KB)
enp0s8 Link encap:Ethernet HWaddr 08:00:27:a9:4a:6b
inet addr:192.168.56.101 Bcast:192.168.56.255 Mask:255.255.255.0
dirección inet6: fe80::54a9:761c:9034:21a2/64 Alcance:Enlace
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX paquetes:330 errores:0 abandonados:0 desbordamientos:0 trama:0
TX paquetes:197 errores:0 abandonados:0 desbordamientos:0 trama:0
colisiones:0 txqueuelen:1000
Bytes de recepción:42847 (42,8 KB) bytes de transmisión:32774 (32,7 KB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Máscara:255.0.0.0
dirección inet6: ::1/128 Alcance:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX paquetes:997 errores:0 abandonados:0 desbordamientos:0 trama:0
TX paquetes:997 errores:0 abandonados:0 desbordamientos:0 portadora:0
colisiones:0 txqueuelen:1
Bytes de recepción:79654 (79,6 KB) bytes de transmisión:79654 (79,6 KB)
Conclusión
Configurar el intercambio de claves SSH es muy sencillo como puede ver. Espero que esto le ayude e interesado en aprender la administración de Linux y solución de problemas a continuación, echa un vistazo a este curso Udemy.