Elija identidad de ssh-agent por nombre de archivo

9

Problema: tengo unas 20-30 ssh-agentidentidades. La mayoría de los servidores rechazan la autenticación Too many failed authentications, ya que SSH generalmente no me deja probar 20 claves diferentes para iniciar sesión.

Por el momento, estoy especificando el archivo de identidad para cada host manualmente, utilizando IdentityFilela IdentitiesOnlydirectiva y, de modo que SSH solo pruebe un archivo de clave, que funciona.

Desafortunadamente, esto deja de funcionar tan pronto como las claves originales ya no están disponibles. ssh-add -lme muestra las rutas correctas para cada archivo de clave, y coinciden con las rutas en .ssh/config, pero no funciona. Aparentemente, SSH selecciona la identidad por firma de clave pública y no por nombre de archivo, lo que significa que los archivos originales deben estar disponibles para que SSH pueda extraer la clave pública.

Hay dos problemas con esto:

  • deja de funcionar tan pronto como desconecto la unidad flash con las teclas
  • hace que el reenvío de agentes sea inútil ya que los archivos clave no están disponibles en el host remoto

Por supuesto, podría extraer las claves públicas de mis archivos de identidad y almacenarlas en mi computadora y en todas las computadoras remotas en las que generalmente inicio sesión. Sin embargo, esto no parece una solución deseable.

Lo que necesito es la posibilidad de seleccionar una identidad de ssh-agent por nombre de archivo, de modo que pueda seleccionar fácilmente la clave correcta usando .ssh/configo pasando -i /path/to/original/key, incluso en un host remoto en el que ingresé SSH. Sería aún mejor si pudiera "apodar" las teclas para que ni siquiera tenga que especificar la ruta completa.

leoluk
fuente
1
¿Por qué necesitas muchas identidades ssh? Si es para evitar que una clave privada comprometida otorgue acceso a todas sus cuentas, ¿por qué las guarda en una sola unidad flash? No es la primera vez que escucho sobre problemas relacionados con la gestión de múltiples identidades ssh, pero nunca tuve la oportunidad de preguntar por qué son necesarios.
Dmitri Chubarov
Nunca dije que todos ellos están en una unidad flash.
leoluk
3
@DmitriChubarov Una posible aplicación para múltiples identidades ssh es un authorized_keysarchivo que, dependiendo de la clave utilizada, ejecuta diferentes comandos, sin permitir el acceso directo al shell.
Tobias Kienzler

Respuestas:

8

Supongo que tendré que responder mi propia pregunta, ya que no parece haber ninguna forma de solicitar una identidad por nombre de archivo.

Escribí scripts de Python rápidos y sucios que crean un archivo de clave pública .ssh/fingerprintspara cada clave que tiene el agente. Entonces puedo especificar este archivo, que no contiene ninguna clave secreta, usando IdentityFiley SSH elegirá la identidad correcta del agente SSH. Funciona perfectamente bien y me permite usar el agente para todas las claves privadas que desee.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""Dumps all public keys held by ssh-agent and stores them in ~/.ssh/fingerprints/, so that
they can be identified using the IdentityFile directive.

"""

import sys, os
import stat
import re
import envoy

RE_MATCH_FILENAME = re.compile(r'([^\\/:*?"<>|\r\n]+)\.\w{2,}$', re.IGNORECASE)

if os.getuid() == 0:
    USERNAME = os.environ['SUDO_USER']
else:
    USERNAME = os.environ['USER']

def error(message):
    print "Error:", message
    sys.exit(1)

def main():
    keylist = envoy.run('ssh-add -L').std_out.strip('\n').split('\n')

    if len(keylist) < 1:
        error("SSH-Agent holds no indentities")

    for key in keylist:
        crypto, ckey, name = key.split(' ')
        filename = os.path.join(os.environ['HOME'], '.ssh/fingerprints',
                  RE_MATCH_FILENAME.search(name).group(1)+'.pub')

        with open(filename, 'w') as f:
            print "Writing %s ..." % filename
            f.write(key)

        envoy.run('chmod 600 %s' % filename)
        envoy.run('chown %s %s' % (USERNAME, filename))


if __name__ == '__main__':
    main()
leoluk
fuente
Buen trabajo, lo intentaré pronto
Tobias Kienzler
3

correr

ssh-add -L | gawk ' { print $2 > $3 ".pub" } '

en la máquina remota para generar automáticamente todos los archivos de clave pública (suponiendo que las claves públicas en su .ssh/confignombre sean nombradas privateKeyFileName.puby que no haya rutas inconsistentes involucradas). Llame chown $USER .ssh/*para su sudocaso.

Tobias Kienzler
fuente
1

Retomando la solución aceptada y suponiendo que solo desea reutilizar la identidad utilizada para obtener acceso al servidor inicial, entonces algo como:

Host github.com
    IdentitiesOnly yes
    IdentityFile ~/.ssh/authorized_keys

es suficiente

cagney
fuente
Esto no funciona para mí. Cuando el archivo de identidad solo tiene una clave pública, funciona, pero no cuando es múltiple.
ygrek