Как использовать закрытый ключ SSH для входа без ввода пароля каждый раз в Mac OS X Lion?


23

Я использую Mac OS X Lion и захожу на удаленные хосты через SSH каждый день. Несмотря на то, что я использую пару ключей SSH для удаленной аутентификации и мне не нужно моторизовывать фразу входа каждого хоста, все равно очень раздражает, что терминал запрашивает фразу-пароль для доступа к моему секретному ключу SSH.

По соображениям безопасности, я думаю, необходима пароль для доступа к закрытому ключу SSH. Есть ли способ заставить терминал запрашивать фразу ровно один раз при запуске, затем запоминать ее и автоматически использовать мой закрытый ключ в последующих сеансах SSH?

Существует скрипт, keychainкоторый отлично работает на Gentoo Linux. Но я никогда не понимаю это на Mac OS X Lion. Более того, есть так много пугающих терминов, такие как ssh-agent, ssh-add. После прочтения различных материалов о тех инструментальных средствах SSH и некоторых разочарованных экспериментах я запутался.

Поэтому я пришел в StackExchange и искал несколько советов по следующим вопросам.

  1. Что ssh-agent, ssh-add, keychain, Keychain Access.appи как они взаимодействуют друг с другом?
  2. Как я могу ввести пароль для моего закрытого ключа SSH один раз при входе в систему и использовать его свободно при создании сеанса SSH позже?
  3. Errr ... Что не так с Keychain Access.app? Он не хранит фразу SSH, как это было раньше.

Я перечисляю, что я сделал здесь. Надеюсь, есть подсказки о шагах, которые я пропустил.

Шаг 1. Создайте пару ключей SSH на моем Mac.

$ ssh-keygen -t rsa -C "me@email.com"
# 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

Любая обратная связь приветствуется. Благодарность!


Относящиеся . Скорее всего, вы можете адаптировать принятый ответ для вашего варианта использования.
Даниэль Бек

Ответы:


12

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:

http://www.sshkeychain.org/


4
Спасибо, Майкл Иденфилд. Я выяснил, что происходит не так, и теперь ssh-login-без-парольной фразы отлично работает на Mac OS X Lion. Я сделал несколько глупостей - я сделал символическую ссылку, ~/tmpуказывающую /tmp/и запускаю задачу cron для очистки ~/tmpкаждые 2 часа, что также удаляло сокет ssh-agent. О, чувак, я ненавижу себя.
Jianwen W.

13

В процессе решения «проблем», я гугл некоторых темы , связанные и записать некоторые заметки о том , как ssh-agent, ssh-add, keychain, KeyChain Access.appработе. В конечном итоге выясняется, что эта проблема вообще не является проблемой, вместо этого проблема полностью во мне, и так называемый ssh-login-Without-ask-Passphrase-Every-Time отлично работает на Mac из коробки.

Однако этот процесс приносит мне некоторый опыт. Я записываю свои записи здесь в надежде, что они помогут кому-то запутаться в этих терминах.

Два условия пароля:

  • passphrase относится к необходимой фразе при доступе к вашему секретному ключу SSH.
  • password относится к необходимой фразе для входа на ваш Mac.

Теперь я могу понять, что делают эти наборы инструментов, то есть ssh-agent, ssh-add, keychain, Keychain Access.appна Mac.

  • ssh-agentявляется важной службой, позволяющей использовать закрытый ключ SSH без ввода пароля SSH. ssh-agentработает таким образом. Сначала он хранит или кэширует ваш закрытый ключ SSH в основной памяти. Затем, позже в этом сеансе, когда ваш личный 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хранилище.

Две вещи заслуживают вашего внимания:

  1. Mac OS X Lion автоматически запускает ssh-agentсервис при запуске, прослушивая сокет под /tmp.
  2. Keychain Access.appсохраняет вашу парольную фразу SSH, поэтому она может добавить ваш закрытый ключ, ssh-agentне прерывая вас. Да, нет необходимости вводить фразу SSH, но необходимо ввести пароль для входа в свою учетную запись Mac, чтобы предоставить привилегию при создании этой записи в первый раз.

Итак, в итоге, SSH-login-без-спрашивающего-парольной фразы должен работать на Mac OS X из коробки.


1

В случае, если другие решения здесь не работают для людей, мне помогло следующее.

Для каждого личного ключа в каталоге ~ / .ssh убедитесь, что соответствующий открытый ключ также присутствует. Убедитесь, что открытый ключ назван точно так же, как и закрытый ключ, но .pubв конце. Если у вас уже есть соответствующий открытый ключ, попробуйте восстановить его.

Если вам нужно воссоздать открытые ключи, вы можете сделать это легко: -

ssh-keygen -y -f ~/.ssh/my_key > ~/.ssh/my_key.pub

заменить my_keyна то, что ваш ключ называется.

После этого MacOS запоминает ключевую фразу в связке ключей, как и должно быть.

Примечание. Ввод парольной фразы и ее сохранение в цепочке ключей теперь является однократным действием (не один раз за сеанс входа в систему, как требуется OP), но при условии, что вход на рассматриваемый компьютер Mac защищен паролем, тогда ваша пароль будет защищена этим паролем для входа. Кроме того, это решение не имеет смысла для меня ... открытый ключ не должен требоваться в дополнение к закрытому ключу, но по некоторым причинам MacOSX требует этого.

(изначально из ответа на аналогичный вопрос на Apple Stack Exchange)


1

Одна вещь, о которой я редко упоминаю при настройке ~/.sshпапки, - это ограничение прав доступа к каталогу.

Чтобы включить ssh, чтобы не запрашивать пароль, мне всегда приходилось устанавливать разрешения для домашнего каталога пользователя 700, а также ~/.sshразрешения для папки 700.

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


0

Еще одна вещь, которую вы могли бы попробовать - заменить ssh-copy-idна что-то вроде k="$(cat ~/.ssh/id_rsa.pub)"; ssh username@somehost.com "umask 0077; mkdir -p ~/.ssh; echo "$k" >> ~/.ssh/authorized_keys2".


0

Этот ответ не является решением этого вопроса; однако это очень близко (я остановился на этом вопросе во время поиска решения моей проблемы).

Я также делаю много SSH с удаленными серверами на моем Mac, как описано в этом вопросе, однако Keychain Access.app приложение сохранило ключевую фразу, и мне не нужно вводить ее каждый раз, когда мне нужен ключ для аутентификации на SSH-сервере.

Тем не менее, я включил SSH сервер на своем Mac, чтобы я мог подключиться к нему удаленно. При удаленном входе в систему на моем Mac ключевая фраза всегда спрашивалась, когда я хочу использовать SSH еще один хост.

Я нашел решение, которое позволяет сохранить ключевую фразу для текущего сеанса. Я думал, что это может быть полезно для кого-то, следовательно, этот пост / ответ.


Я записал свое аналогичное решение здесь superuser.com/a/659668/154113
orkoden

0

Я ломал голову над этой проблемой. ssh работает на каждой машине в нашем отделе, КРОМЕ яблок (MacBooks или iMacs не имеет значения). Я, наконец, устал набирать пароли и решил отладить это.

Я пошел в свой iMac и отключил sshd в панели настроек общего доступа. Затем я получил root-права и набрал «/ usr / sbin / sshd -d», чтобы запустить sshd в режиме отладки. Затем я попытался подключиться к этой машине по протоколу ssh, и он быстро попытался использовать протокол 2, который, кажется, все использует просто отлично, но sshd сразу же сообщил, что не может найти «author_keys». У меня был файл author_keys2, который отлично подходит для всех моих коробок Linux, Linux, you-name-it. Я просто скопировал author_keys2 в авторизованные ключи и BOOM. Работает отлично сейчас.

Почему * keys вместо * keys2 неизвестно. Особенно когда os x вполне доволен известными_хостами2.

В любом случае, теперь во все наши яблочные ящики можно войти или выполнить удаленные команды без этого взломанного пароля: prompt ...

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.