Autenticación por claves no servizo SSH
Sumario
Escenario
ste escenario ten como principal obxectivo explicar e implementar un sistema de autenticación por claves, que usando a criptografía de clave asimétrica, permita que os usuarios se autentiquen no sistema a través dunha identidade dixital.
Escenario
Ó longo deste escenario crearemos varias identidades dixitais e configuraremos o servidor ssh para permitir únicamente o acceso mediante claves criptográficas (identidades dixitais). Unha vez configurado o sistema de autenticación, veremos como un ataque de diccionario lanzado con medusa ou semellantes fracasa.
Configuración dos equipos para o escenario
Os equipos para desenvolver o escenario son:
- Os equipos son os do escenario anterior.
- A maiores dos equipos da figura usarei o equipo anfitrión dos contedores.
- Os tres equipos deben poder comunicarse entre si.
Autenticación por claves
SSH permite autenticar ós usuarios facendo uso de identidades dixitais (formadas cunha parella de claves privada-pública) e os algoritmos criptográficos de clave asimétrica. O procedemento a seguir ten dous pasos:
- Crear a identidade dixital
- Copiar a clave pública no arquivo de claves autorizadas no host remoto.
Resúmese na seguinte imaxe:
Openssh e identidades dixitais
Fig. Esquema dun sistema de autenticación por claves en ssh
Crear a identidade dixital
En primeiro lugar, o usuario creará a súa identidade dixital xerando a parella de claves privada-pública. Como xa foi explicado na criptografía asimétrica, a clave privada debe manterse segura a toda costa e a pública pode distribuirse. A clave privada pode protexerse mediante o uso dunha passphrase; é dicir, que cando se use haberá que introducir a passphrase. Sinalar que cando se indica a passphrase o que se está a escribir non é visible; e no caso de esquecer a passphrase, a clave privada non se poderá usar ó non poderse descifrar; xa que o mesmo cifrado que fai seguro o sistema ssh, fai irrecuperable a clave. A solución sería abandoar a clave, xerar unha nova e instalar a nova pública nos equipos remotos.
Está claro que protexer as claves privadas cunha passphrase é o máis seguro, sen embargo o uso de claves privadas sen passphrase tamén ten a súa utilidade. Por exemplo, as claves privadas sen passphrase permiten o seu uso sen necesidade da intervención manual do usuario, o que é axeitado na execución automática de scripts.
Para crear a parella de claves empregarase o comando ssh-keygen, sendo as opcións máis salientables:
- -t <tipo_clave> permite especificar o tipo de clave (RSA, DSA, ECDSA, etc.).
- -b <tamaño_clave> permite especificar o tamaño de clave. Lembrar que estas claves serven únicamente para autenticar ó usuario; polo tanto, incrementar o seu tamaño non significará incrementar a carga de cpu cando se envíen datos por ssh.
- -C “<comentario>” permite engadir un comentario á clave para poder distinguila doutras.
- -f <nome_ficheiro> permite especificar a ruta e nome dos ficheiros das claves (é posible ter varias identidades dixitais).
A día de hoxe os tipos máis empregados son RSA e ED25519 e a forma de traballar con elas é semellante. A continuación creamos unha parella de claves, protexendo a clave privada cunha passphrase:
$ ssh-keygen -t rsa -b 4096 -C "Identidade manuel - curso platega"
Generating public/private rsa key pair. Enter file in which to save the key (/home/magasix/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/magasix/.ssh/id_rsa. Your public key has been saved in /home/magasix/.ssh/id_rsa.pub. The key fingerprint is: SHA256:vPZGTGjYjpbMC584LOn4nIaSu1CtaJ4mfRYjpJ2smNQ Identidade manuel - curso platega The key's randomart image is: +---[RSA 4096]----+ | | | | | o . | | .. ..+ . | | =o..o =So | |.+=E+ * ..o | |=B.+ B oo. | |%+*.* +. .. | |BO=+ . .. | +----[SHA256]-----+
Se facemos un listado da carpeta $HOME/.ssh veremos que aparecen dous novos arquivos, id_rsa e id_rsa.pub. Esta parella de claves criptográficas formarán a identidade dixital do usuario. Fixarse os diferentes permisos da clave privada id_rsa e a clave pública id_rsa.pub.
$ ls -lahF .ssh/
total 24K drwx------ 2 asir asir 4,0K ene 31 13:51 ./ drwxr-x--- 24 asir asir 4,0K ene 31 13:24 ../ -rw------- 1 asir asir 3,4K ene 31 13:51 id_rsa -rw-r--r-- 1 asir asir 759 ene 31 13:51 id_rsa.pub -rw------- 1 asir asir 2,9K ene 31 13:33 known_hosts -rw------- 1 asir asir 2,1K ene 31 13:33 known_hosts.old
Autorizar o acceso á identidade dixital
Para poder usar esta identidade dixital hai que autorizar o seu uso no equipo remoto; para facer isto, a clave pública debe copiarse no arquivo de claves autorizadas (authorized_keys) na conta que se teña no equipo remoto onde que se quere acceder. Ollo, é moi importante salientar que é a clave pública unicamente a que debe copiarse, non a clave privada. Pode engadirse manualmente ó final do arquivo authorized_keys ou se está permitido o acceso por ssh ó equipo usar o comando ssh-copy-id:
$ ssh-copy-id ubuntu@192.168.100.101
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/asir/.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 ubuntu@192.168.100.101's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'ubuntu@192.168.100.101'" and check to make sure that only the key(s) you wanted were added.
No equipo remoto, dentro da carpeta .ssh/ ubicada no directorio casa do usuario magasix aparece o arquivo authorized_keys coas claves públicas das identidades dixitais autorizadas para acceder por ssh como usuario magasix:
$ ls -lhaF .ssh/
total 3,5K drwx------ 2 ubuntu ubuntu 3 ene 31 13:15 ./ drwxr-x--- 3 ubuntu ubuntu 7 ene 31 13:33 ../ -rw------- 1 ubuntu ubuntu 759 ene 31 13:52 authorized_keys
$ cat .ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC7o13tTmWDkkWzC/vjdJ7sTJfJXLF+41Zu7d+En9xOVxxXAyBuOR8DiT073iVPxs6KWyy96xUM8E13Iic62Q07OMJFrpQNafAIJaRQuuHFbb++sAhnv1V9ELPSd26yn9mdnAuxuR46kT0ZEe/+oQ778OJDFcWuPgFDj9mBLScSDIoJKxdDXVJzJ7CP4b6ykZF58hycAVdeIgUCWgXkHlTvutGQFLSjWvX6wb+Lw6tPprxIbEzUz2J5nELNQ5vbMUpjvhb137W/l5bmcGlO/4tHg3wdZHOJW6XSRJVrXirB4dQlwDTdY6DnFYsGhLYkFU4wBZ0FnGtJeA8vBJDgUQKBLUuUoxgOk27LiEKJo31dwNSWs1+W85YVQqIysxOO8FIQe8dS6AMrXKXcoIFGxp4qtZm7lE+knUswnOd87S4Q1r5C1gdk3cSETL/8QraCRDCNUNpD9wvvlCe9tn4A5oDuZwjiKsTXI8yhRR6YGiLruAnNaUDuT2usgXuwMPh+N8r+nO5ZkimZL5mrvJO/qT8cEBsKApEcjV/ed4BqfKl00G1lJ1ShXCKnIFEeeEF4WUsHvh2/IGz6NxDTNVRhI+S4DAcTyhEA7YWFhexKzzrfyRapUDFW4f9yygnu+OcdvDiDRTjigx13JtOg5kqIUa5tImtDRhVucxNFhVQglQ5PuQ== Identidade manuel - curso platega
Unha vez copiada a clave pública é posible acceder usando esa identidade dixital sen necesidade de usar contrasinais:
$ ssh ubuntu@192.168.100.101
Enter passphrase for key '/home/asir/.ssh/id_rsa': Last login: Sat Jan 31 13:33:16 2026 from 192.168.100.1 To run a command as administrator (user "root"), use "sudo <command>". See "man sudo_root" for details.
Como a clave privada está protexida cunha passphrase, o usuario será preguntado pola mesma antes de continuar e abrir a terminal no equipo remoto:
Normalmente os sistemas Linux proporcionan axentes ssh que gardan en memoria as claves para non ter que teclear a passphrase cada vez que se use a clave (durante a sesión do usuario ou por o tempo configurado). No caso de que esto non suceda podemos indicarlle ó axente que a garde.
$ ssh-add
Enter passphrase for /home/magasix/.ssh/id_rsa: Identity added: /home/magasix/.ssh/id_rsa (/home/magasix/.ssh/id_rsa)
A continuación vese a que sucede cando se conecta ó servidor remoto por segunda vez:
$ ssh ubuntu@192.168.100.101
Last login: Sat Jan 31 13:56:33 2026 from 192.168.100.1 To run a command as administrator (user "root"), use "sudo <command>". See "man sudo_root" for details.
Agora, a pesar de que a clave privada está protexida por unha passphrase, non se pide a passphrase xa que o axente ssh do sistema tena en memoria.
NOTA: no caso de que non haxa un axente arrincado por defecto no sistema operativo, hai que proceder a executalo da seguinte forma:
$ eval $(ssh-agent
Agent pid 430607
$ ssh-add -l
The agent has no identities.
$ ssh-add
Enter passphrase for /home/asir/.ssh/id_rsa: Identity added: /home/asir/.ssh/id_rsa (Identidade manuel - curso platega) <pre> $ ssh-add -l <pre> 4096 SHA256:vGQ+CiwNx+mxSb8m4Zcz3fBzEaZszxIZAPYb5ZEc5Pw Identidade manuel - curso platega (RSA)
Traballando con máis dunha identidade dixital
Non estamos limitados a ter unha única identidade dixital e podemos crear varias identidades dixitais (parella de claves pública-privada) e usalas según nos conveña. A modo de exemplo, no equipo remoto hai un usuario chamado asir04 con contrasinal pokemon ó que lle está permitido o acceso por ssh:
$ ssh asir04@192.168.100.101
asir04@192.168.100.101's password: Last login: Sat Jan 31 16:24:14 2026 from 192.168.100.1
Crearemos unha nova identidade dixital coa clave privada sen passphrase para acceder ó equipo remoto como usuario asir04 (cando pida a passphrase prememos Intro para non protexela). Empregamos a opción -f para indicar a ubicación e o nome das novas claves (para non machacar a identidade anterior):
$ ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa_asir04 -C "id para asir04 - non protexida"
Generating public/private rsa key pair. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/asir/.ssh/id_rsa_asir04 Your public key has been saved in /home/asir/.ssh/id_rsa_asir04.pub The key fingerprint is: SHA256:PbpRb7MxfhVgh2CfVClBKOttG1G5ytiGC3594Ol3mHM id para asir04 - non protexida The key's randomart image is: +---[RSA 4096]----+ | o++=..| | ...oB.o | | o oo= | | o . . . | | S X o .| | . * % .| | . + * @ o. | | . = B @.E | | o ..=.+ | +----[SHA256]-----+
$ ls -lhF .ssh/
total 24K -rw------- 1 asir asir 3,4K ene 31 13:51 id_rsa -rw------- 1 asir asir 3,4K ene 31 16:27 id_rsa_asir04 -rw-r--r-- 1 asir asir 756 ene 31 16:27 id_rsa_asir04.pub -rw-r--r-- 1 asir asir 759 ene 31 13:51 id_rsa.pub -rw------- 1 asir asir 2,9K ene 31 13:33 known_hosts -rw------- 1 asir asir 2,1K ene 31 13:33 known_hosts.ol
Copiamos a identidade dixital no equipo remoto no arquivo de claves autorizadas para o usuario asir04. Fixarse que especificamos a clave pública a copiar coa opción -i e identificámonos como o usuario asir04:
$ ssh-copy-id -i .ssh/id_rsa_asir04.pub asir04@192.168.100.101
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: ".ssh/id_rsa_asir04.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 asir04@192.168.100.101's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'asir04@192.168.100.101'" and check to make sure that only the key(s) you wanted were added.
Agora podemos entrar no equipo remoto como usuario ubuntu ou asir04 indicando a identidade dixital adecuada coa opción -i arquivo_clave_privada.
Como ubuntu:
$ ssh -i .ssh/id_rsa ubuntu@192.168.100.101
Last login: Sat Jan 31 16:24:34 2026 from 192.168.100.1 To run a command as administrator (user "root"), use "sudo <command>". See "man sudo_root" for details.
Como asir04:
$ ssh -i .ssh/id_rsa_asir04 asir04@192.168.100.101
Last login: Sat Jan 31 16:24:48 2026 from 192.168.100.1
Podemos engadir esta nova id. dixital ó axente:
$ ssh-add .ssh/id_rsa_asir04
Identity added: .ssh/id_rsa_asir04 (id para asir04 - non protexida)
$ ssh-add -l
4096 SHA256:vGQ+CiwNx+mxSb8m4Zcz3fBzEaZszxIZAPYb5ZEc5Pw Identidade manuel - curso platega (RSA) 4096 SHA256:PbpRb7MxfhVgh2CfVClBKOttG1G5ytiGC3594Ol3mHM id para asir04 - non protexida (RSA)
A autenticación por claves é vaĺida non só para obter a liña de comandos senón para traballar con ssh en modo comando e scp:
$ ssh -i .ssh/id_rsa_asir04 asir04@192.168.100.101 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
56: eth0@if57: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 10:66:6a:1b:3d:99 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.100.101/24 brd 192.168.100.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::1266:6aff:fe1b:3d99/64 scope link
valid_lft forever preferred_lft forever
$ scp -i ~/.ssh/id_rsa webmin_1.670_all.deb ubuntu@192.168.100.101: webmin_1.670_all.deb 100% 21MB 20.8MB/s 00:00
Isto foi un exemplo para ver como se poden ter varias identidades dixitais e non habería ningún problema en usar a mesma identidade dixital para autenticarse no equipo remoto como usuario ubuntu e asir04.
Configurando o cliente ssh
No exemplo anterior empregamos dúas identidades dixitais para acceder ó mesmo equipo como dous usuarios diferentes. Pode suceder que teñamos que acceder a múltiples equipos por ssh posiblemente empregando diferentes usuarios, diferentes identidades dixitais, diferentes formas de autenticación, co servizo ssh correndo en diferentes portos, ... É posible configurar estos perfís na nosa conta de usuario a través do arquivo ~/.ssh/config. Por exemplo:
$ nano .ssh/config
Host ubuntu_serverssh
User ubuntu
Hostname 192.168.100.101
Port 22
PubkeyAuthentication yes
IdentityFile ~/.ssh/id_rsa
Host asir04_serverssh
User asir04
Hostname 192.168.100.101
Port 22
PubkeyAuthentication yes
IdentityFile ~/.ssh/id_rsa_asir04
Host asir02_serverssh
User asir02
Hostname 192.168.100.101
Port 22
PubkeyAuthentication no
Host serverdmz
User ubuntu
Hostname 192.0.2.254
Port 22000
PubkeyAuthentication no
Creamos catro perfís coas seguintes características:
- Perfil ubuntu_serverssh: para acceder ó equipo 192.168.100.101 como usuario ubuntu empregando autenticación por claves usando a identidade dixital id_rsa.
- Perfil asir04_serverssh : para acceder ó equipo 192.168.100.101 como usuario asir04 empregando autenticación por claves usando a identidade dixital id_rsa_asir04.
- Perfil asir02_medusa: para acceder ó equipo 192.168.100.129 como usuario asir02 empregando autenticación por contrasinal.
- Perfil serverdmz: para acceder ó equipo 192.0.2.254 polo porto tcp/22000 como usuario ubuntu empregando autenticación por contrasinal.
Para usar un perfil hai que escribir ssh <perfil>:
$ ssh ubuntu_serverssh
Last login: Sat Jan 31 16:28:45 2026 from 192.168.100.1 To run a command as administrator (user "root"), use "sudo <command>". See "man sudo_root" for details.
$ ssh asir04_serverssh
Last login: Sat Jan 31 16:28:52 2026 from 192.168.100.1
Co comando man ssh_config pódese acceder á documentación de axuda dos arquivos de configuración do cliente openssh.