Quiero comunicarme entre varias computadoras en mi red (Ethernet estática), a través de SSH. Para hacerlo, necesito ejecutar ssh-add cada vez que inicio sesión en una máquina específica, ¿cómo puedo hacerlo para que se configure una vez y no me pida la frase de contraseña cada vez que inicie sesión o reinicie? mi maquina
Sé que hay una manera de agregar algunas líneas al bash_profile
archivo, pero aún necesito escribir la contraseña cada vez que reinicio / inicio de sesión en una máquina específica.
if [ -z "$SSH_AUTH_SOCK" ] ; then
eval `ssh-agent -s`
ssh-add
fi
Respuestas:
Este es un ejemplo típico de una compensación entre seguridad y conveniencia. Afortunadamente hay una serie de opciones. La solución más adecuada depende del escenario de uso y del nivel de seguridad deseado.
ssh-key con frase de contraseña, no
ssh-agent
Ahora se debe ingresar la frase de contraseña cada vez que se usa la clave para la autenticación. Si bien esta es la mejor opción desde el punto de vista de la seguridad, ofrece la peor usabilidad. Esto también puede llevar a que se elija una frase de contraseña débil para disminuir la carga de ingresarla repetidamente.
ssh-key con frase de contraseña, con
ssh-agent
Agregar lo siguiente a
~/.bash_profile
automáticamente iniciarássh-agent
y cargará las claves ssh al iniciar sesión:Ahora se debe ingresar la frase de contraseña en cada inicio de sesión. Aunque es un poco mejor desde una perspectiva de usabilidad, esto tiene el inconveniente de que
ssh-agent
solicita la frase de contraseña independientemente de si la clave se usará o no durante la sesión de inicio de sesión. Cada nuevo inicio de sesión también genera unassh-agent
instancia distinta que permanece ejecutándose con las claves agregadas en la memoria incluso después de cerrar sesión, a menos que se elimine explícitamente.Para matar
ssh_agent
al cerrar sesión, agregue lo siguiente a~/.bash_logout
o lo siguiente para
~/.bash_profile
ssh-agent
Se puede evitar la creación de varias instancias creando un socket de comunicación persistente con el agente en una ubicación fija en el sistema de archivos, como en la respuesta de Collin Anderson . Sin embargo, esta es una mejora con respecto a la generación de instancias de múltiples agentes, a menos que se elimine explícitamente la clave descifrada que aún permanece en la memoria después del cierre de sesión.En los escritorios, los agentes ssh incluidos con el entorno de escritorio, como el agente SSH Gnome Keyring , pueden ser un mejor enfoque, ya que generalmente se pueden hacer para solicitar la frase de contraseña la primera vez que se usa la clave ssh durante una sesión de inicio de sesión y almacenar la clave privada descifrada en la memoria hasta el final de la sesión.
ssh-key con frase de contraseña, con
ssh-ident
ssh-ident
es una utilidad que puede administrarssh-agent
en su nombre y cargar identidades según sea necesario. Agrega claves solo una vez, ya que son necesarias, independientemente de la cantidad de terminales, ssh o sesiones de inicio de sesión que requieren acceso a unssh-agent
. También puede agregar y usar un agente diferente y un conjunto diferente de claves dependiendo del host al que se está conectando o desde el que se invoca el directorio ssh. Esto permite aislar claves cuando se utiliza el reenvío de agentes con diferentes hosts. También permite usar varias cuentas en sitios como GitHub.Para habilitarlo
ssh-ident
, instálelo y agregue el siguiente alias a su~/bash_profile
:ssh-key con frase de contraseña, con
keychain
keychain
es una pequeña utilidad que gestionassh-agent
en su nombre y permitessh-agent
que siga ejecutándose cuando finaliza la sesión de inicio de sesión. En inicios de sesión posteriores,keychain
se conectará a lassh-agent
instancia existente . En la práctica, esto significa que la frase de contraseña debe ingresarse solo durante el primer inicio de sesión después de un reinicio. En inicios de sesión posteriores,ssh-agent
se utiliza la clave no cifrada de la instancia existente . Esto también puede ser útil para permitir la autenticación RSA / DSAcron
sin contraseña en trabajos sin claves ssh sin contraseña.Para habilitarlo
keychain
, instálelo y agregue algo como lo siguiente a~/.bash_profile
:Desde un punto de vista de seguridad,
ssh-ident
ykeychain
son peores que lasssh-agent
instancias limitadas a la vida útil de una sesión en particular, pero ofrecen un alto nivel de conveniencia. Para mejorar la seguridad dekeychain
, algunas personas agregan la--clear
opción a su~/.bash_profile
invocación de llavero. Al hacer esto, las frases de contraseña se deben volver a ingresar al iniciar sesión como se indicó anteriormente, pero loscron
trabajos seguirán teniendo acceso a las claves no cifradas después de que el usuario cierre sesión. Lakeychain
página wiki tiene más información y ejemplos.ssh-key sin frase de contraseña
Desde el punto de vista de la seguridad, esta es la peor opción ya que la clave privada está completamente desprotegida en caso de que quede expuesta. Sin embargo, esta es la única forma de asegurarse de que la frase de contraseña no necesite volver a introducirse después de un reinicio.
ssh-key con frase de contraseña, con
ssh-agent
, pasando la frase de contraseña alssh-add
scriptSi bien puede parecer una idea sencilla pasar la frase de contraseña
ssh-add
de un guión, por ejemploecho "passphrase\n" | ssh-add
, esto no es tan sencillo como parecessh-add
que no lee la frase de contraseñastdin
, sino que se abre/dev/tty
directamente para leer .Esto puede ser trabajado en torno a
expect
, una herramienta para automatizar aplicaciones interactivas. A continuación se muestra un ejemplo de un script que agrega una clave ssh utilizando una frase de contraseña almacenada en el script:Tenga en cuenta que, dado que la frase de contraseña se almacena en texto sin formato en el script, desde una perspectiva de seguridad, esto es apenas mejor que tener una clave ssh sin contraseña. Si se va a utilizar este enfoque, es importante asegurarse de que el
expect
script que contiene la frase de contraseña tenga los permisos adecuados establecidos, por lo que solo el propietario de la clave puede leerlo, escribirlo y ejecutarlo.fuente
ssh-agent
fragmento~/.bash_profile
como se explica en la respuesta. Es posible que desee ver lakeychain
utilidad. Conkeychain
usted debe ingresar la contraseña en el primer inicio de sesión después del reinicio, pero en los inicios de sesión posterioreskeychain
se conectará a unassh-agent
instancia existente con la clave descifrada en la memoria. Aparte de eso, existe la opción de generar una clave ssh sin una frase de contraseña, pero esto, por supuesto, no es recomendable.ssh-add
desde un script. La razón por laecho "pass\n" | ssh-add
que no funciona es quessh-add
no lee la contraseñastdin
, sino que se abre/dev/tty
directamente para leer. Se actualizó la respuesta para incluir una solución alternativa para esto, utilizando una utilidad llamadaexpect
.gssapi-with-mic
. Por lo general, esto se usa en redes más grandes, pero, por supuesto, si le interesa, puede valer la pena analizarlo.Agregue esto a su
~/.bashrc
, luego cierre sesión y vuelva a entrar para que surta efecto.Esto solo debe solicitar una contraseña la primera vez que inicie sesión después de cada reinicio. Continuará reutilizando lo mismo
ssh-agent
mientras siga ejecutándose.fuente
ssh-add -l
devuelve un código de salida de 0 cuando el agente tiene identidades y 1 cuando no lo tiene para que pueda cortar grep del último comando y usarssh-add -l > '/dev/null' || ssh-add
No está estrechamente relacionado con la pregunta del OP, pero podría ser útil para otros: dado que 7.2.0 ssh (1) tiene una opción que permite agregar una clave a ssh-agent en la primera autenticación; la opción es
AddKeysToAgent
y puede ser ajustado enyes
,no
,ask
, oconfirm
, en todo el sistema o en su personal.ssh/config
de archivos.Referencia: https://www.openssh.com/txt/release-7.2
fuente
.ssh/config
archivo: esto se aplica assh
todo lo que se usassh
detrás de él, por ejemploscp
, y se puede hacer por host.ssh-agent
almacena en caché varias claves ssh desbloqueadas, por lo que puede tener las claves ssh protegidas por contraseñas, pero sin tener que escribirlas cada vez.Para almacenar en caché las claves desbloqueadas, obviamente necesita desbloquear esas claves. Para desbloquear claves que están bloqueadas con una frase de contraseña, obviamente necesita conocer estas frases de contraseña.
Cualquier método que no requiera autorización de un ser humano (por ejemplo, "escribir una contraseña") no solo hará que su sistema sea inseguro; también hará que todo el propósito del agente ssh no tenga sentido.
Una vez dicho todo esto, simplemente puede usar claves ssh que no estén protegidas con contraseña (presione Entercuando se le solicite una contraseña durante la generación de claves). Como no hay ninguna contraseña,
ssh-agent
no es necesario que le pida una para (no) almacenarla en caché.fuente
Aquí hay una solución para automatizar su frase de contraseña SSH.
Cree un script de una línea que imprima su frase de contraseña en la salida estándar, por ejemplo:
Importante: asegúrese de copiar el espacio inicial para evitar almacenar su contraseña en su historial .
Y use uno de los siguientes métodos.
utilizando un enfoque de entrada estándar:
o enfoque de tubería con nombre :
Cree una tubería con nombre (también puede intentar una sustitución de proceso ):
Ejecute
ssh-add
especificando el programa utilizado para la autenticación:Ver:
man ssh-add
para leer más sobreSSH_ASKPASS
.fuente
echo my_passphrase
es un gran agujero de seguridad. Primero, después de haberla escrito, la contraseña está en texto claro en el archivo de historial de cualquier shell que use. Y los argumentos de la segunda línea de comando son legibles mundialmente en Unix (ps -ef
). ¡Nunca ponga contraseñas en los argumentos de la línea de comandos!ps
salida. El archivo de historial generalmente solo puede ser leído por el usuario propietario de todos modos, pero las líneas de comando son legibles por todos los usuarios en un sistema.No le recomendaré ssh-add (que necesita abrir un agente ssh) al iniciar sesión. Esto se debe a que no puede controlar cuándo finaliza la sección ssh-agent y puede crear riesgos de seguridad cuando no necesita usar los archivos de claves en una sección de inicio de sesión.
Por el contrario, recomiendo escribir un script que abra la sub-shell de la sección ssh-agent, con todos los archivos de claves agregados automáticamente, y se lo llame cuando sea necesario para usar ssh. Si pudieras adoptarlo, sigue leyendo.
Tendrías dos opciones:
Elimine todas las frases de contraseña de sus claves, que tienen una seguridad débil si sus archivos de claves son robados. (por lo tanto no recomendado )
Use la misma frase de contraseña para sus claves. Luego, cuando lo
ssh-add keyfile1 keyfile2 ...
haga, solo tendrá que escribir la frase de contraseña una vez, por sección.En ambos casos, puede escribir el archivo de script "ssh_keys_section.sh" como se muestra a continuación:
Observaciones:
ssh-keygen -p -f keyfile
/path/to/yourterminal &
(depende del sistema operativo)fuente
/path/to/yourterminal &
==>mintty &
fuente
Solía usar la secuencia de comandos mencionada por steampowered, he creado la siguiente ahora, porque no deja archivos por ahí.
Trabajando
zsh
solo en shell.fuente
Dando crédito aquí: https://www.cygwin.com/ml/cygwin/2001-06/msg00537.html
Esta solución también está respaldada aquí: http://mah.everybody.org/docs/ssh
fuente
La solución de inicio de sesión único para SSH podría llevarme a
pam_ssh
.Según este artículo , el concepto es:
No he verificado que esto realmente funcione.
fuente
Agregue esto a su
~/.bashrc
archivo:fuente
Para agregar una clave (posiblemente sin contraseña) y asegurarse de que
ssh-add
no solicite una contraseña, pase lo que pase, incluso cuando se ejecuta bajo X :El estado de salida indica éxito o fracaso.
fuente
Si está ejecutando seahorse como su administrador de contraseñas ... Lo que probablemente sea; D
Otra solución que logra el objetivo que está buscando es simplemente agregar las claves ssh a seahorse para el desbloqueo automático al iniciar sesión. El principal beneficio de esto es que nunca tiene que ingresar una contraseña para las claves después de iniciar sesión a través de gdm, o lo que sea que esté iniciando sesión incluso si las claves tienen una contraseña. Esto REQUIERE tanto la clave privada como la clave pública. También DEBEN seguir una convención de nomenclatura para caballitos de mar. El valor predeterminado es aceptable (id_rsa para clave privada e id_rsa.pub para clave pública ... Realmente cualquier cosa que sea privatekeyname y privatekeyname.pub )
Para agregar su clave ssh a seahorse para desbloqueo automático al iniciar sesión; (en fedora25, no estoy seguro de dónde está la ruta en otras distribuciones, aunque probablemente sea muy similar)
Para mí fue
(Seahorse asumirá automáticamente que la clave pública en mi caso era id_rsa.pub)
Después de ejecutar el comando, seahorse abrirá un pequeño y lindo campo de contraseña gtk para ingresar la contraseña de la clave privada. o simplemente déjelo en blanco si generó la clave sin contraseña.
Seahorse no te avisará si todo salió bien. Deberá intentar ingresar a la máquina de destino. Luego, seahorse le pedirá que desbloquee la clave con una contraseña gráficamente (ESTO SÓLO OCURRIRÁ UNA VEZ) nuevamente, pero esta vez debería verse un poco diferente; P (esta es también la parte en la que el seahorse hace un poco de caballito de mar para agregar magia, creo) ), y ofrece la OPCIÓN para desbloquear la clave al iniciar sesión, debe marcar esta opción para lograr su objetivo.
Solo porque no leí todas las respuestas, recomendaría deshacer lo que todos te dijeron que hicieras con ssh-add antes de intentar esta respuesta. Hacerlo de otra manera podría resultar en que algo malo le suceda a tus llaves, idk.
fuente
Aquí está el guión definitivo.
Actualice $ PASSW, luego cópielo y péguelo en su Terminal
fuente
La mejor manera que conozco es usar un script de inicio de sesión PAM que adapté del trabajo anterior porque no pude encontrar una respuesta satisfactoria en esta pregunta.
Su frase de contraseña se almacena cifrada con la contraseña de su sistema y una función de derivación pesada. Al iniciar sesión, la contraseña de su sistema se utiliza para descifrar su frase de contraseña y agregarla al agente.
https://github.com/capocasa/systemd-user-pam-ssh
La ventaja sobre cualquier otra solución presentada es que combina seguridad equivalente a ejecutar ssh-add manualmente en el arranque sin esfuerzo. No requiere herramientas adicionales y tiene una dependencia adicional que ya está instalada por defecto en la mayoría de los sistemas (OpenSSL).
fuente
Mi configuración en macOS es la siguiente (en
.zshrc
, o.bash_profile
para gente bash):La
|| [[ $SSH_AUTH_SOCK == *"/private/tmp/"* ]]
parte es necesaria en macOS porque el valor predeterminado es/private/tmp/com.apple.launchd.SOMETHINGHERE/Listeners
. De lo contrario, la respuesta integral de @Thomas Nyman falla porque$SSH_AUTH_SOCK
siempre se establece en algo.Luego en
.zlogout
(o.bash_logout
para gente de bash):Probado en macOS Mojave 10.14.5
fuente