Caché la contraseña si las claves SSH están prohibidas

46

Tengo un servidor al que tengo que acceder con frecuencia a través de ssh, porque lo calculo. Ahora, el centro de cómputo prohíbe explícitamente las claves SSH porque son "inseguras". Sienten que escribir mi contraseña, en un teclado, cada vez que sea posible frente a otros humanos, es una forma mucho más segura de iniciar sesión.

Ahora; No puedo cambiar de opinión (lo intenté).

¿Hay alguna manera de almacenar al menos temporalmente las contraseñas SSH, la forma en que GIT puede almacenar contraseñas en un caché durante un tiempo definido?

usuario2667180
fuente
55
the computing center explicitly forbids SSH-keys because they are "insecure"- mi opinión al respecto? Encuentre un nuevo servidor host, porque el suyo es obviamente inepto.
Matt Clark
18
@Matt: "centro de cómputo" suena más como un sistema de cuadrícula académica, que no tiene tanta competencia, supongo
Grawity
27
Están equivocados. Probablemente se hayan olvidado de deshabilitar las claves ssh cuando caducan las cuentas, por lo que decidieron que las claves ssh son el problema.
Joshua
10
La gracia es correcta. Es una supercomputadora nacional, así que estoy atrapado con ella. por lo que vale, la máquina es buena. Joshua probablemente también tenga razón, pero bueno, ese es el tipo de derecho que no sirve para nada
usuario2667180
77
@TheHansinator Si hay un keylogger instalado, ya se ha visto comprometido hasta el punto en que ya no importa si está protegiendo sus conexiones ssh. Pero hay otras ventajas de la publickeyautenticación. Si deshabilita la passwordautenticación en el servidor, evita que todos los atacantes intenten adivinar las contraseñas. Y si un atacante intenta un ataque mitm contra un cliente que no ha almacenado previamente la clave pública del servidor, está mucho mejor protegido publickeyque si estuviera utilizando la passwordautenticación.
Kasperd

Respuestas:

63

Reutilización de conexión

SSHv2 permite que la misma conexión autenticada establezca múltiples 'canales': shell interactivo, comando por lotes, SFTP, junto con los secundarios, como el reenvío de agente o el reenvío TCP. Su servidor probablemente sea compatible con la multiplexación de conexiones de forma predeterminada. (Si sus administradores se quejan, no está almacenando en caché su contraseña en ninguna parte, está almacenando en caché toda la conexión).

Con OpenSSH tienes ControlMastery ControlPathopciones (-M y -S) para hacer uso de esto:

  1. Inicie una conexión SSH 'maestra' usando -M. (Dado que aún no tiene un ControlPath en su configuración, debe especificarlo en la línea de comandos usando -S. Tiene que vivir mucho tiempo, por lo que agrego las -fNopciones para dejar en segundo plano; de lo contrario, son técnicamente opcionales).

    $ ssh [email protected] -fNMS ~/.ssh/bar.socket
    [email protected]'s password:
    

    Has vuelto a la cáscara local.

  2. Inicie una nueva conexión a través del maestro:

    $ ssh [email protected] -S ~/.ssh/bar.socket
    

    Estas en.

  3. Para que esto sea útil para Git / rsync / SFTP, debe configurarlo ControlPathen su configuración, ya que no podrá especificar -Stodo el tiempo:

    Host *
        ControlPath ~/.ssh/S.%r@%h:%p
    

Puede automatizar esto: también tienen versiones recientes de OpenSSH ControlPersistque establecen automáticamente una conexión maestra en segundo plano si aún no hay una. Esto le permite omitir el paso 1 y simplemente usar ssh como lo haría normalmente.

  1. Configuración en ~/.ssh/config:

    Host *
        ControlPath ~/.ssh/S.%r@%h:%p
        ControlMaster auto
        ControlPersist 15m
    
  2. La primera conexión solicita contraseña:

    $ ssh [email protected]
    [email protected]'s password:
    [foo@bar:~]$ exit
    
  3. El segundo no:

    $ ssh [email protected]
    [foo@bar:~]$ yay
    

Para controlar el maestro multiplex (detenerlo o configurar reenvíos TCP), use la -Oopción

Un método similar es compatible con las versiones recientes de PuTTY .

Gravedad
fuente
1
Muchas gracias por esta buena respuesta. google no fue útil en este problema, ya que siempre recurrió a ssh-keys y no sabía las palabras clave correctas. ¡me ayudo mucho!
user2667180
1
No hay que decirlo, pero si usa esta configuración es imprescindible que se asegure de que su cuenta esté protegida y que su carpeta .ssh esté correctamente bloqueada ya que cualquier persona con acceso a los archivos de canal en esa máquina puede aprovechar su cuenta. conexión y acceda al servidor como usted.
Shellster 01 de
3
@shellster: Te refieres a "cualquiera con el mismo UID", como ya es el caso con ssh-agent. Incluso si abre deliberadamente los permisos del archivo de socket (que son 0600 por defecto), otros usuarios simplemente obtendrán una "falta de coincidencia de multiplex uid".
Grawity
3
@shellster Alguien con root podría instalar un keylogger y robar su contraseña al sistema remoto de todos modos, o hacer cualquier cantidad de cosas nefastas. Si nos preocupa la raíz local, esto no es menos seguro que guardar una clave privada SSH.
amalloy
1
No considero que la raíz local sea una amenaza porque si alguna vez se convierte en una amenaza, eres tostada pase lo que pase. (Al igual que con el espionaje de nivel gubernamental.) Francamente una raíz local podría simplemente reemplazar su cliente ssh y ssh-agent con lo que quieran. ¿Almacenar todas las contraseñas y claves privadas en /root/.secret? Seguro.
Grawity
19

Utilizar sshpass

sshpass ( github , man page ) es una herramienta que alimenta automáticamente la contraseña a ssh. La forma segura de usarlo es esta:

% echo 'correct horse battery staple' > ~/.ssh/compute_password
% chmod go-rw ~/.ssh/compute_password

% sshpass -f ~/.ssh/compute_password ssh foo@host

Esto leerá la contraseña ~/.ssh/compute_password, al igual que un archivo de clave privada sin frase de contraseña. Puede poner el sshpasscomando en un pequeño script de shell o un alias de shell para evitar escribir ese comando completo. Lamentablemente, no he encontrado una manera de hacerlo ~/.ssh/config.

(También es posible especificar la contraseña directamente en la línea de comando para sshpass, pero esto debe evitarse, ya que filtra la contraseña a cualquiera que pueda hacerlo ps)

Comparación con otros métodos.

Por supuesto, este enfoque es menos seguro que la autenticación de clave pública configurada correctamente, pero probablemente ya lo sepa.

También es menos seguro que la respuesta de @grawity sobre la reutilización de la conexión, pero tiene la ventaja de no tener que ingresar la contraseña de manera interactiva.

Podría considerar la respuesta de @grawity como una alternativa a la autenticación de clave pública con una frase de contraseña y almacenamiento en caché de clave privada (es decir ssh-agent). Entonces mi respuesta sería una alternativa a la autenticación de clave pública sin una frase de contraseña en el archivo de clave privada.

marcelm
fuente
3
Si la política del centro de cómputo se escribió en base a "¡pero los pares de claves se almacenan en un disco donde alguien podría robarlos!", Entonces parece que esa política va a ser contraproducente.
Grawity
66
@grawity Bueno, las malas políticas conducen a soluciones aún peores ¯ \ _ (ツ) _ / ¯
marcelm
1
Si genera su contraseña como una secuencia suficientemente larga de caracteres aleatorios (digamos head -c 16 /dev/urandom | base64para 128 bits) y no la usa en otros sistemas, es sabiamente similar a una clave. Tan difícil de fuerza bruta, y tan simple de usar desde el archivo si no está cifrado. Esto también va para el malo, si obtienen el archivo. La única diferencia es que la contraseña se envía al servidor tal cual, mientras que las claves tienen mejores matemáticas para demostrar que posee la clave privada correcta sin revelarla, y en cuanto a usabilidad, es más difícil cifrar el archivo que contiene la contraseña (no herramientas estándar).
ilkkachu
1

Utiliza el administrador de contraseñas.

Algunos administradores de contraseñas (por ejemplo, KeePassXC) tienen la función 'auto-type'. Usted almacena la contraseña en el administrador de contraseñas, desbloquea la base de datos cuando ejecuta el administrador y cada vez que le sshsolicita su contraseña, presiona una combinación de teclas que hace que el administrador de contraseñas escriba su contraseña larga en la consola.

No es necesario copiar, recuerde nada (excepto la contraseña para desbloquear la base de datos) y puede tener una contraseña segura sin mezclar esos 30 caracteres cada vez que intente iniciar sesión.

Puede elegir su favorito de esta lista: https://en.wikipedia.org/wiki/List_of_password_managers

mosca de espuma de poliestireno
fuente
3
No estoy seguro de si la función de tipo automático funciona bien con programas basados ​​en terminales. La detección estará en busca de un título de la ventana específica, y de la misma AutoTyping mejor no tener la fantasía "anti-keylogging" características que KeePass2 tenía ...
grawity
1
@grawity gnome-terminalcambia su título a ssh somehostcuando ssh me pide una contraseña para que pueda comparar la ventana de título con esto sin problemas. No sé nada acerca de las características 'anti-keylogging': estoy usando KeePassXC en la terminal a diario y lo peor que tuve que enfrentar es elegir la cuenta adecuada de la lista.
espuma de poliestireno volar
2
@grawity Las características anti-keylogging deben habilitarse por entrada de todos modos (exactamente por la razón de que muchos programas no admiten pegar).
Bob
0

Otra alternativa es usar un cliente ssh GUI. En Windows, la elección obvia sería PuTTY . También hay una versión Linux de PuTTY, en particular la mayoría de las distribuciones basadas en Debian como Ubuntu normalmente incluyen PuTTY en su repositorio.

Otro cliente realmente bueno es Termius . No solo es compatible con Windows y Linux, sino también con OSX, iOS y Android. Aunque fue diseñado principalmente para teléfonos, la versión de escritorio es bastante buena.

Si no me equivoco, el venerable Hyperterminal en Windows también tiene / tenía un cliente ssh incorporado, pero no he usado Windows en mucho tiempo, así que no estoy completamente seguro.

Todos los clientes GUI incluyen la capacidad de guardar la configuración de conexión que incluye su nombre de usuario y contraseña.

slebetman
fuente
2
"Basado en GUI" no implica automáticamente que permitirá almacenar su contraseña, algo que PuTTY se niega explícitamente a hacer . La versión de HyperTerminal que se incluía con Windows era solo de Telnet, centrada más en enlaces seriales. Tal vez esté pensando en CKermit para Windows que tiene soporte SSH, pero su soporte de cifrado está tan desactualizado que no se conectará fácilmente a muchos servidores actuales.
Grawity