Обновлено 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
<?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 секунду выбрать другой интервал.
После обновления системы файл может быть перезаписан.