11

Существует очень похожий вопрос, который, если бы ответ, возможно, был ответом на этот вопрос. К сожалению, это тот случай, когда «нет необходимости отвечать на вопрос, который я задал, потому что проблема была не в том, что я думал».

Настройка

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

Требования

  1. Оба ключа есть только на моей рабочей станции, поэтому я не могу выполнить вторую команду, не скопировав ключ
  2. Из соображений безопасности я хочу использовать пересылку ssh-agent вместо копирования ключей ssh в bastion.ec2

Решение

Это где вы входите. Как я могу переслать другой ключ для второго соединения?

Если в shareduser есть mykey.pub в ~/.ssh/authorized_keys это будет работать:

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

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

2 ответа2

15

Шаг 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.

fig.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 в качестве этого пользователя, мог получить вам файл author_keys или получить 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 Launch Agent. Вы можете использовать этот метод для запуска вашего ssh-agent при загрузке. Это очень легко установить:

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

Это где вы входите. Как я могу переслать другой ключ для второго соединения?

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

Но, что еще лучше, запустите соединение через ProxyCommand ssh -W %h:%p myname@bastion.ec2 , что избавит вас от необходимости перенаправлять агент, параметры кучи или командной строки и проверки подлинности с непосредственного хоста.

Вы можете просто вставить это в свой конфиг (см. man ssh_config).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .