スタッフダイアリー

ssh-agentを使った秘密鍵の管理方法

システム課 黒田です。

仕事柄何台ものサーバに接続している毎日ですが、
特に面倒となるのが秘密鍵の管理です。

複数の鍵を如何に意識せず使うかを
考え続けた結果を共有したいと思います。

秘密鍵の管理はPageant等のツールを使うのが一般的かと
思いますが、パスフレーズを入力するのも億劫な自分は
ssh-agentを使った方法で簡略化しています。

一般的なPageantの使い方ですが、
WindowsでWinSCPを標準インストールしてあれば
Windosスタートメニューから「WinSCP」-「鍵関連ツール」-「Pageant」で起動、
タスクトレイのPageantアイコンを右クリックし、[鍵の追加] を選択します。
そして、ローカルに保存してある秘密鍵のファイルを指定し、パスフレーズを入力して登録出来ます。
これで登録した秘密鍵はパスフレーズの入力が不要になります。



※スタートアップフォルダにPageant.exeのショートカットを作成し、
 そのショートカットの起動パラメータに秘密鍵のフルパスをダブルクォートで括って指定すると
 パソコン起動時に自動的に秘密鍵が登録されます。(要パスフレーズ)

以下はエンジニア向けのssh-agentを使った方法になります。



※基本ターミナルからの接続でログインシェルはbashです
※仮想端末(screen)でも認証エージェントは引き継がれます
※CentOS 7にて動作確認

まず、「.bash_profile」に以下を追加


# 仮想端末なら実行しない
if [ $TERM != 'screen' ]; then
eval `ssh-agent`

# 秘密鍵ファイル1
KEY_FILE01='id_rsa_01'
# パスフレーズ
PASSPHRASE01='xxxxxxxxxx'

expect -c "
set timeout -1
spawn ssh-add $HOME/.ssh/$KEY_FILE01
expect {
\"Enter passphrase for\" {
send \"$PASSPHRASE01\r\"
}
}
expect {
\"denied\" { exit 1 }
eof { exit 0 }
}
"

# 秘密鍵ファイル2
KEY_FILE02='id_rsa_02'
# パスフレーズ
PASSPHRASE02='xxxxxxxxxxx'

expect -c "
set timeout -1
spawn ssh-add $HOME/.ssh/$KEY_FILE02
expect {
\"Enter passphrase for\" {
send \"$PASSPHRASE02\r\"
}
}
expect {
\"denied\" { exit 1 }
eof { exit 0 }
}
"

# スクリーン起動
screen
fi


さらに、ログアウト時にssh-agentを終了するため
「.bash_logout」に以下を追加

ssh-agent -k


これでログイン時に秘密鍵1と2がssh-agentに登録され
パスフレーズの入力が必要無くなり、仮想端末の状態で始まります。
さらに新規仮想端末を立ち上げてもパスフレーズは必要無し。

ネックとしては登録出来る鍵の数が限られます。。

登録してる鍵の数が6を超えると
「Too many authentication failures for ...」と
エラーが出る時があります。

これは接続するサーバ側の設定で
MaxAuthTries が6回(デフォルト)となっているからです。

この制限があっても、だいぶ効率化出来たので
物ぐさな自分でも十分です。

秘密鍵を沢山抱えている方の
作業が少しでも効率化しますように…。