SSH utiliza cifrado de clave pública para autentificar la máquina remota y permitir a la máquina remota la autentificación del usuario.
En SSH1 y OpenSSH las claves de máquinas se mantienen en etc/ssh_knownhosts
y en el directorio del usuario ~/.ssh/known_hosts
.
Es posible cambiar la ubicación de estos ficheros
usando en el fichero de configuración ~/.ssh/config
la opción UserKnownHostsFile
.
Al establecer por primera vez una conexión con ssh o sftp se nos avisa de la posibilidad de que la máquina no sea quien aparenta:
nereida:~> sftp user@machine.ull.es Connecting to machine.ull.es... The authenticity of host 'machine.ull.es (193.312.112.190)' can't be established. RSA key fingerprint is a4:1e:f1:35:0d:b1:6c:7d:5c:3e:86:ef:4c:17:8a:a9. Are you sure you want to continue connecting (yes/no)? yesSi respondemos
yes
la conexión continúa:
Warning: Permanently added 'machine.ull.es' (RSA) to the list of known hosts. user@machine.ull.es's password: sftp> bye
Esta precaución se toma por si el adversario subvierte el servidor de nombre
para que machine.ull.es
sea resuelta a su máquina. A continuación puede
hacer un forward de la conexión solicitada a la verdadera máquina machine.ull.es
.
Este es un caso de man-in-the-middle-attack.
~/.ssh/known_hosts
.
El cliente ssh mantiene en ~/.ssh/known_hosts
una base de datos conteniendo las máquinas a las que el usuario
se ha conectado. Cualquier nuevo hosts es añadido al fichero
del usuario:
nereida:~> grep 'machine.ull.es' ~/.ssh/known_hosts machine.ull.es ssh-rsa KEY.....
Si la relación entre la IP de la máquina y su nombre cambian ssh
nos avisa.
Si confiamos en el cambio podemos borrar
la entrada en el fichero ~/.ssh/known_hosts
. De otro
modo ssh
se negará a efectuar la conexión.
Podemos borrarla manualmente o con el comando:
casiano@cc116:~$ ssh-keygen -R rala /home/casiano/.ssh/known_hosts updated. Original contents retained as /home/casiano/.ssh/known_hosts.old
Supongamos que el atacante ha descubierto nuestra clave y ha entrado
en nuestro servidor: ahora puede hacer cat ~/.ssh/known_hosts
y deducir que otros servidores solemos visitar.
Es incluso probable que la clave sea la misma o que tengamos
un sistema de autentificación sin passphrase.
Si se quiere proteger el fichero known_hosts se puede usar la opción -H
de ssh-keygen :
casiano@cc116:~/.ssh$ ssh-keygen -H /home/casiano/.ssh/known_hosts updated. Original contents retained as /home/casiano/.ssh/known_hosts.old WARNING: /home/casiano/.ssh/known_hosts.old contains unhashed entries Delete this file to ensure privacy of hostnames
Este comando reemplaza los nombres de los servidores y las direcciones con representaciones
hash. Estas versiones hash pueden ser usadas por ssh
pero son ilegibles
para un humano. Es posible usar un fichero con una combinacion de entradas hash y
entradas legibles.
La opción HashKnownHosts permite en los ficheros de configuración
permite indicarle a ssh
que debe hacer hashing sobre los nombres y
las direcciones en ~/.ssh/known_hosts
.
Esto no afecta a las ya existentens en el fichero.
Es posible asociar varios nombres/direcciones con la misma clave (o repetirlas):
foo1,foo,192.168.1.1,192.168.1.10 ssh-rsa AAAAB3Nsomething[...] foo2,foo,192.168.1.2,192.168.1.10 ssh-rsa AAAAB3Nsomethingelse[...]
Es posible encontrar las entradas en un fichero hash con la opción -F
casiano@cc116:~/.ssh$ ssh-keygen -F millo # Host millo found: line 10 type RSA |1|BXG98oZImAlC02AQMAmuDb0jadQ=...