Linux
SSH
ssh-agent

SSH秘密鍵のSSH-AGENTをつかった管理ベストプラクティスを考えてみた

暗号化されたSSH秘密鍵のパスフレーズ入力を出来る限り省略、なおかつ安全に運用する

  • SSH秘密鍵のパスフレーズは必要
  • しかも11文字以上の長いものが推奨される
  • sshgitのたびにパスフレーズをいちいち入力するのは大変
  • ssh-agentのプロセスを管理する
  • 必要なときにだけパスフレーズを入力(シェル起動時に入力とかしたくない)
  • ssh-addされた鍵を一定時間で自動消去

SSH秘密鍵にちゃんとパスフレーズをつけよう。

  • SSH接続に公開鍵認証を取り入れるのは当然ですが、秘密鍵にちゃんとパスフレーズつけてますか?
  • (※もちろんパスワードログインはちゃんとOFFにしてね!)
  • パスフレーズをめんどくさくて付けていない場合はPCやUSBメモリなんかに入った秘密鍵が漏れたら即アウトです。

パスフレーズちゃんとつけてます!

  • 何文字のパスフレーズを付けていますか?
  • 短いパスフレーズは↓くらいの時間で解除できるという検証結果もあります。

SSH秘密鍵のパスフレーズは(つけるなら)11文字以上にしましょうねという話

CPU Intel Core i7 2.67GHz
(実験では1コアしか使っていない)

パスフレーズ文字数 解析にかかった時間
5文字 8秒
6文字 480秒
7文字 8時間
8文字 20日
9文字 3.3年
10文字 197年

ssh-agent

ssh-agentの問題点

  • 登録するときssh-addコマンドで秘密鍵ファイルを登録しなければいけない
  • 登録するとずっと生の秘密鍵が残ってしまい明示削除しなければずっと使える状態のまま
  • ssh-agentを一度起動すると、ログアウトしてもプロセスが残ったままになる
  • 解答された鍵ファイルはプロセスごとに残っているのでプロセスを再利用する必要がある

ssh-agentをプロセス管理して自動立ち上げ

  • .bashrcに書き込んで、シェル立ち上げ時にプロセスがなければ立ち上げる
  • 立ち上げたプロセスの情報を ~/.ssh-agent ファイルに保存
  • プロセスがあればそれを再利用
  • ファイルの有効時間を設定
.bashrc
# 有効時間(好きな秒数に設定)
SSH_KEY_LIFE_TIME_SEC=3600

SSH_AGENT_FILE=$HOME/.ssh-agent
test -f $SSH_AGENT_FILE && source $SSH_AGENT_FILE > /dev/null 2>&1
if [ $( ps -ef | grep ssh-agent | grep -v grep | wc -l ) -eq 0 ]; then
    ssh-agent -t $SSH_KEY_LIFE_TIME_SEC > $SSH_AGENT_FILE
    source $SSH_AGENT_FILE > /dev/null 2>&1
fi

実際に使われるときにパスフレーズを入力させる設定

  • ~/.ssh/configのサーバー設定にAddKeysToAgent yes
  • .bashrcにてssh-agent -t secをしたのは~/.ssh/configには有効時間が設定できなかったため
.ssh/config
Host my-server
    HostName myhost.mydomain.jp
    User taro   
    IdentityFile ~/.ssh/taro_secret_key
    AddKeysToAgent yes

ログオフの際にssh-agentのプロセスを終了させる。

このままだとログオフしても鍵が保存されたままになってしまうので、
ログオフ時にプロセスを自動で終了させる。

.bash_logout
ssh-agent -k

有効時間の前にssh-agentに登録されている鍵を削除する

  • 現在、登録されている鍵を一覧
    • ssh-add -l
  • 特定の鍵を削除
    • ssh-add -d [key_file_path]
  • 全削除
    • ssh-add -D

SSH秘密鍵のSSH-AGENTをつかった管理ベストプラクティスを考えてみた