Переадресація агента SSH з використанням різних імен користувачів та різних ключів


19

Існує дуже схоже запитання, яке, якщо відповісти, можливо, було б відповіддю на це питання. На жаль, це випадок "не потрібно відповідати на запитання, яке я задав, оскільки проблема була не такою, якою я вважав це".

Налаштування

  1. Сервер bastion.ec2 приймає ssh-з'єднання з моєї робочої станції черезssh -i mykey.pem myname@bastion.ec2
  2. Сервер service1.ec2 приймає ssh-з'єднання лише з bastion.ec2 viassh -i sharedkey.pem shareduser@service1.ec2

Вимоги

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

Рішення

Тут ви заходите. Як я можу переслати інший ключ для 2-го з'єднання?

Якби у спільного користувача був mykey.pub, ~/.ssh/authorized_keysце працює:

ssh -i mykey.pem myname@bastion.ec2 ssh shareduser@service1.ec2

Однак я не хочу, щоб кожен користувач мав ставити свій відкритий ключ на кожному сервері.

Відповіді:


22

Крок 1

Переконайтеся, що ваш місцевий агент готовий

Тільки тому, що ви можете запустити ssh на ваш бастіон-сервер, не вказуючи свій ключовий шлях або отримавши запит на пароль, не означає, що ваш ssh-агент працює і тримає ваш ключ. Деякі сучасні ОС (наприклад, OSX) справляються із цим.

На вашій локальній машині

$ ssh-add -L
ssh-rsa ObahfCbvagGbLbhSbeHfvatEBG13== ~/.ssh/mykey.pem
ssh-rsa LbhNerWhfgJnnlGbbPyrireEBG13== ~/.ssh/sharedkey.pem

рис.1

Це означає, що ваш агент працює і має ваш ключ.

$ ssh-add -L
The agent has no identities.

рис.2

Це означає, що ви не додали жодного ключа до свого агента. Виправте це за допомогою:

ssh-add ~/.ssh/mykey.pem ~/.ssh/sharedkey.pem

рис.3

Крок 2

Переконайтеся, що ваш віддалений агент готовий

SSH у ваш бастіон-сервер і повторіть чек з рис.1 та рис.2 . Однак помилка, яку ви швидше можете отримати, така:

$ ssh-add -L
Could not open a connection to your authentication agent.

рис.4

Це, швидше за все, означає, що ваш клієнт SSH не пересилає з'єднання вашого агента аутентифікації.

Ви можете примусити це за допомогою -Aпрапора (доки дозволяє конфігурація sshd на сервері, що є за замовчуванням ).

$ ssh -A bastion.ec2

рис.5

Крок 3

Переконайтеся, що ви використовуєте праві клавіші

Якщо ви додали ключі до свого агента, ваш агент пересилає, а ваш віддалений агент перелічує ваші локальні ключі. Є лише дві ймовірні причини, по яких ви не отримуєте зв’язок. Або ви не використовуєте праву клавішу, або не використовуєте правильне ім'я користувача.

Виведіть публічний аналог на ваш приватний ключ:

$ cd
$ cd .ssh
$ ssh-keygen -y -f mykey.pem
ssh-rsa ObahfCbvagGbLbhSbeHfvatEBG13
$ ssh-keygen -y -f sharedkey.pem
ssh-rsa LbhNerWhfgJnnlGbbPyrireEBG13

рис.6

Вони повинні бути такими ж , як то , що ви бачили від ssh-add -Lдо до ==ближче до кінця.

Тепер так чи інакше вам доведеться потрапити у вікно, до якого ви не можете підключитися, і подивитися вміст $HOME/.ssh/authorized_keysфайлу для користувача, до якого ви намагаєтесь підключитися. Вам потрібно переконатися, що відкритий ключ, який ви виводите за допомогою команди вище, знаходиться у цьому файлі на рядку сам по собі. Ви не можете повірити, що те, sharedkey.pubщо кубики Bro 2, надіслані вам по електронній пошті, є правильним. Перевірте! Для цього може знадобитися залучити когось іншого, хто може запустити SSH як цей користувач, щоб отримати файл санкціонованого_кейса або отримати root-доступ. Якщо ви зайшли так далеко, і він все ще не працює, ви не можете скористатися ярликами.

Крок 4

Зробити це легко

Сподіваємось, кроки, описані вище, вас змусили. Тепер давайте змусимо цю головну біль згасати до тих пір, поки ви використовуєте цю робочу станцію.

Налаштуйте свій локальний ssh-клієнт

Host *
    # A lot of people put an IdentityFile line in this Host * section.
    # Don't do that unless you will use only 1 key everywhere forever.
    #IdentityFile id_rsa

Host bastion.ec2
    # You want to make sure you always forward your agent to this host.
    # But don't forward to untrusted hosts. So don't put it in Host *
    ForwardAgent yes
    # Go a head and put the IP here in case DNS ever fails you.
    # Comment it out if you want. Having it recorded is a good backup.
    HostName 172.31.0.1
    # You don't want to create a proxy loop later, so be explicit here.
    ProxyCommand none
    # SSH should try using all keys in your .ssh folder, but if you
    # know you want this key, being explicit speeds authentication.
    IdentityFile ~/.ssh/mykey.pem

# Connect effortlessly by hostname or IP address
# This assumes that your internal DNS uses the fake TLD ec2
# This assumes that 172.31.0.0 is your C-Class subnet
Host *.ec2 172.31.*
    # This command says proxy all ssh connections through bastion as if
    # you had done an ssh -A
    ProxyCommand ssh -W %h:%p bastion.ec2
    ForwardAgent yes
    # These next lines are documentation you leave as a love letter to
    # your future self when all else fails or you have to help a
    # coworker and decide to look at your own config.
    # ssh-add ~/.ssh/*.pem
    # ssh -At bastion.ecs ssh admin@172.31.18.19

рис.7

Якщо ви не відбираєте нічого іншого від рис.7, це має бути правильне використання ProxyCommand& ForwardAgent.

Автоматично заповнюйте .bash_profile

Вам не потрібно робити це ssh-addвручну щоразу, коли ви входите в свою машину. ~/.bash_profileце сценарій, який запускається щоразу при вході в систему **. Покладіть рядок із рис. 3 там, і ви завжди повинні бути готовим вашого агента.

** Не плутайте це з тим, .bashrcщо працює для кожного нового [інтерактивного] терміналу. Ваш агент продовжує працювати, навіть якщо ви закриєте всі свої семінари на терміналі. Не потрібно перезавантажувати ключі

Альтернатива використанню .bash_profile

Я також створив суть, яка додає агент запуску OSX / macOS . Ви можете використовувати цей метод для запуску ssh-agentзавантажувача. Встановити дуже просто:

curl -sSL https://gist.github.com/RichardBronosky/429a8fff2687a16959294bcee336dd2a/raw/install.sh | bash

Крок 2: Ви не можете змусити ForwardAgent yesз , -Aякщо господар НЕ дозволяє його.
dlamblin

Дякую @dlamblin, я додав відповідну інформацію та посилання до документації на sshd.
Бруно Броноський,

1

Тут ви заходите. Як я можу переслати інший ключ для 2-го з'єднання?

Ви не пересилаєте ключі. Ви пересилаєте агента, і він може мати повністю незалежні ключі, ніж ви використовуєте для автентифікації в першому стрибку. Перевірте ключі у вашого агента за допомогою ssh-add -L.

Але ще краще, запустіть з'єднання ProxyCommand ssh -W %h:%p myname@bastion.ec2, що дозволить уникнути необхідності переадресації агента, купи чи параметрів командного рядка та необхідності аутентифікації від безпосереднього хоста.

Ви можете просто помістити це у свою конфігурацію (див. man ssh_config).


1
На щастя, я насправді знаю, про що ви тут говорите, але середній користувач цього не зробив би. Ви сперечаєте семантику зі своєю річчю "Ви пересилаєте агенти, а не ключі". Ви дали мені достатньо, щоб продовжувати, щоб я зміг це вирішити, тому я хочу дати вам можливість виправити свою відповідь, перш ніж я додам свою. Підказка: ssh-add mykey.pem sharedkey.pemтоді підтвердьте ssh-add -Lтодіssh -At myname@bastion.ec2 ssh shareduser@service1.ec2
Бруно Броноскі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.