Quiero comunicarme entre varias computadoras en mi red (Ethernet estática), a través de SSH. Para hacer eso, 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 máquina?
Sé que hay una forma de agregar algunas líneas al bash_profile
archivo, pero aún necesito escribir la contraseña cada vez que reinicio/inicio sesión en una máquina específica.
if [ -z "$SSH_AUTH_SOCK" ] ; then
eval `ssh-agent -s`
ssh-add
fi
Respuesta aceptada:
Este es un ejemplo típico de una compensación entre seguridad y conveniencia. Por suerte hay varias opciones. La solución más adecuada depende del escenario de uso y del nivel de seguridad deseado.
clave ssh 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 conducir a que se elija una frase de contraseña débil para disminuir la carga de ingresarla repetidamente.
clave ssh con frase de contraseña, con ssh-agent
Agregar lo siguiente a ~/.bash_profile
iniciará automáticamente ssh-agent
y cargue la(s) clave(s) ssh al iniciar sesión:
if [ -z "$SSH_AUTH_SOCK" ] ; then
eval `ssh-agent -s`
ssh-add
fi
Ahora la frase de contraseña debe ingresarse en cada inicio de sesión. Si bien es un poco mejor desde la perspectiva de la usabilidad, esto tiene el inconveniente de que ssh-agent
solicita la frase de contraseña independientemente de si la clave se utilizará o no durante la sesión de inicio de sesión. Cada nuevo inicio de sesión también genera un ssh-agent
distinto instancia que permanece ejecutándose con las claves agregadas en la memoria incluso después de cerrar la sesión, a menos que se elimine explícitamente.
Para matar ssh_agent
al cerrar la sesión, agregue lo siguiente a ~/.bash_logout
if [ -n "$SSH_AUTH_SOCK" ] ; then
eval `/usr/bin/ssh-agent -k`
fi
o lo siguiente a ~/.bash_profile
trap 'test -n "$SSH_AUTH_SOCK" && eval `/usr/bin/ssh-agent -k`' 0
Creando múltiples ssh-agent
las instancias se pueden evitar 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 múltiples instancias de agentes, a menos que se elimine explícitamente, la clave descifrada aún permanece en la memoria después de cerrar la sesión.
En los escritorios, los agentes ssh incluidos con el entorno de escritorio, como el agente SSH de Gnome Keyring, pueden ser un mejor enfoque, ya que normalmente 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.
clave ssh con frase de contraseña, con ssh-ident
ssh-ident
es una utilidad que puede administrar ssh-agent
en su nombre y cargue las identidades según sea necesario. Agrega claves solo una vez a medida que se necesitan, independientemente de la cantidad de terminales, ssh o sesiones de inicio de sesión que requieran acceso a un ssh-agent
. También puede agregar y usar un agente diferente y un conjunto diferente de claves según el host al que se conecte o el directorio desde el que se invoque ssh. Esto permite aislar claves cuando se utiliza el reenvío de agentes con diferentes hosts. También permite usar múltiples cuentas en sitios como GitHub.
Para habilitar ssh-ident
, instálelo y agregue el siguiente alias a su ~/bash_profile
:
alias ssh='/path/to/ssh-ident'
clave ssh con frase de contraseña, con keychain
keychain
es una pequeña utilidad que administra ssh-agent
en su nombre y
permite que el ssh-agent
para seguir ejecutándose cuando finalice la sesión de inicio de sesión. En inicios de sesión posteriores, keychain
se conectará al ssh-agent
existente instancia. 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 reiniciar. En inicios de sesión posteriores, la clave sin cifrar del ssh-agent
existente se utiliza la instancia. Esto también puede ser útil para permitir la autenticación RSA/DSA sin contraseña en cron
trabajos sin claves ssh sin contraseña.
Para habilitar keychain
, instálelo y agregue algo como lo siguiente a ~/.bash_profile
:
eval `keychain --agents ssh --eval id_rsa`
Desde un punto de vista de seguridad, ssh-ident
y keychain
son peores que ssh-agent
instancias limitadas a la duración de una sesión en particular, pero ofrecen un alto nivel de conveniencia. Para mejorar la seguridad de keychain
, algunas personas agregan --clear
opción a su ~/.bash_profile
invocación de llavero. Al hacer esto, las frases de contraseña deben volver a ingresarse al iniciar sesión como se indicó anteriormente, pero cron
los trabajos seguirán teniendo acceso a las claves sin cifrar después de que el usuario cierre la sesión. El keychain
La página wiki tiene más información y ejemplos.
clave ssh sin 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 esté expuesta. Esta es, sin embargo, la única forma de asegurarse de que no sea necesario volver a ingresar la frase de contraseña después de reiniciar.
clave ssh con frase de contraseña, con ssh-agent
, pasar frase de contraseña a ssh-add
del guión
Si bien puede parecer una idea sencilla pasar la frase de contraseña a ssh-add
de un guión, p. echo "passphrase\n" | ssh-add
, esto no es tan sencillo como parece como ssh-add
no lee la frase de contraseña de stdin
, pero abre /dev/tty
directamente para leer.
Esto se puede solucionar con expect
, una herramienta para automatizar aplicaciones interactivas. A continuación se muestra un ejemplo de una secuencia de comandos que agrega una clave ssh utilizando una frase de contraseña almacenada en la secuencia de comandos:
#!/usr/bin/expect -f
spawn ssh-add /home/user/.ssh/id_rsa
expect "Enter passphrase for /home/user/.ssh/id_rsa:"
send "passphrase\n";
expect "Identity added: /home/user/.ssh/id_rsa (/home/user/.ssh/id_rsa)"
interact
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 no es mucho mejor que tener una clave ssh sin contraseña. Si se va a utilizar este enfoque, es importante asegurarse de que expect
El script que contiene la frase de contraseña tiene los permisos adecuados establecidos, lo que lo hace legible, escribible y ejecutable solo por el propietario de la clave.