LINUX :: SSH :: Llaves
Table of contents
DESCRIPCION
En esta leccion:
- crear llaves
- contraseña de llaves
- usar llaves
DEPENDENCIAS
ninguna
REQUERIMIENTOS
Sistema de linux Ubuntu.
Alguos comandos requieren privilegios elevados.
ADVERTENCIA
ninguna.
Working Environment
En esta leccion usamos el sistema operativo Ubuntu.
Propósito de Llaves SSH
Supongamos que deseamos conectarnos a un sistema usando SSH con destinación a una IP.
Al intentar iniciar una sessión, veremos lo sigiente:
-> ssh 172.46.0.3
The authenticity of host '172.46.0.3 (172.46.0.3)' can't be established.
ED25519 key fingerprint is SHA256:4JJ+Zavlqkp4mZsjCV2gN9G4a0zAoBdXHPp9eQBJlGU.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '172.46.0.3' (ED25519) to the list of known hosts.
user1@172.46.0.3's password:
Lo siguiente ha sucedido:
- SSH a identifcado la destinación remota como un sistema desconocido.
- Ha agregado la IP a la lista de “known hosts”.
- Requiere la contraseña del usuario.
El comando automaticamente ha creado el directorio .ssh
y el archivo known_hosts
-> ls -ld ~/.ssh
drwx------ 2 user1 user1 4096 Jul 13 19:36 /home/user1/.ssh/
-> ls -l ~/.ssh/
total 4
-rw-r--r-- 1 user1 user1 142 Jul 13 19:36 known_hosts
La discusión en esta página es usar llaves de SSH para evitar el uso de contraseñas. Si usaamos llaves, no hay necesidad de entrar una contraseña.
Archivos y Carpetas Relevantes Para SSH
SSH usa archivos y directorios predeterminado en el ambiente del usuario.
$HOME/.ssh
- carpeta para guardar las llaves publicas y privadas.
- authorized_keys
- archivo para guardar llaves usadas en conexiones remotas
- known_hosts
- archivo que mantiene un inventorio de systemas remotos
Crear el Directorio .ssh
En Ubuntu el directorio ssh
es creado automáticamente cuando generamos una llave por primera vez.
En el evento que SSH no crea el directorio $HOME/.ssh
automáticamente, podemos usar las instrucciones a seguir para provisionarlo.
SSH usa la localidad predeterminada $HOME/.ssh
para el lugar donde guardar las llaves.
A continuación vamos a crear el directorio .ssh
si no existe. Aplicamos permiso 700
que es (r)ead/(w)ite/(e)xecute para el dueño solamente.
mkdir $HOME/.ssh
chmod 700 $HOME/.ssh
Crear el archivo authorized_keys
. Aplicamos permiso 600
que es (r)ead/(w)ite para el dueño solamente.
touch $HOME/.ssh/authorized_keys
chmod 600 $HOME/.ssh/authorized_keys
SSH tira errores si los permisos no son de esta manera:
700
para$HOME/.ssh
600
para$HOME/.ssh/authorized_key
No es necesario crear el archivo $HOME/.ssh/known_hosts
explicitamente. Este archivo es creado cuando hacemos la primera conexión.
Crear llaves
Usamos el comando ssh-keygen
para crear llaves que podemos usar en conexiones remotas seguras.
Por defecto, el comando ssh-keygen
hace lo siguiente:
- guarda la llave en el directorio hogar del usuario
$HOME/.ssh
- crea llaves de tipo RSA.
- pregunta for una frase de contraseña (passphrase), la cual es opcional
- muestra la huella (fingerprint)
- provee una imagen de arte aleatorio (randomart)
Crear llave SSH RSA
Sin proveer ningun argumento, el comando ssh-keygen
crea una llave RSA.
En este ejemplo aceptamos los sugerencias mostradas.
Presiona la tecla Enter
cuando pregunta por “passphrase” para indicar que sera vacia.
-> ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user1/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user1/.ssh/id_rsa
Your public key has been saved in /home/user1/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:crZbSYv01tumkwyGmQTQeYqrGPRdCFMmgrcbrlQYoIg user1@ubuntu2204-1-devesp
The key's randomart image is:
+---[RSA 3072]----+
|+. .o= . |
|=.ooo + . |
|E.o.o..+ |
| oo...... |
|..oo..o.S+. |
|..o... =+=o+ |
|.+ . o.*o.. |
|o . + +o. |
| . o+. |
+----[SHA256]-----+
Lo anterior ha creado un par de llaves:
id_dsa
es la llave privada que debe mantenerse de manera segura y nunca debe ser compartidaid_rsa.pub
es la llave publica cuyo propósito es ser distribuida como sea necesario
-> ls -l $HOME/.ssh
total 20
-rw------- 1 user1 user1 2610 Jul 13 19:50 id_rsa
-rw-r--r-- 1 user1 user1 579 Jul 13 19:50 id_rsa.pub
Crear llave SSH DSA
Creamos llaves DSA pasando el la opción -t dsa
al comando ssh-keygen
. En este ejemplo aceptamos los sugerencias mostradas. Presiona la tecla Enter
cuando pregunta por “passphrase” para indicar que sera vacia.
-> ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/user1/.ssh/id_dsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user1/.ssh/id_dsa
Your public key has been saved in /home/user1/.ssh/id_dsa.pub
The key fingerprint is:
SHA256:lGOp8NHX15dEjC1HbOFpMedlkHmF1kgnvGlAlvLXX5Q user1@ubuntu2204-1-devesp
The key's randomart image is:
+---[DSA 1024]----+
| .o+@#X|
| . o.oooXE@|
| . . B .o.o=@+|
| o = o ..* +|
| o S o o|
| .|
| |
| |
| |
+----[SHA256]-----+
Lo anterior ha creado un par de llaves:
id_dsa
es la llave privada que debe mantenerse de manera segura y nunca debe ser compartidaid_dsa.pub
es la llave publica cuyo propósito es ser distribuida como sea necesario
-> ls -l $HOME/.ssh
total 20
-rw------- 1 user1 user1 1393 Jul 13 19:57 id_dsa
-rw-r--r-- 1 user1 user1 615 Jul 13 19:57 id_dsa.pub
Distribuir Llaves
Presumiblemente creamos llaves de SSH porque intentamos usarlas. Una vez que hemos creado una par de llaves, el proximo paso lógico es distribuir la llave pública. Esto implica que debemos enviar, or copiar la *llave pública* del par que hemos creado. Hay dos maneras de hacer esto:
- Editar el archivo
authorized_keys
en el servidor remoto para agregar la llave - Usar el comando
ssh-copy-id
para transmitir la llave a travez de la red
La llave privada nunca debe distribuirse. Debe mantenerse de manera segura.
Agregar Llave SSH Editando el Archivo authorized_keys
En este ejemplo deseamos copiar la llave pública RSA de un sistema Ubuntu (origen) a un sistema RedHat (destino).
Al usar este método, primera mostremos la llave que queremos copiar en el sistema de origin.
En el sistema Ubunu usamos cat
para mostrar el contenido de la llave.
devuser@ubuntu2204-1-devesp
~
hist:186 -> cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCG/xHRR59b/Ny7iL9zdd/D0sBWXD3ln13mVea5rUHp2LnQ75cdTX1DUvt7nzvifPMhzg803M4XyioDNEpDghOY9siXCXvOxodMyRHGzSJfvF/Mn5zGg2MUaXxHr+ZEMlbiK8MOu0CL50QJ2wBcY3qk+c9aH8ai7p/PYjRVcRUxgAK3zASpdU/imR/LPWLlLnbDFORpIe4p+WZUg7qQnq9wM8EBocnOExT+Y3W126/AxQGVw7fAKEUHBdQdjqfQgMo5+JsW10O4KZMS+c1Yl/qkHt45MAHh3bcPVJdVNMtcXecWHneeG82frBfJiXw6E662qE4BQJLANln9Nc09hfOLrZhtR79nF5MpmRQ0MChs+Izih75+M/TV0jk9B5kLM9V7rbzp+Hu5orGz6fMyy/G+LjG0ubF/RdYba9z7q/Wvy2utQq9hhSNkY+IfucEjARmLdkDRGoemuMOwP11PfRcWdtTgIH+/pVy9tEwOtw2HdJ+l+06pBuJ8rLJ5euomYk8= devuser@ubuntu2204test
En el sistema remoto de RedHat, usamos el comando vi
para editar el archivo ` ~/.ssh/authorized_keys`.
devuser@rhel9-1-devesp
~
hist:43 -> vi ~/.ssh/authorized_keys
Luego inspeccionamos el contenido del archivo con el comando cat
.
devuser@rhel9-1-devesp
~
hist:44 -> cat ~/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCG/xHRR59b/Ny7iL9zdd/D0sBWXD3ln13mVea5rUHp2LnQ75cdTX1DUvt7nzvifPMhzg803M4XyioDNEpDghOY9siXCXvOxodMyRHGzSJfvF/Mn5zGg2MUaXxHr+ZEMlbiK8MOu0CL50QJ2wBcY3qk+c9aH8ai7p/PYjRVcRUxgAK3zASpdU/imR/LPWLlLnbDFORpIe4p+WZUg7qQnq9wM8EBocnOExT+Y3W126/AxQGVw7fAKEUHBdQdjqfQgMo5+JsW10O4KZMS+c1Yl/qkHt45MAHh3bcPVJdVNMtcXecWHneeG82frBfJiXw6E662qE4BQJLANln9Nc09hfOLrZhtR79nF5MpmRQ0MChs+Izih75+M/TV0jk9B5kLM9V7rbzp+Hu5orGz6fMyy/G+LjG0ubF/RdYba9z7q/Wvy2utQq9hhSNkY+IfucEjARmLdkDRGoemuMOwP11PfRcWdtTgIH+/pVy9tEwOtw2HdJ+l+06pBuJ8rLJ5euomYk8= devuser@ubuntu2204test
La llave que agregamos se ve al final de la salida.
Agregar Llave SSH Usando ssh-copy-id
En este ejemplo deseamos copiar la llave pública RSA de un sistema Ubuntu (origen) a un sistema RedHat (destino).
Usamos el comando ssh-copy-id
para copiar la llave pública del sistema origen al sistema de destino.
El comando ssh-copy-id
requiere que proveamos la contraseña del usuario en el sistema remoto.
devuser@ubuntu2204-1-devesp
~
hist:189 -> ssh-copy-id rhel9-1-devesp
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/devuser/.ssh/id_rsa.pub"
The authenticity of host 'rhel9-1-devesp (172.44.4.2)' can't be established.
ED25519 key fingerprint is SHA256:4JJ+Zavlqkp4mZsjCV2gN9G4a0zAoBdXHPp9eQBJlGU.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
/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
devuser@rhel9-1-devesp's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'rhel9-1-devesp'"
and check to make sure that only the key(s) you wanted were added.
La salida del comando indica que copió una llave.
También sugiere la manera de conectarse al sistema remoto.
Por último, recomienda verificar que la llave fué copiada.
Ahora, en el sistema remoto usamos el comando cat
para inspeccionar el contenido del archivo authorized_keys
para verificar que la llave se transmitió.
devuser@rhel9-1-devesp
~
hist:46 -> cat ~/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCG/xHRR59b/Ny7iL9zdd/D0sBWXD3ln13mVea5rUHp2LnQ75cdTX1DUvt7nzvifPMhzg803M4XyioDNEpDghOY9siXCXvOxodMyRHGzSJfvF/Mn5zGg2MUaXxHr+ZEMlbiK8MOu0CL50QJ2wBcY3qk+c9aH8ai7p/PYjRVcRUxgAK3zASpdU/imR/LPWLlLnbDFORpIe4p+WZUg7qQnq9wM8EBocnOExT+Y3W126/AxQGVw7fAKEUHBdQdjqfQgMo5+JsW10O4KZMS+c1Yl/qkHt45MAHh3bcPVJdVNMtcXecWHneeG82frBfJiXw6E662qE4BQJLANln9Nc09hfOLrZhtR79nF5MpmRQ0MChs+Izih75+M/TV0jk9B5kLM9V7rbzp+Hu5orGz6fMyy/G+LjG0ubF/RdYba9z7q/Wvy2utQq9hhSNkY+IfucEjARmLdkDRGoemuMOwP11PfRcWdtTgIH+/pVy9tEwOtw2HdJ+l+06pBuJ8rLJ5euomYk8= devuser@ubuntu2204test
Conclusion
El conocimiento de uso de llaves de SSH va mas alla de facilitar entrar a un sistema de manera puramente conveniente. La idea principal del uso de llaves de SSH es evitar el uso de contraseñas. Esto presenta una verdadera ventaja durante la implementación de tareas de automatización que no requiere intervencion del usuario.
Referencias
Glosario De Comandos
Los comandos siguientes son usados frecuentemente en sesiones de Linux.
- ssh-keygen
- Utilidad de clave de autenticación OpenSSH. Se usa para crear llaves de SSH.
- ssh-copy-id
- utilizar claves disponibles localmente para autorizar inicios de sesión en una máquina remota
Referencias Utiles
DevEsp :: Linux
- https://docs.devesp.com/linux-en-espa%C3%B1ol/
Paginas Manuales