Autenticación mediante clave pública y privada con SSH

Escrito por el .
gnu-linux planeta-codigo seguridad
Comentarios

GNU
Linux

Una de las formas más comunes de autenticar a un usuario, comprobar que un usuario es quien dice ser, es mediante un usuario y contraseña. Contraseña que (en principio) solo conoce el usuario por lo que si este proporciona la correcta se determina que es quien dice ser. Sin embargo, las contraseñas son débiles si no incluyen letras en mayúsculas y minúsculas, números y símbolos pero también difíciles de recordar agravado porque en cada servicio se debería usar una diferente para impedir que ante el descubrimiento de una no sea posible acceder a todos los otros servicios donde se usase la misma.

Para generar contraseñas fuertes se puede usar Strong Password Generator y para almacenarlas el programa KeePassXC.

Con OpenSSH también se puede iniciar sesión de línea de comandos en otro sistema proporcionando un usuario y una contraseña que se solicitará. O mejor aún con una clave pública y privada sin necesidad de introducir una contraseña.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ ssh ubuntu@192.168.33.10
Welcome to Ubuntu 18.04.2 LTS (GNU/Linux 4.15.0-48-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Fri May  3 18:04:48 UTC 2019

  System load:  0.0               Processes:             102
  Usage of /:   10.0% of 9.63GB   Users logged in:       1
  Memory usage: 6%                IP address for enp0s3: 10.0.2.15
  Swap usage:   0%                IP address for enp0s8: 192.168.33.10


0 packages can be updated.
0 updates are security updates.


Last login: Fri May  3 18:04:00 2019 from 192.168.33.1
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

ubuntu@ubuntu-bionic:~$

Usar SSH es más seguro y más cómodo que usar contraseñas para realizar la autenticación, es más seguro ya que una clave pública y privada son más largas y es más cómodo ya que no se solicita contraseña constantemente que de otra manera al cabo de un tiempo se convierte en un paso tedioso y molesto. Lo primero que hay que hacer es generar una clave SSH pública y privada propia. Una clave de 2048 bits ya se considera segura pero como cuesta lo mismo generar una de más bits se puede generar una de 8192 bits para más seguridad.

1
2
$ openssl genrsa -out ubuntu 8192
$ ssh-keygen -y -f ubuntu > ubuntu.pub

En el servidor SSH se deben modificar algunas propiedades de configuración del archivo de configuración /etc/ssh/sshd_config para permitir la autenticación con usuario y contraseña para poder copiar la clave pública y una vez copiada la clave para mayor seguridad no permitir la autenticación mediante usuario y contraseña.

1
PasswordAuthentication yes

Una vez generado el par de claves hay que copiar la clave pública al servidor donde se desee iniciar sesión. Manualmente concatenando la clave pública al archivo _.ssh/authorizedkeys del directorio home del usuario con el que se quiere iniciar sesión o también se puede copiar la clave pública usando el comando ssh-copy-id. Para revocar el acceso mediante esa clave basta con eliminar su linea del archivo de claves autorizadas.

1
$ ssh-copy-id -i ~/.ssh/ubuntu ubuntu@192.168.33.10
1
$ sudo passwd ubuntu

Si se poseen varios pares de claves públicas y privadas se puede especificar que clave privada usar para cada máquina a la que se desee conectar en el archivo ~/.ssh/config.

1
2
3
4
Host 192.168.33.10
    HostName 192.168.33.10
    User ubuntu
    IdentityFile ~/.ssh/ubuntu

La clave privada debe tener permisos restringidos sino se muestra una advertencia e impide el inicio de sesión.

1
$ chmod 600 ubuntu

Para probar la autenticación con SSH se puede utilizar una máquina virtual de VirtualBox creada con Vagrant. En el caso de utilizar el usuario ubuntu hay que asignarle una clave con el comando passwd para ejecutar comando ssh-copy-id ya que se solicita su contraseña en este paso, una vez realizado se puede desactivar la autenticación mediante usuario y contraseña cambiando el valor de la configuración PasswordAuthentication a no.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/bionic64"

  config.vm.provider :virtualbox do |vb|
    vb.name = "Ubuntu 18.04 (Vagrant)"
  end

  config.vm.network "private_network", ip: "192.168.33.10"

  config.vm.provider "virtualbox" do |vb|
    vb.memory = "2048"
  end
end
1
$ vagrant up