Обновлено 2016-06-26: инструкция изменена для El Capitan
В стандартной конфигурации (речь дальше пойдёт про Mac OS 10.9 Mavericks и выше) при использовании ssh-ключей во встроенном ssh-клиенте парольная фраза запрашивается через макосный security-фреймворк (и стандартный диалог запроса пароля соответственно). После первого ввода пароля запускается ssh-agent и при дальнейших вызовах ssh или git c этим ключом пароль больше не запрашивается.
На мой взгляд, такая схема слишком небезопасная и нужно какое-то разумное ограниченное время жизни «запомненного» ключа в агенте, например, пара минут. Cделать это штатными средствами через диалоги/настройки невозможно, однако можно изменить файл запуска агента и выставить там нужное время жизни ключа в агенте. В результате практически при каждой попытке использовать любой ключ будет выскакивать диалог запроса парольной фразы.
Менять нужно файл /System/Library/LaunchAgents/org.openbsd.ssh-agent.plist
, добавляем два дополнительных аргумента: -t
и 1
— что означает время жизни ключа в одну секунду. Однако с версии 10.11 (El Capitan) прямое редактирование этого файла невозможно из-за включённой фичи System Integrity Protection (SIP), поэтому нужно это делать из recovery-режима:
- перезагружаем компьютер;
- в процессе перезагрузки держим нажатыми cmd+R (⌘+R);
- в меню выбираем Utilities → Terminal;
- в терминале выполняем команду
csrutil disable
, чтобы отключить SIP - перезагружаемся;
- правим файл;
- загружаемся опять в recovery-режим и снова включаем SIP:
csrutil enable
; - перезагружаемся.
После модификации файл выглядит так (желательно перезагрузить компьютер, на всякий случай):
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>org.openbsd.ssh-agent</string> <key>ProgramArguments</key> <array> <string>/usr/bin/ssh-agent</string> <string>-l</string> <string>-t</string> <string>1</string> </array> <key>ServiceIPC</key> <true/> <key>Sockets</key> <dict> <key>Listeners</key> <dict> <key>SecureSocketWithKey</key> <string>SSH_AUTH_SOCK</string> </dict> </dict> <key>EnableTransactions</key> <true/> </dict> </plist>
В файле добавлены две строки:
<string>-t</string> <string>1</string>
Теперь при каждом вызове ssh будет запрашиваться парольная фраза к ключу в стандартном гуёвом окошке. Можно вместо значения в 1 секунду выбрать другой интервал.
После обновления системы файл может быть перезаписан.