BlankSlate

いや、そういう声もあるというだけです

Keychainを用いて秘密鍵パスフレーズ入力を省略する

tl;dr

おさむん家 Advent Calendarでは、この節以外を読む必要はありません

べんりです。

はじめに

先日書いた通りssh-agent(以下、認証エージェント)とssh-addを組み合わせると秘密鍵のパスフレーズ入力回数を減らすことができる。

しかし、適当に.zshrcを書くと大変なことになる。

認証エージェントが定義する環境変数や、ソケットファイルをシェルスクリプトで管理する方法もある1が、ここではKeychainを用いる。

Keychain

Keychainは認証エージェントを管理し、起動していない場合は認証エージェントを起動し、既に起動している場合はSSH_AGENT_PIDSSH_AUTH_SOCKを既存のプロセスID・ソケットファイルに紐付ける。

これによって認証エージェントの多重起動を防止している。

また、認証エージェントの起動と同時に秘密鍵を探査し、必要があればパスフレーズの入力を求める。

graph LR 起動 --> keychain{"認証エージェントは
既に起動しているか?"} keychain -- YES --> なにもしない keychain -- NO --> 認証エージェントを起動 認証エージェントを起動 --> add["秘密鍵を探査し
必要があればパスフレーズ入力を求める"]

インストール

パッケージ管理ツール、もしくは自分でmakeする。

$ # Arch
$ sudo pacman -S keychain

$ # Other platform
$ git clone https://github.com/funtoo/keychain.git keychain
$ cd keychain
$ make

設定

.zshrc2以下を追記する。

eval `keychain --eval --agents ssh id_rsa`

実行例

特に設定していない状態

接続のたびにパスフレーズを入力する必要がある

Keychain設定時 - インタラクティブシェル初回起動

シェル起動時に秘密鍵を登録すると、以降のセッションはパスフレーズ入力をスキップできる

Keychain設定時 - 別セッション

新しい端末ウィンドウ・tmuxやsrceenのペインでも、一度秘密鍵を登録すると再起動するまでスキップできる

  1. 例えば、http://blog.hansode.org/archives/52682108.htmlがある。この方法のメリットは特別なソフトウェアを導入する必要がないことだ。

  2. インタラクティブシェルが立ち上がる度に実行されるため、本来は.zshenv等に記述すべきではあるが、実行毎に実行中の認証エージェント認証エージェントに登録されている秘密鍵が表示されるため、安心感がある(あんしん)。

History