Виберіть особу від ssh-агента за назвою файлу


9

Проблема: у мене є 20-30 ssh-agentосіб. Більшість серверів відмовляються від автентифікації Too many failed authentications, оскільки SSH зазвичай не дає мені спробувати 20 різних клавіш для входу.

На даний момент я вказую файл ідентичності для кожного хоста вручну, використовуючи IdentityFileі IdentitiesOnlyдирективу, так що SSH спробує лише один ключ-ключ, який працює.

На жаль, це припиняє роботу, як тільки оригінальні клавіші більше не доступні. ssh-add -lпоказує мені правильні шляхи для кожного ключового файлу, і вони співпадають із шляхами .ssh/config, але це не працює. Мабуть, SSH вибирає відступ за підписом відкритого ключа, а не за назвою файлу, а це означає, що оригінальні файли повинні бути доступними, щоб SSH могла витягти відкритий ключ.

З цим є дві проблеми:

  • він припиняє роботу, як тільки я відключаю флешку, утримуючи клавіші
  • це робить переадресацію агента марною, оскільки файли ключів недоступні на віддаленому хості

Звичайно, я міг витягти відкриті ключі з моїх файлів посвідчень і зберігати їх на своєму комп’ютері, а також на кожному віддаленому комп’ютері, як правило, входжу. Однак це не виглядає бажаним рішенням.

Що мені потрібно - це можливість вибрати особу від ssh-агента за назвою файлу, щоб я міг легко вибрати потрібну клавішу за допомогою .ssh/configабо передачі -i /path/to/original/keyнавіть на віддаленому хості, в який я входив SSH. Було б навіть краще, якби я міг «прозвати» ключі, щоб мені навіть не довелося вказувати повний шлях.


1
Навіщо вам потрібно багато ідентифікаторів ssh? Якщо уникнути, коли один компрометований приватний ключ надає доступ до всіх ваших облікових записів, то чому ви тримаєте їх на одній флешці? Це не перший раз, коли я чую про проблеми, пов’язані з управлінням декількома особами ssh, але ніколи не було можливості запитати, для чого вони потрібні.
Дмитро Чубаров

Ніколи не говорив, що всі вони знаходяться на одній флешці.
leoluk

3
@DmitriChubarov Однією з можливих застосувань для декількох ідентифікаторів ssh є authorized_keysфайл, який, залежно від використовуваного ключа, виконує різні команди, не допускаючи ніколи прямого доступу до оболонки.
Тобіас Кіенцлер

Відповіді:


8

Напевно, мені доведеться відповісти на власне запитання, оскільки, схоже, не існує жодного способу вимагати ідентифікацію за іменем файлу.

Я написав швидкий і брудний сценарії Python, який створює файл відкритого ключа .ssh/fingerprintsдля кожного ключа, який тримає агент. Потім я можу вказати цей файл, який не містить секретного ключа, використовуючи, IdentityFileі SSH вибере потрібну ідентифікацію у агента SSH. Працює чудово, і дозволяє мені використовувати агент для стільки приватних ключів, які я хочу.

#!/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()

Хороша робота, я спробую це незабаром
Тобіас Кіенцлер

3

Біжи

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

на віддаленій машині автоматично генерувати всі файли відкритого ключа (якщо припустити, що відкриті ключі у ваших .ssh/configназвані, privateKeyFileName.pubі жодних непомітних шляхів не задіяно). Зателефонуйте chown $USER .ssh/*до своєї sudoсправи.


1

Вибираючи прийняте рішення та припускаючи, що ви просто хочете повторно використовувати ідентифікацію, що використовується для отримання доступу до початкового сервера, то щось на кшталт:

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

достатньо.


це не працює для мене. Коли файл ідентифікатора має лише один відкритий ключ - він працює, але не тоді, коли його кілька.
ygrek
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.