¿Cómo se configura ssh para autenticarse usando claves en lugar de un nombre de usuario / contraseña?

34

¿Cómo se configura ssh para autenticar a un usuario utilizando claves en lugar de un nombre de usuario / contraseña?

ScArcher2
fuente

Respuestas:

27

Para cada usuario: deben generar (en su máquina local) a su par de claves utilizando ssh-keygen -t rsa(la rsapueden reemplazado con dsao rsa1también, aunque no se recomiendan las opciones). Luego deben poner el contenido de su clave pública ( id_rsa.pub) en ~/.ssh/authorized_keysel servidor que está iniciando sesión.

Chris Jester-Young
fuente
Lo único que agregaría a esto es mirar los permisos en el archivo y el directorio.
trent
2
No olvide chmod 0700 .ssh chmod 0600 .ssh / Authorized_keys
Dave Cheney
3
Definitivamente genere las claves de esta manera, pero luego verifique la publicación de @Chris Bunch con respecto a "ssh-copy-id". Esa es la forma de transferir su 'id_rsa.pub'.
Gareth
@ gyaresu: ¡Gracias! ¡Acabo de aprender algo nuevo! :-D
Chris Jester-Young
23

De hecho, prefiero ssh-copy-id , un script que se encuentra en * nix de forma predeterminada (también se puede poner en Mac OS X con la suficiente facilidad) que automáticamente lo hace por usted. Desde la página del manual:

ssh-copy-id es un script que usa ssh para iniciar sesión en una máquina remota (presumiblemente usando una contraseña de inicio de sesión, por lo que la autenticación de contraseña debe estar habilitada, a menos que haya hecho un uso inteligente de múltiples identidades)

También cambia los permisos de inicio del usuario remoto, ~ / .ssh y ~ / .ssh / authorised_keys para eliminar la capacidad de escritura del grupo (lo que de otro modo le impediría iniciar sesión, si el sshd remoto tiene StrictModes establecido en su configuración).

Si se da la opción -i, se usa el archivo de identidad (predeterminado en ~ / .ssh / identity.pub), independientemente de si hay claves en su agente ssh.

Chris Bunch
fuente
2
@Chris Bunch ¡TODOS MIRA AQUÍ! :) ssh-copy-id es definitivamente la forma de compartir el id_rsa.pub
Gareth
1
Genial, nunca supe de esto ... Escribí mi propio guión para hacer exactamente lo mismo: - /
David Z
6

Hum, no lo entiendas. Simplemente cree una clave y comience. :) CÓMO Además, puede prohibir el inicio de sesión mediante contraseña. En, por ejemplo, / etc / ssh / sshd_config:

PasswordAuthentication no
Nodo
fuente
2
Y también necesita establecer UsePAM no (o configurar PAM en consecuencia). Es sorprendente cuántos CÓMO se pierden esta parte. De lo contrario, aún podrá iniciar sesión con una contraseña.
Nathan
3

Esto es bastante sencillo de hacer - hay un tutorial simple para ser encontrado aquí .

Los puntos principales son:

  • Corre ssh-keygenen tu máquina. Esto generará claves públicas y privadas para usted.
  • Copie y pegue el contenido de su clave pública (probablemente en ~/.ssh/id_rsa.pub) en ~/.ssh/authorized_keysla máquina remota.

Es importante recordar que esto le dará a cualquier persona que tenga acceso a la clave privada en su máquina el mismo acceso a la máquina remota, por lo que al generar el par de claves puede optar por ingresar una contraseña aquí para mayor seguridad.

ConroyP
fuente
Recomiendo cortar y pegar en lugar de copiar. Un archivo Author_keys puede contener varias claves, y no desea bloquear las otras claves que ya están allí.
Chris Jester-Young
Mi recorrido favorito ha sido enviado a Wayback Machine: web.archive.org/web/20061103161446/http://…
Philip Durbin
@ Chris ¡Ups - quise copiarlo en el archivo en lugar de sobrescribirlo! Respuesta actualizada ahora para aclarar
ConroyP
1

Para resumir lo que otros han dicho, configurar claves SSH es fácil e invaluable.

En la máquina que va a ser sshing de lo que necesita para generar su par de claves:

claudius:~$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/dinomite/.ssh/id_rsa): <ENTER>
Enter passphrase (empty for no passphrase): <PASSPHRASE>
Enter same passphrase again: <PASSPHRASE>
Your identification has been saved in /home/dinomite/.ssh/id_rsa.
Your public key has been saved in /home/dinomite/.ssh/id_rsa.pub.
The key fingerprint is:
a3:93:8c:27:15:67:fa:9f:5d:42:3a:bb:9d:db:93:db dinomite@claudius

Simplemente presione Intro donde se indique e ingrese una frase de contraseña cuando se le solicite; idealmente, esto es diferente de su contraseña de inicio de sesión habitual tanto en el host actual como en los que utilizará SSH.

A continuación, debe copiar la clave que acaba de generar al host que desea SSH a . La mayoría de las distribuciones de Linux tienen una herramienta ssh-copy-idpara hacer esto:

claudius:~$ ssh-copy-id caligula.dinomite.net
Now try logging into the machine, with "ssh 'caligula.dinomite.net'", and check in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

Si su distribución no tiene eso, entonces debe copiar la clave al host de destino y agregarla al .ssh/authorized_keysarchivo (posiblemente existente) :

claudius:~$ scp .ssh/id_dsa.pub caligula.dinomite.net:
id_dsa.pub                                    100% 1119     1.1KB/s   00:00
claudius:~$ ssh caligula.dinomite.net
Last login: Sat May  9 10:32:30 2009 from claudius.csh.rit.edu
Caligula:~$ cat id_dsa.pub >> .ssh/authorized_keys

Finalmente, para obtener el máximo beneficio de las claves SSH, querrá ejecutar un agente SSH. Si usa un entorno de escritorio (Gnome, KDE, etc.), solo al cerrar sesión y volver a iniciarlo se iniciará un agente SSH para usted. Si no es así, se puede añadir lo siguiente a su shell archivo RC ( .bashrc, .profile, etc.):

SSHAGENT=/usr/bin/ssh-agent
SSHAGENTARGS="-s"
if [ -z "$SSH_AUTH_SOCK" -a -x "$SSHAGENT" ]; then
    eval `$SSHAGENT $SSHAGENTARGS`
trap "kill $SSH_AGENT_PID" 0
fi
Drew Stephens
fuente
1

Esto pretende ser una lista de verificación. Si se sigue punto por punto, se deben cubrir las trampas más comunes para los inicios de sesión sin contraseña. La mayoría de estos puntos se mencionan en otra parte; Esta es una agregación.

Debe haber un ~/.sshdirectorio chmod 700en cada máquina bajo la cuenta que originará o recibirá las conexiones.

La clave (privada) debe generarse sin una frase de contraseña, o puede iniciarse un agente que contendrá una versión descifrada de una clave que contenga una frase de contraseña para que los clientes la utilicen. Comience el agente con ssh-agent $SHELL. Es la $SHELLparte que me llevó un tiempo encontrar. Consulte la página de manual, ya que hay muchos detalles si desea utilizar un agente.

No olvide que, por defecto, las versiones recientes de sshd no aceptan claves débiles (DSA de <2048 bits).

Lo siguiente debe hacerse en la máquina del lado del cliente para originar una conexión.

  1. Su clave privada debe colocarse en ~/.ssh/id_rsao ~/.ssh/id_dsasegún corresponda. Puede usar otro nombre, pero luego debe incluirse en una opción -i en el comando ssh en la máquina de origen para indicar explícitamente la clave privada.

  2. Tu clave privada debe ser chmod 600.

  3. Comprueba que tu carpeta de inicio es chmod 700.

Ahora por permitir que una máquina reciba una solicitud. Un modelo común es cuando un administrador le da acceso a una máquina que no es de su propiedad (como el alojamiento web compartido). Por lo tanto, la idea con ssh es que ofrezca su clave pública a quien le esté dando la cuenta. Es por eso que generalmente no coloca claves privadas en la máquina que recibe las solicitudes. Pero, si desea que esta máquina también haga ssh salientes, debe tratarla como una máquina de origen con los pasos anteriores.

  1. Su clave pública debe colocarse en un archivo llamado ~/.ssh/authorized_keysbajo la cuenta que recibirá las conexiones. Aquí también puede colocar otras claves que pueden conectarse a través de esta cuenta. Una cosa particularmente complicada si está en vi y pegando la clave en el archivo desde el búfer de pegado en PuTTY es esta: la clave comienza con un "ssh-". Si no está en modo de inserción, la primera "s" pondrá vi en modo de inserción y el resto de la clave se verá bien. Pero te perderás una "s" al comienzo de la clave. Me llevó días encontrar eso.
  2. Me gusta chmod 600 ~/.ssh/authorized_keys. Debe ser al menos gw.
  3. Ahora, debe tener la huella digital del host agregada al caché. Vaya a la máquina A y ssh a la máquina B manualmente. La primera vez, recibirá una consulta como "¿Desea agregar ... al caché de claves del host?". Si está tratando de obtener la automatización (como un script) para usar este inicio de sesión, debe asegurarse de que el cliente ssh que usa la automatización no reciba este mensaje.
Vic K
fuente
0

Como han dicho otros, sus usuarios deben hacer pares de claves para ellos mismos en sus máquinas cliente con ssh-keygen y agregar su clave pública a ~ / .ssh / Authorizedkeys en la máquina en la que desean iniciar sesión.

Sin embargo, para obtener información más detallada, recomiendo SSH, The Secure Shell .

Neall
fuente
0

Aquí hay buenos consejos, así que no los repetiré. Una vez que configure un servidor para permitirle iniciar sesión con claves, puede configurar otros para que hagan lo mismo con este único revestimiento:

remote=server1 server2 server3 server4
for r in $remote; do echo connecting to $r; tar czf - ./.ssh/id*.pub ./.ssh/authorized_keys2 ./.ssh/config | ssh $r "tar zxf -; chmod 700 .ssh" ; done

Simplemente cd a su directorio de inicio, defina la variable remota como uno o varios nombres de servidor y haga un montón a la vez. La contraseña que solicita será su contraseña ssh para el servidor remoto. Por supuesto, puede usar una versión simplificada sin el ciclo for:

tar czf - ./.ssh/id*.pub ./.ssh/authorized_keys2 ./.ssh/config | ssh YOUR_SERVER_NAME_HERE "tar ztvf -; chmod 700 .ssh"

RECUERDE: solo copie sobre sus claves públicas. No desea que sus claves privadas se encuentren en algún servidor donde cualquier persona con sudo puede copiarlas y forzar su frase de contraseña.

Bruno Bronosky
fuente