Gestión de claves SSH y conexión remota a servidores

To solve

How can I run ssh-add automatically, without passphrase prompt?


Forzar al cliente ssh a realizar la conexión pidiendo contraseña

Cuando tenemos varias identidades en nuestra máquina remota (porque frecuentemente nos conectamos a varios servidores y usamos una clave privada para cada uno de ellos), es posible que al intentar la conexión a una máquina o robot cuya autenticación es por contraseña, recibamos un mensaje del tipo:
Received disconnect from 192.168.1.179: 2: Too many authentication failures
La solución a este problema es simple https://unix.stackexchange.com/questions/15138/how-to-force-ssh-client-t...

  • Crear el fichero ~/.ssh/config
  • Añadir explícitamente el método de autenticación para cada servidor (host <some hostname or pattern>):
# All servers ending in .home.example require user 'billy' and connect through port 9191
host *.home.example
user billy
port 9191

# Server (robot) 'bb8' in the LAN does not allow ssh key authentication, so password is required (user to be supplied in the command line and port is 22 (default)
host bb8.local
PubkeyAuthentication=no

Crear una nueva clave

https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-...

$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
     Generating public/private rsa key pair.
     Enter a file in which to save the key (/home/you/.ssh/id_rsa): [Press enter]
     Enter passphrase (empty for no passphrase): [Type a passphrase]
     Enter same passphrase again: [Type passphrase again]

La parte pública de la clave hemos de añadirla al servidor remoto (aquél con el que queremos establecer la conexión), dentro del fichero ~/.ssh/authorized_keys:

cat ~/.ssh/id_rsa.pub | ssh USER@SERVER_DNS "mkdir -p ~/.ssh && cat >>  ~/.ssh/authorized_keys"

Añadirla al agente SSH-AGENT

En adelante, todo en el host local.

$ eval `ssh-agent`              # or ' $ eval "$(ssh-agent -s)" '
$ exec ssh-agent bash       # starts a new instance of the bash shell, replacing the current one.
$ ssh-add ~/.ssh/*              # Add keys in  ~/.ssh/
$ ssh-add ~/.ssh/id_rsa     # Add a specific key named 'id_rsa'
$ ssh-add -l                        # Check your keys
$ ssh-add -k                       # Stop the current ssh-agent session

Añadidas al agente, basta con añadir el modificador '-a' para autenticarnos en el servidor (no es necesario especificar el fichero de clave):

$ ssh -a user@server
$ ssh -i ~/.ssh/id_rsa user@server # If the key is not loaded in the ssh-agent

Cargar claves al inicio de la sesión

https://superuser.com/questions/284374/ssh-keys-ssh-agent-bash-and-ssh-add

Editar el fichero .bashrc añadiendo las siguientes líneas al final del mismo:

ssh-add &>/dev/null || eval `ssh-agent` &>/dev/null  # start ssh-agent if not present
[ $? -eq 0 ] && {                                     # ssh-agent has started
ssh-add ~/.ssh/your_private.key1 &>/dev/null        # Load key 1
ssh-add ~/.ssh/your_private.key2 &>/dev/null        # Load key 2
}

Permisos recomendados para los ficheros de las claves

  • .ssh directory: 700 (drwx------)
  • Public key (.pub file): 644 (-rw-r--r--)
  • Private key (id_rsa or .pem): 600 (-rw-------)