Я использую Mac OS X Lion и каждый день вхожу в удаленные хосты через SSH. Несмотря на то, что я использую пару ключей SSH для удаленной аутентификации и мне не нужно автоматизировать фразу входа каждого хоста, все равно очень раздражает, что терминал запрашивает пароль для доступа к моему закрытому ключу SSH.
По соображениям безопасности, я думаю, парольная фраза для доступа к закрытому ключу SSH просто необходима. Есть ли способ заставить терминал запрашивать фразу только один раз при запуске, затем запомнить ее и автоматически использовать мой закрытый ключ в последующих сеансах SSH?
Есть скрипт, keychain
который отлично работает на Gentoo Linux. Но я так и не разобрался с ним на Mac OS X Lion. Более того, там так много пугающих терминов, таких как ssh-agent
, ssh-add
. После прочтения различных материалов об этих SSH-инструментариях и проведения некоторых неудачных экспериментов я еще больше запутался.
Поэтому я пришел на StackExchange в поисках совета по следующим вопросам.
- Что такое
ssh-agent
,ssh-add
,keychain
,Keychain Access.app
и как они взаимодействуют друг с другом? - Как мне ввести парольную фразу для моего закрытого ключа SSH один раз при входе в систему и свободно использовать ее при последующем создании сеанса SSH?
- Эээ... Что не так с
Keychain Access.app
? Он не сохраняет фразу SSH, как раньше.
Я перечисляю здесь то, что я сделал. Надеюсь, есть подсказки о шагах, которые я пропустил.
Шаг 1. Создайте пару ключей SSH на моем Mac.
$ ssh-keygen -t rsa -C "[email protected]"
# Set a passphrase for accessing the private key.
Шаг 2. Копирую свой открытый ключ SSH на удаленный хост. Для примера я копирую ключ на локальный хост, Mac.
$ ssh-copy-id USER@localhost
# Enter the login password for USER at localhost, not my SSH passphrase
Шаг 3. Затем попробуйте подключиться к удаленному хосту (в данном случае localhost) с помощью аутентификации с помощью пары ключей SSH.
$ ssh USER@locahost
Enter passphrase for key '/Users/YOUR_ACCOUNT/.ssh/id_rsa':
# Enter my SSH passphrase, not the login password.
Шаг 4. Выйдите из удаленного хоста и попробуйте подключиться к нему снова. Черт, терминал снова запрашивает фразу SSH.
Часто задаваемый вопрос: «Хорошо ли работает ssh-agent на вашем Mac?». Честно говоря, я понятия не имею, что происходит в этих вещах. Вот некоторые результаты работы.
$ echo $SSH_AUTH_SOCK
/tmp/launch-M48niA/Listeners
$ echo $SSH_AUTH_PID
(EMPTY)
$ ssh-add -l
Could not open a connection to your authentication agent.
$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-Z54zXukQiP/agent.26769; export SSH_AUTH_SOCK;
SSH_AGENT_PID=26770; export SSH_AGENT_PID;
echo Agent pid 26770;
$ ssh-add -l
Could not open a connection to your authentication agent.
$ echo $SSH_AUTH_SOCK
/tmp/launch-M48niA/Listeners
$ echo $SSH_AUTH_PID
(STILL EMPTY)
$ ssh-agent # Oh no, anther ssh-agent with different PID
SSH_AUTH_SOCK=/tmp/ssh-cx0B4FUX8B/agent.26898; export SSH_AUTH_SOCK;
SSH_AGENT_PID=26899; export SSH_AGENT_PID;
echo Agent pid 26899;
$ ps -e | grep -i ssh
26769 ?? 0:00.03 ssh-agent
26899 ?? 0:00.02 ssh-agent
Любые отзывы приветствуются. Спасибо!
решение1
ssh-agent
это та часть, которую вы хотите заставить работать, поскольку она делает именно то, о чем вы спрашиваете. Агент работает как демон, и когда вы «добавляете» к нему закрытый ключ, он запоминает этот ключ и автоматически предоставляет его удаленному устройству sshd
во время первоначального подключения. ( ssh-add
это просто команда, которую вы запускаете, чтобы вручную добавить закрытый ключ к ssh-agent
).
В OS X, как и в Leopard, вам никогда не придется запускать ssh-agent
или ssh-add
вручную. Это должно «просто произойти» при попытке подключения к серверу. Один раз на ключ, он предложит вам диалоговое окно пароля пользовательского интерфейса, которое (помимо прочего) позволит вам автоматически добавить ключ в , ssh-agent
чтобы вам больше никогда не приходилось его запрашивать.
Это достигается за счет launchd
конфигурации, которая прослушивает соединения на $SSH_AUTH_SOCK
сокете и автоматически запускается ssh-agent
при первой необходимости; после этого ssh-agent
запрашивает учетные данные только тогда, когда необходимо открыть новый ключ.
Если это не работает, убедитесь, что у вас есть правильный launchd
файл конфигурации:
/System/Library/LaunchAgents/org.openbsd.ssh-agent.plist
Если по какой-то причине у вас все еще не работает, вот «старый» способ запустить все вручную:
http://timesinker.blogspot.com/2007/08/getting-ssh-agent-going-on-mac-osx.html
Есть еще одно приложение, которым я перестал пользоваться с выходом Leopard, но которое, по сути, делало то же самое в предыдущих версиях Mac OS X:
решение2
В процессе решения "проблемы" я гуглил некоторые связанные темы и записывал некоторые заметки о том, как ssh-agent
, ssh-add
, keychain
, KeyChain Access.app
работают. В конце концов, оказалось, что эта проблема вообще не проблема, а проблема во мне, и так называемомssh-вход-без-запроса-пароля-каждый-разотлично работает на Mac сразу из коробки.
Однако этот процесс дает мне некоторый опыт. Я записываю здесь свои заметки в надежде, что они помогут кому-то, кто запутался в этих терминах.
Два термина пароля:
passphrase
относится к обязательной фразе при доступе к вашему закрытому ключу SSH.password
обозначает фразу, необходимую для входа в систему Mac.
Теперь я могу понять, что делают эти наборы инструментов, то есть, , , ssh-agent
на ssh-add
Mac .keychain
Keychain Access.app
ssh-agent
является критически важным сервисом для включения использования закрытого ключа SSH без ввода парольной фразы SSH.ssh-agent
работает таким образом. Сначала он сохраняет иликэш, ваш закрытый ключ SSH в основной памяти. Затем, позднее в этом сеансе, когда ваш закрытый ключ SSH понадобится для удаленной аутентификации,ssh-agent
найдет ваш закрытый ключ в основной памяти и передаст его удаленному процессу. Единственный шанс, что вас попросят ввести вашу парольную фразу SSH, — это когда ваш закрытый ключ изначально добавленssh-agent
.ssh-add
является частьюssh-agent
коллекции, которая помогает управлять вашими ключами SSH вssh-agent
. Мы используемssh-add
команду для перечисления, добавления, удаления закрытых ключей в связке ключей ssh-agent. Затемssh-add
связывается соssh-agent
службой для выполнения задач.keychain
это скрипт для поискаssh-agent
службы (если ее нет, запуска новой) и вызоваssh-add
для добавления закрытых ключей SSH.keychain
имеет простую и понятную идею, отлично работающую в Linux, где ssh-agent обычно не запускается автоматически.Keychain Access.app
Кажется, это самый сложный компонент. Это универсальный сервис хранения токенов Mac OS X. Он хранит различные токены, такие как пароли, сертификаты и т. д., и служит в качестве токенаагентдля тех приложений, которые запрашивают токены. В нашем случае с закрытым ключом SSH сначала он принимает запрос на доступ к закрытому ключу SSH и выводит окно с просьбой сохранить парольную фразу SSH, которая является своего рода токеном, вKeychain Access.app
связке ключей . Затем в следующий раз, когда вы будете использовать закрытые ключи для аутентификации,Keychain Access.app
снова выводит окно с вопросом, предоставляете ли вы привилегию. Получив большое «да»,keychain Access.app
добавляет ваш закрытый ключ вssh-agent
хранилище .
Два момента заслуживают вашего внимания:
- Mac OS X Lion автоматически запускает
ssh-agent
службу при загрузке, прослушивая сокет в/tmp
. Keychain Access.app
хранит вашу парольную фразу SSH, поэтому он может добавить ваш закрытый ключ,ssh-agent
не прерывая вас. Да, не нужно вводить вашу фразу SSH, но нужно ввести пароль входа в учетную запись Mac для предоставления привилегий при создании этой записи в первый раз.
Итак, подведем итоги,SSH-login-without-asking-passphrase должен работать на Mac OS X сразу после установки.
решение3
На случай, если другие решения здесь не сработают, мне помогло следующее.
Для каждого закрытого ключа в вашем каталоге ~/.ssh убедитесь, что соответствующий открытый ключ также присутствует. Убедитесь, что открытый ключ назван точно так же, как и закрытый ключ, но с .pub
. Если у вас уже был соответствующий открытый ключ, попробуйте сгенерировать его заново.
Если вам необходимо заново создать открытые ключи, вы можете сделать это легко:
ssh-keygen -y -f ~/.ssh/my_key > ~/.ssh/my_key.pub
замените my_key
на то, как называется ваш ключ.
После этого MacOS запомнит парольную фразу ключа в связке ключей, как и положено.
Примечание: ввод парольной фразы и сохранение ее в связке ключей теперь является одноразовым действием (а не один раз за сеанс входа, как хотел OP), но если предположить, что вход в рассматриваемый mac защищен паролем, то ваша парольная фраза защищена этим паролем входа. Кроме того, это решение не имеет для меня смысла... открытый ключ не должен требоваться в дополнение к закрытому ключу, но по какой-то причине MacOSX требует его.
(первоначально изотвечатьна аналогичный вопрос на Apple Stack Exchange)
решение4
Еще можно было бы попробовать заменить ssh-copy-id
на что-то вроде .k="$(cat ~/.ssh/id_rsa.pub)"; ssh [email protected] "umask 0077; mkdir -p ~/.ssh; echo "$k" >> ~/.ssh/authorized_keys2"