Допустим, у меня есть ключ для Github вместе с другими ключами. Я добавил много ключей к своему ssh-агенту (ssh-add -L
возвращает много строк) на моем домашнем компьютере A. В моем .ssh/config
Я установил, какой ключ использовать с каким хостом, например,
ssh -T -vvv git@github.com 2>&1 | grep Offering
дает
debug1: Offering RSA public key: /Users/doxna/.ssh/id_rsa.github
Как и ожидалось, предлагается только один ключ. Но затем ssh-ing на какой-то хост B с ForwardAgent yes
и повторяя ту же команду, я получаю
debug1: Offering RSA public key: /Users/doxna/.ssh/id_rsa.linode2
debug1: Offering RSA public key: /Users/doxna/.ssh/id_rsa.helium
debug1: Offering RSA public key: /Users/doxna/.ssh/id_rsa.github
это означает, что он пробует все мои ключи. Это проблематично, так как только ограниченное количество ключей можно попробовать до того, как сервер вернется. Too many authentication failures
. Я попробовал отредактировать .ssh/config
на хосте B, чтобы включить
Host github.com
IdentityFile /Users/doxna/.ssh/id_rsa.github
IdentitiesOnly yes
но тогда я получаю не ключевые предложения, а скорее
debug2: key: /Users/doxna/.ssh/id_rsa.github ((nil))
что, я полагаю, означает, что ключ не был найден (?) И в конце концов, ключ находится на моем домашнем компьютере A, а не на хосте B, поэтому вопрос в том, как ссылаться на него на хосте B? Надеюсь, мне удалось объяснить вопрос.
Вы правильно поняли. Единственная часть, которую вам не хватает, - это то, что файл, на который указывает IdentityFile
должен существовать. Он не должен содержать закрытый ключ, достаточно иметь только открытый ключ.
На хосте B вы можете извлечь открытый ключ из агента, набрав ssh-add -L | grep /Users/doxna/.ssh/id_rsa.github > ~/.ssh/id_rsa.github.pub
а затем укажите на этот файл из ~/.ssh/config
Хороший ответ от @Kasperd, но также обратите внимание, что если хост B скомпрометирован или если вы не доверяете всем тем, у кого есть права root, вы все равно подвергаете все свои ключи злоупотреблению, пока вы вошли в систему на этом хосте.
Таким образом, лучшим подходом может быть перенаправление доступа только к нужным вам ключам. Может попробовать ssh-agent-filter
который находится в репозиториях debian / Ubuntu или из github.
РЕДАКТИРОВАТЬ: я остановился на ssh-ident
скорее, чем ssh-agent-filter
для выборочной пересылки ключей, хотя это не так гладко, как можно было бы надеяться.