Autenticación por claves no servizo SSH

De MediaWiki
Revisión del 20:23 10 feb 2026 de Joselv (discusión | contribuciones) (Página creada con « = 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,…»)
(dif) ← Revisión anterior | Revisión actual (dif) | Revisión siguiente → (dif)
Ir a la navegación Ir a la búsqueda

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:

  1. Crear a identidade dixital
  2. 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.