ssh-agent や ForwardAgent を活用するようにしてみた。
普段、皆さんはSSHでログインをするときに、非対称鍵による認証を使われているかと思います。 SSHでパスワード認証してるとかって、運用サボっているとしか言いようがないですけどね。
んで、非対称鍵でパスワードの解かれた秘密鍵をオンメモリに保存しておく ssh-agent をまじめに使おうと思い、チラチラとスクリプトを書いていました。やりたいこととしては、こんなところ。
- SSHの接続元から Forward Agent された場合は、そのままスルー
- 手元のマシンで ssh-agent が動いていなかったら、起動
- ssh-agent は、今回の場合はログアウト後も稼働したまま。
- 他でのログイン時に起動した ssh-agent があれば、それを使い回し
Windows上のputtyならばpagentを動かせば一発。 Ubuntu desktopの環境ならば、この辺も一発で完了。 フツーにシェルでログインする場合はどうするんだ?ってところで、自分でスクリプト書いてみた。
とりあえず、こんなbashスクリプトを書いておきました。
#!/bin/bash
function kick_sshagent () {
ssh-agent |grep -v ^echo > "$agent_vars"
source "$agent_vars"
}
function start_sshagent () {
agent_vars=~/.ssh/agent_vars.sh
if [ "$SSH_AUTH_SOCK" != "" -a -e "$SSH_AUTH_SOCK" ] ; then
# Already agent is running (e.g. ForwardAgent)
return 0
fi
if ! [ -f "$agent_vars" ] ; then
kick_sshagent
return 0
fi
source "$agent_vars"
if test "$SSH_AUTH_SOCK" = "" -o ! -e "$SSH_AUTH_SOCK" ; then
kick_sshagent
return 0
fi
unset agent_vars
}
# 上記のコードを実行
start_sshagent
例えばこのファイルを ~/.ssh/start_agent.sh
というファイル名にした場合、bash から . ~/.ssh/start_agent.sh と実行すれば動きます。 ~/.bashrc
にこの記述を書いてしまってもよいかもしれませんね。 ちなみに .bashrc の編集をしたあと、動作確認もせずにログアウトすると、ログイン出来なくなる罠がありますので。 編集後、別の端末からログインしたり、同じ端末から localhost にログインし直すなどして、お試し下さい。
ssh-agentの基本的な使い方ですが、ssh-agentを実行すると、自分のプロセスに接続するための環境変数を shell script で記したデータを出力します。 こいつを shell の変数にするのです。 ssh-agent は起動直後は、秘密鍵のパスフレーズを保持していないので、ssh-add
でパスフレーズを登録します
$ ssh-add
Enter passphrase for /home/masaru/.ssh/id_dsa:
こうすることで、この先の別のマシンにSSHでログインするときに、秘密鍵のパスワードを聞いてこなくなります。
この agentの状態を、ログイン先のマシンにも転送するのが Forward Agent と呼ばれている機能です。 信頼できるマシンにのみ転送してください。 利用するには、ssh の設定ファイル ~/.ssh/config に、下記のような内容を書いて下さい。
Host * # 対象となるホスト
ForwardAgent yes
ある程度、非対称鍵での運用に慣れた頃に、SSHDのパスワード認証を外しましょう。 /etc/ssh/sshd_config に「PasswordAuthentication no」って書けばOKです。
コメント
コメントを投稿