Я хочу общаться между несколькими компьютерами в моей сети (статический Ethernet) через SSH. Для этого мне нужно запускать ssh-add каждый раз, когда я вхожу на определенную машину, как я могу сделать это так, чтобы он был настроен один раз и не запрашивал у меня пароль при каждом входе в систему или перезагрузке? моя машина?
Я знаю, что есть способ добавить несколько строк в bash_profile
файл, но мне все равно нужно вводить пароль каждый раз, когда я перезагружаюсь / захожу на конкретную машину.
if [ -z "$SSH_AUTH_SOCK" ] ; then
eval `ssh-agent -s`
ssh-add
fi
Ответы:
Это типичный пример компромисса между безопасностью и удобством. К счастью, есть несколько вариантов. Наиболее подходящее решение зависит от сценария использования и желаемого уровня безопасности.
ssh-ключ с парольной фразой, нет
ssh-agent
Теперь пароль необходимо вводить каждый раз, когда ключ используется для аутентификации. Хотя это лучший вариант с точки зрения безопасности, он предлагает худшее удобство использования. Это также может привести к тому, что слабый пароль будет выбран для того, чтобы уменьшить нагрузку на его повторный ввод.
SSH-ключ с парольной фразой, с
ssh-agent
Добавление следующего к
~/.bash_profile
автоматически запуститssh-agent
и загрузит ssh-ключ (ы) при входе в систему:Теперь пароль должен вводиться при каждом входе в систему. Хотя это немного лучше с точки зрения удобства использования, у него есть недостаток, который
ssh-agent
запрашивает парольную фразу независимо от того, должен ли ключ использоваться или нет во время сеанса входа в систему. Каждый новый логин также порождает отдельныйssh-agent
экземпляр, который продолжает работать с добавленными ключами в памяти даже после выхода из системы, если он явно не уничтожен.Чтобы убить
ssh_agent
при выходе из системы, добавьте следующее в~/.bash_logout
или следующее
~/.bash_profile
Создание нескольких
ssh-agent
экземпляров можно избежать, создав постоянный сокет связи с агентом в фиксированном месте в файловой системе, например, в ответе Коллина Андерсона . Это улучшение по сравнению с порождением нескольких экземпляров агентов, за исключением случаев, когда явно дешифрованный ключ остается в памяти после выхода из системы.На настольных компьютерах ssh-агенты, включенные в среду рабочего стола, такие как агент SSH Gnome Keyring , могут быть лучшим подходом, поскольку их обычно можно использовать для запроса парольной фразы при первом использовании ssh-ключа во время сеанса входа и сохранить расшифрованный закрытый ключ в памяти до конца сеанса.
SSH-ключ с парольной фразой, с
ssh-ident
ssh-ident
это утилита, которая может управлятьssh-agent
от вашего имени и при необходимости загружать идентификационные данные. Он добавляет ключи только один раз, когда они необходимы, независимо от того, сколько терминалов, ssh или сеансов входа в систему требуют доступа кssh-agent
. Он также может добавлять и использовать другой агент и другой набор ключей в зависимости от хоста, к которому подключен, или от каталога ssh, из которого вызывается. Это позволяет изолировать ключи при использовании переадресации агента с разных хостов. Это также позволяет использовать несколько учетных записей на таких сайтах, как GitHub.Чтобы включить
ssh-ident
, установите его и добавьте следующий псевдоним~/bash_profile
:SSH-ключ с парольной фразой, с
keychain
keychain
это небольшая утилита, которая работаетssh-agent
от вашего имени и позволяетssh-agent
продолжать работу после завершения сеанса входа в систему. При последующих входах в системуkeychain
будет подключаться к существующемуssh-agent
экземпляру. На практике это означает, что парольную фразу необходимо вводить только во время первого входа в систему после перезагрузки. При последующих входах в систему используется незашифрованный ключ из существующегоssh-agent
экземпляра. Это также может быть полезно для разрешения аутентификации RSA / DSAcron
без пароля в заданиях без ssh-ключей без пароля.Чтобы включить
keychain
, установите его и добавьте что-то вроде следующего~/.bash_profile
:С точки зрения безопасности,
ssh-ident
иkeychain
хуже , чемssh-agent
случаях ограничивается временем жизни конкретной сессии, но они предлагают высокий уровень удобства. Чтобы повысить безопасностьkeychain
, некоторые люди добавляют--clear
опцию в свой~/.bash_profile
вызов цепочки для ключей. При этом необходимо повторно вводить парольные фразы при входе в систему, как указано выше, ноcron
задания по-прежнему будут иметь доступ к незашифрованным ключам после выхода пользователя из системы. Наkeychain
вики-странице есть больше информации и примеров.SSH-ключ без ключевой фразы
С точки зрения безопасности это наихудший вариант, поскольку закрытый ключ полностью незащищен в случае его раскрытия. Это, однако, единственный способ убедиться, что пароль не нужно вводить повторно после перезагрузки.
SSH-ключ с ключевой фразой, с
ssh-agent
, передавая парольную фразуssh-add
из сценарияХотя может показаться простой идеей передать парольную фразу
ssh-add
из сценария, напримерecho "passphrase\n" | ssh-add
, это не так просто, как кажетсяssh-add
, не считывает парольную фразу изstdin
, но открывает ее/dev/tty
непосредственно для чтения .Это можно обойти с
expect
помощью инструмента для автоматизации интерактивных приложений. Ниже приведен пример скрипта, который добавляет ssh-ключ, используя фразу-пароль, хранящуюся в скрипте:Обратите внимание, что поскольку фраза-пароль хранится в текстовом виде в сценарии, с точки зрения безопасности это вряд ли лучше, чем использование ssh-ключа без пароля. Если необходимо использовать этот подход, важно убедиться, что для
expect
скрипта, содержащего фразу-пароль, установлены соответствующие разрешения, что делает его читаемым, доступным для записи и запуска только владельцем ключа.источник
ssh-agent
фрагмент кода,~/.bash_profile
как объяснено в ответе. Возможно, вы захотите взглянуть наkeychain
утилиту. При этомkeychain
необходимо ввести пароль при первом входе в систему после перезагрузки, но при последующих входах в системуkeychain
будет подключаться существующийssh-agent
экземпляр с дешифрованным ключом в памяти. Кроме того, есть возможность генерировать ssh-ключ без ключевой фразы, но это, конечно, не рекомендуется.ssh-add
из сценария. Причинаecho "pass\n" | ssh-add
не работает в том, чтоssh-add
не читает пароль сstdin
, но открывается/dev/tty
непосредственно для чтения. Обновлен ответ, чтобы включить обходной путь для этого, используя утилиту под названиемexpect
.gssapi-with-mic
. Это обычно используется в больших сетях, но, конечно, если у вас есть интерес к этому, возможно, стоит посмотреть.Добавьте это в свой
~/.bashrc
, затем выйдите из системы и снова войдите, чтобы вступить в силу.Это должно запрашивать пароль только при первом входе в систему после каждой перезагрузки. Он будет продолжать использовать то же самое,
ssh-agent
пока он работает.источник
ssh-add -l
возвращает код выхода 0, когда у агента есть удостоверения, и 1, если его нет, поэтому вы можете вырезать grep из последней команды и использоватьssh-add -l > '/dev/null' || ssh-add
Не тесно связанный с вопросом OP, но он может быть полезен для других: начиная с 7.2.0 ssh (1) имеет опцию, которая позволяет добавлять ключ к ssh-agent при первой аутентификации; опция
AddKeysToAgent
и может быть установленаyes
,no
,ask
илиconfirm
, общесистемный или на персональный.ssh/config
файл.Ссылка: https://www.openssh.com/txt/release-7.2
источник
.ssh/config
файле: это относится коssh
всему, что используетсяssh
за ним, напримерscp
, и может быть сделано для каждого хоста.ssh-agent
кэширует различные разблокированные ssh-ключи, так что вы можете иметь ssh-ключи защищенными паролями, но без необходимости вводить их каждый раз.Для кеширования разблокированных ключей, очевидно, необходимо разблокировать эти ключи. Для разблокировки ключей, которые заблокированы парольной фразой, очевидно, что они должны знать эти парольные фразы.
Любой метод, который не требует авторизации от человека (например, «ввод пароля»), не только сделает вашу систему небезопасной; это также сделает бессмысленным все назначение ssh-агента.
Сказав все это, вы можете просто использовать ssh-ключи, которые не защищены паролем (нажимать, Enterкогда запрашивается пароль во время генерации ключа). Поскольку пароля
ssh-agent
нет, вам не нужно запрашивать его, чтобы (не) его кэшировать.источник
Вот обходной путь для автоматизации вашей парольной фразы SSH.
Создайте однострочный скрипт, который выводит вашу фразу-пароль на стандартный вывод, например:
Важно: убедитесь, что вы скопировали начальный пробел, чтобы предотвратить сохранение вашего пароля в вашей истории .
И используйте один из следующих методов.
используя стандартный подход ввода:
или подход именованной трубы :
Создайте именованный канал (вы также можете попробовать заменить процесс ):
Запустите
ssh-add
, указав программу, используемую для аутентификации:Смотрите:
man ssh-add
чтобы узнать больше оSSH_ASKPASS
.источник
echo my_passphrase
большая дыра в безопасности. Сначала, после того, как вы ввели его, пароль записывается в текстовом файле в файле истории того, что вы когда-либо использовали. И вторые аргументы командной строки доступны для чтения в Unix (ps -ef
). Никогда не ставьте пароли в аргументах командной строки!ps
выводе. Файл истории обычно доступен для чтения только владельцу, но командные строки доступны для чтения всем пользователям системы.Я не буду рекомендовать вам ssh-add (который должен открыть ssh-agent) при входе в систему. Это потому, что вы не можете контролировать, когда заканчивается раздел ssh-agent, и можете создать угрозу безопасности, когда вам не нужно использовать ключевые файлы в одном разделе входа в систему.
Вместо этого я рекомендую написать скрипт, который открывает под-оболочку раздела ssh-agent с автоматически добавленными всеми ключевыми файлами и вызывается при необходимости для использования ssh. Если вы могли бы принять это, читайте дальше.
У вас будет два варианта:
Удалите все парольные фразы для ваших ключей, которые имеют слабую защиту, если ваши файлы ключей украдены. (поэтому не рекомендуется )
Используйте ту же самую фразу-пароль для ваших ключей. Затем, когда вы
ssh-add keyfile1 keyfile2 ...
, вам нужно будет ввести пароль только один раз, для каждого раздела.В обоих случаях вы можете написать такой файл сценария "ssh_keys_section.sh", как показано ниже:
Примечания:
ssh-keygen -p -f keyfile
/path/to/yourterminal &
(зависит от ОС)источник
/path/to/yourterminal &
==>mintty &
источник
Раньше я использовал скрипт, упомянутый steampowered, сейчас я сделал нижеприведенный, потому что он не оставляет файлы лежать без дела.
Работает
zsh
только на оболочке.источник
Предоставить кредит здесь: https://www.cygwin.com/ml/cygwin/2001-06/msg00537.html
Это решение также одобрено здесь: http://mah.everybody.org/docs/ssh
источник
Единый знак решения для SSH может привести меня к
pam_ssh
.Согласно этой статье , концепция такова:
Я не проверял, что это на самом деле будет работать.
источник
Добавьте это в ваш
~/.bashrc
файл:источник
Чтобы добавить (возможно, без пароля) ключ и убедиться, что
ssh-add
пароль не будет запрашиваться, несмотря ни на что, даже при работе под X :Состояние выхода указывает на успех или неудачу.
источник
Если вы используете морской конек в качестве менеджера паролей ... Что вы, вероятно,; D
Другое решение, которое достигает цели, которую вы ищете, это просто добавление ключей ssh к морскому коньку для автоматической разблокировки при входе в систему. Основным преимуществом этого является то, что вам никогда не нужно вводить пароль для ключей после входа в систему через gdm или любого другого входа, даже если ключи имеют пароль. Это ТРЕБУЕТ как закрытый ключ, так и открытый ключ. Они также ДОЛЖНЫ следовать соглашению об именовании морских коньков. По умолчанию приемлемо (id_rsa для закрытого ключа и id_rsa.pub для открытого ключа ... На самом деле все, что является privatekeyname и privatekeyname.pub )
Чтобы добавить ваш ключ ssh к морскому коньку для автоматической разблокировки при входе в систему; (на fedora25 я не уверен, где находится путь в других дистрибутивах, хотя, скорее всего, он очень похож)
Для меня это было
(морской конек автоматически предположит, что открытым ключом в моем случае был id_rsa.pub)
После выполнения команды, морской конек откроет милое маленькое поле пароля gtk, чтобы ввести пароль для закрытого ключа. или просто оставьте это поле пустым, если вы сгенерировали ключ без пароля.
Морской конек не подскажет, все ли в порядке. Вам нужно будет попытаться выполнить ssh на целевой машине. Затем морской конек предложит вам снова разблокировать ключ с помощью пароля (ЭТО ТОЛЬКО БУДЕТ ОДНАЖДЫ), но на этот раз он должен выглядеть немного иначе; P (это также та часть, где морской конек делает некоторого морского конька для магии ssh-add, я полагаю ) и предложите ВАРИАНТ разблокировки ключа при входе в систему, вы должны выбрать эту опцию для достижения своей цели.
Просто потому, что я не прочитал все ответы, я бы порекомендовал отменить то, что все говорили вам делать с ssh-add, прежде чем пытаться ответить на этот вопрос. Иначе это может привести к тому, что с вашими ключами случится что-то плохое, idk.
источник
Вот окончательный сценарий.
Обновите $ PASSW, затем скопируйте и вставьте его в свой терминал
источник
Лучший способ, которым я знаю, - это использовать скрипт входа в PAM, который я адаптировал из предыдущей работы, потому что я не мог найти удовлетворительный ответ в этом вопросе.
Ваша фраза-пароль хранится в зашифрованном виде с вашим системным паролем и расширенной функцией деривации. При входе в систему системный пароль используется для расшифровки вашей парольной фразы и добавления ее к агенту.
https://github.com/capocasa/systemd-user-pam-ssh
Преимущество перед любым другим представленным решением заключается в том, что оно сочетает в себе безопасность, эквивалентную запуску ssh-add вручную при загрузке с минимальными усилиями. Он не требует дополнительных инструментов и имеет одну дополнительную зависимость, которая уже установлена по умолчанию на большинстве систем (OpenSSL).
источник
Моя установка на MacOS выглядит следующим образом (в
.zshrc
, или.bash_profile
для Баша людей):Эта
|| [[ $SSH_AUTH_SOCK == *"/private/tmp/"* ]]
часть необходима в macOS, потому что по умолчанию установлено значение/private/tmp/com.apple.launchd.SOMETHINGHERE/Listeners
. Иначе @Thomas Nyman исчерпывающий ответ не получится, потому что$SSH_AUTH_SOCK
всегда настроен на что-то.Тогда в
.zlogout
(или.bash_logout
для людей Баша):Протестировано на MacOS Mojave 10.14.5
источник