¿La clave ssh debe llamarse id_rsa?

130

Me he encontrado con este problema un par de veces al crear servidores de compilación con autenticación por clave.

Me preguntaba si alguien más ha experimentado esto. Tengo un par de claves para mi usuario actual que pueden conectarse a diferentes máquinas. Digamos que machine1 y machine2. He pegado mi clave pública en su respectivo archivo de claves autorizadas. La primera que he llamado la primera clave id_rsa y la segunda clave bender.

Cuando intento conectarme a Bender obtengo el siguiente resultado con mi conexión ssh detallada

debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Trying private key: /home/bozo/.ssh/.ssh/identity
debug1: Trying private key: /home/bozo/.ssh/.ssh/id_rsa
debug1: Trying private key: /home/bozo/.ssh/id_dsa
debug1: No more authentication methods to try.
Permission denied (publickey).

Solo ofrece la clave id_rsa, como puede ver arriba. ¿Es esto correcto? Si es así, ¿por qué? ¿Cómo consigo que ofrezca más llaves? Sé que es un problema que veo de forma intermitente, porque en casa tengo varias teclas sin muchos problemas.

También agradecería una descripción general de cómo interactúan las claves privadas y de pub con el cliente y el servidor. Pensé que tenía una idea bastante decente, pero aparentemente me falta algo.

Por favor y gracias.

myusuf3
fuente

Respuestas:

157

Por defecto, ssh busca id_dsay id_rsaarchivos. Las claves no tienen que nombrarse así, puede nombrarlas de la misma mykeymanera o incluso colocarlas en un directorio diferente. Sin embargo, si hace cualquiera de esos, entonces necesita hacer referencia explícita a la clave en el comando ssh de la siguiente manera:

ssh user@server -i /path/to/mykey

Si un comando no acepta -i, por ejemplo sshfs, use la IdentityFileopción:

sshfs -o IdentityFile=/path/to/mykey user@host:/path/on/remote /mountpoint

Cómo funciona

Al generar una clave, obtendrá dos archivos: id_rsa(clave privada) y id_rsa.pub(clave pública). Como lo sugieren sus nombres, la clave privada debe mantenerse en secreto y la clave pública puede publicarse.

La autenticación de clave pública funciona con una clave pública y una privada. Tanto el cliente como el servidor tienen sus propias claves. Al instalar openssh-serverel servidor, las claves públicas y privadas se generan automáticamente. Para el cliente, tendrá que hacerlo por su cuenta.

Cuando usted (cliente) se conecta con un servidor, se intercambian claves públicas. Recibirá los servidores uno y el servidor suyo. La primera vez que reciba la clave pública del servidor, se le pedirá que la acepte. Si esta clave pública cambia con el tiempo, se le advertirá porque se está produciendo un posible ataque MITM (Hombre en el medio), interceptando el tráfico entre el cliente y el servidor.

El servidor verifica si tiene permiso para conectarse (definido en /etc/ssh/sshd_config) y si su clave pública aparece en el ~/.ssh/authorized_keysarchivo. Posibles razones por las cuales se niega la clave pública:

  • /etc/ssh/sshd_config:
    • AllowUserso AllowGroupsse especifica, pero el usuario de su servidor no figura en la lista de grupos o usuarios (el valor predeterminado no está definido, lo que no restringe el inicio de sesión de los usuarios o grupos).
    • DenyUserso DenyGroupsse especifica y estás en la lista de usuarios o grupos.
    • Estás intentando iniciar sesión como root, pero PermitRootLoginestá configurado en No(predeterminado yes).
    • PubkeyAuthenticationestá establecido en No(predeterminado yes).
    • AuthorizedKeysFileestá configurado en una ubicación diferente y las claves públicas no se agregan a ese archivo (predeterminado .ssh/authorized_keys, relativo al directorio de inicio)
  • ~/.ssh/authorized_keys: su clave pública no se agrega a este archivo (tenga en cuenta que este archivo se lee como usuario root)

Usando múltiples llaves

No es raro usar múltiples claves. En lugar de correr ssh user@host -i /path/to/identity_file, puede utilizar un archivo de configuración, ~/.ssh/config.

Las configuraciones comunes son IdentityFile (las claves) y el puerto. La siguiente configuración verificará "id_dsa" y "bender" solo cuando se conecte con ssh youruser@yourhost:

Host yourhost
   IdentityFile ~/.ssh/id_dsa
   IdentityFile ~/.ssh/bender

Si omite Host yourhost, la configuración se aplicará a todas las conexiones SSH. Otras opciones también se pueden especificar para este partido anfitrión, como User youruser, Port 2222, etc. Esto permitirá conectar con la abreviatura ssh yourhosten lugar de ssh -p2222 youruser@yourhost -i ~/.ssh/id_dsa -i ~/.ssh/bender.

Lekensteyn
fuente
1
¿Por qué necesito especificar la clave? todo el asunto es para que yo pueda hacer ssh a la máquina más fácilmente.
myusuf3
2
@StevenRoose de ssh_config(5): El nombre del archivo puede usar la sintaxis de tilde para referirse al directorio de inicio de un usuario o uno de los siguientes caracteres de escape: '% d' (directorio de inicio del usuario local), '% u' (nombre de usuario local), '% l '(nombre de host local),'% h '(nombre de host remoto) o'% r '(nombre de usuario remoto). No es posible especificar comodines, pero supongo que esto debería ser lo suficientemente conveniente. Tenga en cuenta que un servidor tiene que sondear cada clave que envió, por lo que es mejor especificar menos claves. Los comodines en el host funcionan, consulte nuevamente la página del manual de ssh_config(5).
Lekensteyn
2
@therobyouknow No tiene que crear un par de claves único para cada máquina. Por lo general, tiene pocas claves y agrega la clave pública de una de las claves al .ssh/authorized_keysarchivo en las máquinas remotas. Si usa el .ssh/id_rsanombre de archivo estándar (o id_dsa, id_ecdsa o el reciente id_ed25519), ssh lo intentará automáticamente y no necesita especificarlo IdentityFileen su configuración (o el -i path/to/id_fileparámetro para ssh).
Lekensteyn
44
Me encantan las respuestas que van más allá de los detalles requeridos y se toman el tiempo para explicar el concepto. Maravilloso trabajo! +1
usuario2490003
1
@landed Es el host del servidor SSH (podría ser una dirección IP o un nombre DNS). He tratado de aclarar esa sección, espero que ayude.
Lekensteyn
40

Mi método favorito permite que la clave privada se seleccione automáticamente

IdentityFile ~/.ssh/%l_%r@%h_id_rsa

SSH reemplazará% l con el nombre de la máquina local,% r con el nombre de usuario remoto y% h con el host remoto, por lo tanto, si quisiera conectarme desde mi máquina llamada foo to bar como usuario, ejecuto:

ssh bar

Y ssh usaría automáticamente:

~/.ssh/foo_user@bar_id_rsa

Como el host local también se almacena, esto permite que los directorios de inicio se compartan a través de NFS (¡clave diferente por máquina!) O incluso que identifiquen en qué máquina estaba la clave ...

Colmillo Viper
fuente
1

Teniendo en cuenta el comentario de StevenRoose de que lleva más tiempo especificar muchas teclas, y estoy jugando con muchas teclas, me gustaría sugerir mi solución personal.

Creo un enlace simbólico a la clave que quiero usar en ese momento, y dado que eso solo cambia con poca frecuencia dependiendo del proyecto en el que estoy trabajando, estoy contento con él.

Aquí he vinculado a mis claves para máquinas que se ejecutan en virtualbox:

$ cd .ssh/
$ ln -s adam_vbox-id_rsa.pub id_rsa.pub
$ ln -s adam_vbox-id_rsa id_rsa

$ ls -l
total 12
-rw------- 1 adam adam 1675 2013-10-04 02:04 adam_vbox-id_rsa
-rw-r--r-- 1 adam adam  396 2013-10-04 02:04 adam_vbox-id_rsa.pub
lrwxrwxrwx 1 adam adam   16 2013-10-04 02:17 id_rsa -> adam_vbox-id_rsa
lrwxrwxrwx 1 adam adam   20 2013-10-04 02:17 id_rsa.pub -> adam_vbox-id_rsa.pub
-rw-r--r-- 1 adam adam 3094 2013-10-04 02:09 known_hosts

También se podría agregar un script realmente rápido para cambiar a otro conjunto sin tener que volver a escribir manualmente el comando ln .

Nuevamente, esta no es una solución solo para dos teclas, pero para un número mayor, podría ser viable.

ajhcasual
fuente
1
Solo agrego un alias por bash_profile para cada servidor con el que trabajo. Entonces, para un servidor llamado bob, solo tengo esto ... alias bob = "ssh bob.example.com -l pete -i / path / to / key" - entonces simplemente escribo bob - ¡y estoy dentro!
Peter Bagnall
2
Si bien a veces es más fácil "hacer las cosas de la manera que ya sabe", existen enfoques más fáciles si configura claves y hosts .ssh / configs. Este comentario está dirigido tanto al póster como al comentarista @ Peter-Bagnall
Scott Prive