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

Любые отзывы приветствуются. Спасибо!

7 ответов7

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 из коробки.

12

ssh-agent - это та часть, над которой вы хотите работать, поскольку она делает именно то, о чем вы спрашиваете. Агент работает как демон, и когда вы "добавляете" к нему закрытый ключ, он запоминает этот ключ и автоматически передает его удаленному sshd во время первоначального подключения. (ssh-add - это просто команда, которую вы запускаете, чтобы вручную добавить закрытый ключ в ssh-agent).

В OS X, начиная с Leopard, вы никогда не должны запускать ssh-agent или ssh-add вручную. Это должно "просто произойти", когда вы пытаетесь подключиться к серверу. Один раз для каждого ключа вам будет предложено ввести диалоговое окно пароля UI, которое (помимо прочего) позволит вам автоматически добавить ключ в 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/

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

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

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

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 работает на каждой машине в нашем отделе, КРОМЕ яблок (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 ...

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