¿Cómo configuro SSH para no tener que escribir mi contraseña?


153

¿Cómo configuro SSH para no tener que escribir mi contraseña cuando me conecto a un host?


Se podría argumentar si el uso de tales claves no requiere una contraseña. Para evitar que cualquier persona que obtenga su clave privada pueda abusar de ella, se puede proteger la clave con una contraseña propia. Por supuesto, uno puede dejar esa contraseña en blanco, pero hay muchos casos en los que no se recomendaría.
Arjan

En el último Cygwin con el último SSH, me volvieron a preguntar porque necesitaba hacer un cambio en mi ~/.ssh/configque ahora se requiere PubkeyAcceptedKeyTypes ssh-rsa*,ssh-dss*
HDave el

Respuestas:


164

Genere una clave SSH (si no tiene una)

Si utiliza GNOME, la aplicación de caballito de mar ("Contraseñas y claves de cifrado") puede hacerlo por usted: Archivo -> Nuevo -> Clave de shell segura .

Si prefiere terminal, ejecute para generar un par de claves. Los tipos de pares de claves válidos son:ssh-keygen -t <type>

  • rsa: el valor predeterminado
  • dsa: más o menos equivalente, excepto restringido a claves de 1024 bits
  • ecdsa: misma seguridad con claves más pequeñas, pero relativamente nueva y algo rara en el software SSH.
  • ed25519: Alta seguridad (más resistente a los ataques de canal lateral y generadores de números aleatorios débiles). Generación de firma muy rápida. Muy nuevo. Solo disponible en OpenSSH> = 6.5 .

El programa le pedirá una frase de contraseña y una ubicación donde guardar la nueva clave. Se recomienda usar la ruta predeterminada sugerida porque todas las demás herramientas la buscarán allí.

Suba la clave pública al servidor remoto

Una vez más, el caballito de mar a menudo puede hacer eso por usted: en Mis claves personales , haga clic con el botón derecho en su clave SSH y elija Configurar clave para un shell seguro .

O, ssh-copy-id -i ~/.ssh/id_rsa.pub remote-user@remote-hosten la terminal.

O, completamente manual paso a paso:

  1. Cree un directorio (si aún no existe) nombrado .sshen el directorio de inicio del usuario remoto en el host remoto.
  2. En ese directorio, cree un archivo llamado authorized_keys(si aún no existe).
  3. En caso de que el mando a distancia umaskes más liberal que de costumbre, hacer que el archivo no se puede escribir en grupo: chmod go-w ~/.ssh ~/.ssh/authorized_keys.
  4. Finalmente, de alguna manera copie (agregue) el contenido de su clave pública local ( ~/.ssh/id_rsa.pub) en el ~/.ssh/authorized_keysarchivo remoto .

Cargue la clave en el agente ssh

Si carga su clave privada en un agente ssh , mantendrá la clave descifrada en la memoria. Queremos que esto evite volver a ingresar la contraseña cada vez que ingresemos a un servidor.

Primero, el agente debe iniciarse o la ruta de un socket de comunicación lanzado debe cargarse en una variable. La ejecución de ssh-agent en un terminal generará comandos para asignar y configurar las variables del agente. Estos comandos se pueden guardar en un archivo para usar en un terminal diferente. Alternativamente, uno podría ejecutar estos comandos y olvidarse de reutilizar el mismo agente en otro terminal. por ejemplo: eval $(ssh-agent).

Cargar la clave es una simple cuestión de ejecutar ssh-addy darle la frase de contraseña.

Si está utilizando GNOME, gnome-keyring-daemon generalmente proporciona la misma funcionalidad de agente SSH que ssh-agent, por lo que no debería necesitar iniciar nada. GNOME también cargará y desbloqueará automáticamente la clave al iniciar sesión.

Shell en el servidor remoto sin contraseña

Si todo se hizo correctamente, el uso no le pedirá una contraseña. Si algo está mal con el agente y no con la clave, se le pedirá que ingrese la frase de contraseña y no la contraseña de la cuenta de usuario.ssh user@server

Cualquier cosa que use ssh para la comunicación funcionará sin ingresar la contraseña de la cuenta de usuario cuando se carga la clave correcta en el agente. Programas como scp , sftp y rsync hacen uso de esto.


Notas:

  • Solo necesita una clave SSHv2, ya que SSHv1 es muy inseguro y ahora no se utiliza.
  • También solo necesita un tipo de clave: ya sea RSA o DSA. (ed25519 y ECDSA son recientes y, por lo tanto, no se admiten en todas partes).
  • Todos estos pasos son los mismos para las claves RSA y DSA. Si usa DSA, use en id_dsalugar de id_rsa, y ECDSA lo tendrá id_ecdsa.
  • Se utilizan servidores OpenSSH anteriores a 3.0 authorized_keys2, pero es muy poco probable que encuentre algo más antiguo que 5.0 en uso.
  • Estas instrucciones solo se aplican a OpenSSH versión 3.0 y posteriores. lsh, ssh.comy otros servidores SSH (Unix y no) no se incluyen en este tutorial.

Ejemplos:

  • Copiando la clave pública a un host remoto:

    ssh-copy-id -i ~ / .ssh / id_rsa.pub myaccount @ remotehost # this
    
    cat ~ / .ssh / id_rsa.pub | ssh myaccount @ remotehost \
          'mkdir -p ~ / .ssh; cat >> ~ / .ssh / Authorized_keys '# o esto
    
  • Guardar variables de agente para su reutilización (ejemplo elaborado)
    ssh-agent> ~ / .ssh / cross-terminal-agent
    . ~ / .ssh / cross-terminal-agent
    

77
ah, tienes que decir "ssh-add {ruta-a-archivo-clave-privada}} y luego te pedirá tu frase de contraseña. Haz esto más explícito en tu publicación. También debe agregar "Cuarto, ejecute ssh". Parte del problema con la documentación con estas cosas es que pasa por alto pasos aparentemente obvios que NO son obvios para alguien nuevo en el proceso que no tiene idea de lo que está sucediendo y cómo funcionan estos programas juntos.
Jason S

1
Jason: ssh-add -l es para verificar si un agente se está ejecutando. ssh-add sin argumentos agregará la clave desde la ubicación predeterminada (que es ~ / .ssh / id_rsa). De todos modos, actualizado.
Grawity

44
Hay un comando ssh-copy-idque copia la clave pública en el host de destino y establece los permisos automáticamente.
hasen

1
¡Gran respuesta! Falta un poco acerca de los permisos de archivo de los archivos clave; hoy tuve un problema relacionado con eso. El archivo de clave privada solo debería ser accesible para mí, y el archivo de clave pública solo debería ser editable por mí.
ripper234

1
Un revestimiento: ssh-keygen -f ~/.ssh/id_rsa -N "";ssh-copy-id -i ~/.ssh/id_rsa username@server-ip-or-address(solo reemplace username@server-ip-or-address).
totymedli

22

No especificó en qué Unix está, a qué Unix se está conectando, qué shell está usando, qué variante SSH está usando, etc. Por lo tanto, es posible que deba ajustar un poco esto; Esto se basa en versiones razonablemente recientes de OpenSSH, que se utiliza en muchas variantes de Unix.

Todo esto es de su sistema de escritorio local.

ssh-keygen

Asegúrese de utilizar el valor predeterminado para el nombre clave. Le sugiero que hagas establecer una contraseña de esa tecla, si no es un problema de seguridad. "-t rsa" no sería una mala idea, pero probablemente no sea necesario.

ssh-copy-id username@server

Eso le pedirá la contraseña que usaría para iniciar sesión, y configurará las cosas autorizadas_claves para usted. (no es necesario hacerlo a mano)

Luego esto:

`ssh-agent`

o tal vez esto:

exec ssh-agent sh

o:

exec ssh-agent bash

Eso iniciará un agente SSH que puede guardar su clave. En muchas variantes modernas de Unix, si ha iniciado sesión gráficamente, esto ya habrá tenido lugar. La primera variante (con los backticks) pone un ssh-agent en segundo plano y configura las variables de entorno para hablar con él. Los dos últimos hacen que el agente ejecute un shell para usted, de modo que cuando salga del shell, el agente salga.

Muchas variantes modernas de Unix ya tendrán un agente ejecutándose para usted, especialmente si inició sesión gráficamente. Puede intentar " ps aux | grep ssh-agent" o " ps -ef | grep ssh-agent"; Si algo ya se está ejecutando, úsalo.

Entonces finalmente:

ssh-add

Le pedirá una frase de contraseña; dale el que le diste a ssh-keygen. También hay formas de hacerlo preguntar gráficamente. Y puede poner el material ssh-agent y ssh-add en sus scripts de inicio de sesión (la configuración es diferente según el shell que use) para automatizar esto, pero algunas variantes de Unix (Ubuntu Linux actual, por ejemplo) hacen la mayor parte de eso automáticamente, por lo que que todo lo que realmente necesita hacer es crear una clave y usar ssh-copy-id para configurarla en el host remoto.

Ahora, " ssh username@server" debería funcionar sin pedir ninguna autenticación. Detrás de escena, está usando una llave que tiene el agente ssh y le pide al agente que haga los trucos mágicos para firmarlo.


11

También es posible hacer esto en PuTTY en Windows.

Una vez que tenga el par de claves pública / privada todo configurado (como lo muestran otras respuestas aquí) ejecute PuttyGen. Allí, cargue la clave privada existente que ya configuró y luego guárdela como una clave privada PuTTY (ppk).

Luego, en PuTTY, simplemente haga clic en la sesión guardada en la que desea iniciar sesión automáticamente y haga clic en Cargar. Desde aquí, vaya a Conexión -> Datos en el panel izquierdo, y en "Nombre de usuario de inicio de sesión automático" escriba el nombre de usuario para ese servidor remoto:

Entrada de nombre de usuario PuTTY

Después de eso, vaya a Conexión -> SSH -> Auth, y busque el ppk que creó en PuttyGen:

Entrada de clave privada PuTTY

Luego regrese a la página de sesión y guarde la sesión que cargó anteriormente.


El primer enlace de la imagen, "Entrada de nombre de usuario PuTTY", parece estar roto.
Peter Mortensen

2
PuTTY incluye su propia versión de ssh-agent; se llama concurso. Se ejecuta en la bandeja del sistema y guarda la llave por usted. No necesita ejecutar ssh-agent, simplemente marque "Permitir reenvío de agente" en las opciones de PuTTY en la sección Autenticación, y la conexión del concurso se enviará al extremo remoto para que su agente clave esté disponible.
Kevin Panko

3

A partir de una pregunta muy similar sobre ServerFault , recomendaría usar ssh-copy-id , que realiza todos los pasos necesarios para configurar las claves de autenticación para usted:

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 / certified_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 utiliza el archivo de identidad (predeterminado en ~ / .ssh / identity.pub), independientemente de si hay claves en su agente ssh.

Todo lo que necesitas hacer es simplemente esto:

ssh-copy-id user@host

Escriba su contraseña una vez, ¡y listo!


3

Además de todo lo que ya se ha dicho sobre cómo configurar las claves ssh, recomiendo Keychain como una interfaz de consola ssh-agent que le permite manejar uno solo por proceso del sistema en lugar de por inicio de sesión.

Sé que ya hay herramientas de GNOME y KDE que hacen lo mismo, pero si eres el tipo de adicto a la consola, esto es genial (y se puede usar en la mayoría de los sistemas Unix).

Para usarlo, simplemente agregue lo siguiente a su ~/.bashrc(similar para otros shells):

if type keychain >/dev/null 2>/dev/null; then
  keychain --nogui -q <all your SSH/PGP keys>
  [ -f ~/.keychain/${HOSTNAME}-sh ] && . ~/.keychain/${HOSTNAME}-sh
  [ -f ~/.keychain/${HOSTNAME}-sh-gpg ] && . ~/.keychain/${HOSTNAME}-sh-gpg
fi

2

http://linuxproblem.org/art_9.html

Tu objetivo

Desea usar Linux y OpenSSH para automatizar sus tareas. Por lo tanto, necesita un inicio de sesión automático desde el host A / usuario a al host B / usuario b. No desea ingresar ninguna contraseña, porque desea llamar a ssh desde un script de shell.


1
El voto negativo no fue mío, pero no me importaría que las personas borren su respuesta si notan que alguien más publicó una respuesta casi similar unos momentos antes.
Arjan

2
Arjan: En su mayor parte, estoy de acuerdo contigo, pero cuando las publicaciones solo están separadas por varios segundos, no necesariamente creo que sea justo castigar a la persona en segundo lugar. No estoy diciendo que hay que recompensarlos por Upvoting, pero downvoting da la impresión de que la respuesta es incorrecta, en lugar de no en el tiempo
TheTXI

2

Escribí este tutorial muy corto después de REALMENTE REALMENTE frustrado con tutoriales REALMENTE REALMENTE largos porque realmente es tan simple :)

test -f ~/.ssh/id_rsa.pub || ssh-keygen -t rsa #press enter twice if given prompts, then "ssh-add"

scp ~/.ssh/id_rsa.pub destID@destMachine:/tmp/ #type password

ssh destID@destMachine #type password

cat /tmp/id_rsa.pub >> ~/.ssh/authorized_keys

rm /tmp/id_rsa.pub

2

Putty tiene una -pwopción que le permite crear un acceso directo en el escritorio como este:

"C:\Program Files\PuTTY\putty.exe" -ssh user@192.168.2.2 -pw your_password

1
  1. En el host de conexión, ejecute ssh-keygen. (Si le indica que tiene que especificar un tipo, hágalo ssh-keygen -t rsa). Cuando le solicite una ubicación de archivo, tome el valor predeterminado. Cuando le pida una frase de contraseña, presione enter para que no haya frase de contraseña.
  2. cat ~/.ssh/id_rsa.pub(o cualquiera que sea la ubicación predeterminada del archivo ssh-keygen, aunque tendría que tener una instalación realmente antigua sshpara que sea diferente); copia la salida a tu portapapeles.
  3. Inicie sesión normalmente en el host de destino como la cuenta a la que desea conectarse. Edite el archivo ~/.ssh/authorized_keys(si ~/.sshno existe, sloginen algún lugar; esta es la manera simple y fácil de crearlo con los permisos adecuados). Pegue su portapapeles (que contiene el id_rsa.pubdel otro host) en este archivo.

3
-1 por sugerir no agregar frase de contraseña. Sin una frase de contraseña, cualquiera que lea el archivo ahora puede hacerse pasar por el usuario legítimo.
bortzmeyer

2
Primero, pidió no tener que escribir su contraseña; Realmente no pensé que tener que escribir una frase de contraseña en lugar de su contraseña sería una mejora. Segundo, te equivocas; Es por eso que hay una clave pública y una clave privada, por lo que la clave pública puede estar en el mundo.
caos

La contraseña en cuestión se escribe durante la generación de claves, no cada vez que se conecta. ¿Correcto?
Richard Hoskins el

No. Las claves generadas con una frase de contraseña requieren que se ingrese la frase de contraseña cada vez que se usa la clave.
caos

2
Incorrecto. Con ssh-agent (vea la respuesta aceptada), escriba la contraseña solo una vez por sesión.
bortzmeyer

0

Si quieres hacerlo todo en la terminal en Linux:

En el anfitrión

cd ~ / .ssh /

ssh-keygen -t {rsa | dsa} -b {1024 | 2048 | 4096} -C "algún texto de comentario si lo desea" -f id_ArbitraryName

Los elementos en {} son opciones, use rsa o dsa y elija el tamaño de bit (más grande es más seguro)

Luego, debe agregar los permisos a los archivos autorizado_claves y autorizado_claves2.

id_Arbitrario.pub cat. >> claves_autorizadas

id_AribtraryName.pub de gato >> claves_autorizadas2

Luego, descargue el archivo id_AribtraryName en el cuadro desde el que desea ssh. Si la caja de conexión está basada en Unix, puede ser necesario un archivo de configuración (en la masilla, alguien más arriba lo cubrió).

En la caja de conexión

En su archivo de configuración - vim ~ / .ssh / config

Host example.host.com # o el nombre de su computadora

Nombre de usuario

IdentityFile ~ / .ssh / id_ArbitraryName

El archivo de configuración necesita permisos de 600. La carpeta SSh necesita 700.

Espero que ayude si te encuentras con el problema de configuración que se omite mucho.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.