SSH: Autentificación por llaves
Introducción
Estamos acostumbrados a la utilización de usuario y clave para el acceso a los servidores, pero ssh nos ofrece una alternativa diferente: llaves, que consiste en un certificado digital. Ésto nos permite ingresar sin "teclear" una clave.
Como funciona
Al crear las llaves de autentificación se generan 2 certificados: Una llave Pública, que entregamos al servidor (o servidores) para que sea autorizada, y una Privada, que como su nombre lo indica, no debemos compartirla. A su vez, dicha clave privada puede ser definida con o sin clave, con lo que podemos controlar el nivel de seguridad deseado.
Al utilizar llaves sin clave, se facilita enormemente la ejecución de tareas automáticas dado que se evita el uso de trucos o instalar software adicional, que a su vez pueden dejar las claves al descubierto.
Por parte del servidor, se permite controlar el origen del acceso, autorizando solo ciertos equipos, redes o dominio (obtenido por dns reverso). Además se permite forzar de ejecución de un único comando para la tranquilidad del administrador del servidor.
Empecemos
Consideraremos que tenemos 2 equipos Linux, Unix, FreeBSD o algún otro que soporte SSH, los que llamaremos local y remoto (mmm, con un poco más de creatividad podría haberlos llamado Houston y Apollo)
Creación de las llaves
En nuestro equipo local se generan las llaves pública y privada con la ejecución del comando:
ssh-keygen -t rsa -C "llave de antonio@local.wyzer.cl"
Nos solicitará confirmar la ubicación del archivo para la llave, por defecto se almancena en $HOME/.ssh/id_rsa, pero se puede ingresar un nombre distinto o definirlo por medio de la opción -f, para aceptar el archivo debe ingresar <ENTER>
.
Luego nos solicita una clave para el uso de la llave, la cual puede ser omitida pulsando <ENTER>
, se pide nuevamente como confirmación:
Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/antonio/.ssh/id_rsa. Your public key has been saved in /home/antonio/.ssh/id_rsa.pub. The key fingerprint is: fb:51:7b:56:46:b9:da:61:2c:15:38:26:a3:64:9d:5b antonio@local.wyzer.cl The key's randomart image is: +--[ RSA 2048]----+ | . . .. | | o = E o| | o . * .o.| | . . o..| | S .. =o| | . . .=o.| | . . ..o. | | . . o | | . | +-----------------+
Ahora ya contamos con 2 archivos, nuestra llave privada, que debe ser protegida y evitar que sea extraida del equipo, en el archivo $HOME/.ssh/id_rsa, y la pública en el archivo $HOME/.ssh/id_rsa.pub que será la que compartiremos hacia los equipos remotos (receptores)
Agregar llave pública en equipo remoto
Debemos llevar el archivo $HOME/.ssh/id_rsa.pub hacia el equipo remoto, si no tiene acceso al equipo, deberá solicitar al administrador que agrege la llave, o bien, si tenemos acceso (o somos administradores) copiamos el archivo al equipo remoto con scp, suponiendo que existe el mismo usuario en el equipo remoto, del cual nos solicita la clave de acceso:
Password: id_rsa.pub 100% 407 0.4KB/s 00:00
Ahora debemos trabajar sobre el equipo remoto, desde el directorio .ssh, debemos agregar el contenido del archivo id_rsa.pub
en el archivo authorized_keys
:
El archivo id_rsa.pub ya no es requerido, por lo que podemos borrarlo en el equipo remoto, en el equipo local podemos conservarlo para repetir el proceso en otro equipo, utilizando la misma llave.
Debemos asegurarnos que el directorio .ssh
y el archivo authorized_keys
cuenten solo con permisos para el dueño del archivo:
total 20 drwx------ 2 antonio users 512 Jul 27 12:24 ./ drwxr-xr-x 34 antonio users 2048 Jul 26 15:59 ../ -rw------- 1 antonio users 806 Jul 27 14:55 authorized_keys -rw-r--r-- 1 antonio users 4289 Jan 22 2016 known_hosts
Ahora ya estamos listos para conectar al equipo remoto sin teclear una clave, simplemente como:
Algunos consejos de seguridad
Por la parte del servidor, se nos permiten algunas restricciones anteponiendo una parametrización en el registro del archivoauthorized_keys
Restringir el host de origen
Podemos indicar un IP, una red o un dominio (determinado por la resolución del reverso del IP):
from="192.168.1.*,192.168.10.34" ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCsoVd8y7nj...
Forzar la ejecución de un único comando
Se debemos brindar el acceso solo para la ejecución de un comando, podemos realizarlo con el parámetro command
:
command="uptime" ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCsoVd8y7nj...
Al terminar el comando, se finaliza la sesión ssh. Si el usuario entrega algún comando en la ejecución de ssh en ésta configuración, el equipo remoto define la variable de ambiente $SSH_ORIGINAL_COMMAND
con dicho comando.
Generado por Sistema y almacenado en cache
Wyzer Luis Hernán de la Barra |
|
Teléfono: | +56995451689 |
WhatsApp: | +56995451689 |
E-Mail: | info@wyzer.cl |
Web: | www.wyzer.cl |