暗号化されたSSH秘密鍵のパスフレーズ入力を出来る限り省略、なおかつ安全に運用する
- SSH秘密鍵のパスフレーズは必要
- しかも11文字以上の長いものが推奨される
-
ssh
やgit
のたびにパスフレーズをいちいち入力するのは大変 -
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を使っていれば入ってるはず。
- ssh-agentを使えば、毎回パスレーズを入力しなくても1回入力しただけで覚えててくれる
- 秘密鍵のパスフレーズ入力をスルーする
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