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です。

コメント

このブログの人気の投稿

パスワードを覚えるのも無理があるから、パスワードマネージャ使いましょう。

大型特殊自動車免許を取った時の話。

車両系建設機械運転者(整地) の講習