むりやり agent 転送を行わせる patch (test 版) 1. この patch について OpenSSH と SSH2(SSH Secure Shell Version 2 以降のもの) との間では、 (Protocol 1 では可能であるのに) agent 転送が効ません。何とかならな いんだろうか? というわけで、むりやり agent 転送を行わせる patch を作ってみました。 他にも SSH2 との相互運用で便利そうなものなども含んでいます。 2. 使い方 a. この patch をあてて compile & install b. /etc/ssh/ssh_config, ~/.ssh/config に設定追加 (これは optional) c. あとは普通に使えると思います。 3. 追加された option a. /etc/ssh/ssh_config, ~/.ssh/config ForwardAgentReqType agent 転送する server type の選択。 "openssh", "ssh.com", "all" のどれかを設定します。 default は "all" なので、server がどっちの type でも agent 転送するようにします。 ForwardingNotice ssh-agent2 が使う agent 転送の経路の追跡に使う data を ssh-agent に送るようにします。 "yes", "no", "commandline", "realhostname", "canonicalhostname" が選択可能で、ssh-agent2 の command が利用可能なら、 yes, commandline : command line で書かれた hostname を送る realhostname : configuration file で HostName が書かれていればその名前を送る 指定されていなければ command line に書かれている hostname を送る canonicalhostname: canonical hostname を送る no : 送らない となります。 default は "commandline" です。 b. ssh-add -r fingerprint 指定の fingerprint を持つ鍵を agent から削除します。 -f forwarding_limit agent 転送で経由する host 数を forwarding_limit までにします。 0 だと local のみで使えるようにします。 ForwardingNotice の情報が必要なので、送ってこない ssh client が経路上にいると完全には制限できません。 -F forwarding_path agent 転送で経由してよい host を "," で区切って列挙します。 これも ForwardingNotice の情報が必要です。 -U use_limit 追加する鍵の使用回数(list を要求されただけでは増えません)を use_limit 回に制限します。 -I configure 実行時に --enable-agent-info-command を追加すると 使える。agent の保持している鍵に設定した constraint を表示 します。 -o option configure 実行時に --enable-full-compat-agent を追加すると 使える。OpenSSH の秘密鍵でも ssh-agent2 としての機能を使用 するための、追加の設定を行える。 使用可能な option は、sha1/md5/pkcs1_oaep/pkcs1/no_padding/sign sha1/md5 は、RSA 鍵で使用可能な hash の指定。 pkcs1_oaep/pkcs1/no_padding は、RSA 鍵で復号する際の padding 指定。 指定されていなければ復号できません。 sign は、ssh-agent で hash を行わないで署名できるようにします。 (ssh-agent2 では細かい制限はない様ですが、このパッチの独自拡張です。) このオプションは暫定仕様です。 c. ssh-keygen -z OpenSSH 形式の秘密鍵を読み、'SECSH Private Key File Format (SECSH 秘密鍵ファイル形式)' の鍵を標準出力に表示します。 また、passphrase を設定した 'SECSH Private Key File Format' も扱えるようになっています。 ssh-3.2.9.1 以降?に追加されたssh-keygen2 で作った秘密鍵にも対応。 d. ssh-agent -p pid プロセス ID pid のプロセスが終了した場合、ssh-agent も終了し ます。 pid として 0 を与えた場合は、親プロセスの pid を与えた場合と 同様に動作します。 login shell で eval `ssh-agent -p 0` で起動するとか、-a option とともに使って、logout せずに ssh-agent を再起動して使い続け る、などに使えると思います。 (環境変数の SSH_AGENT_PID はどうにもできませんが) -1 ssh-agent2 -1 と同じ機能。 RSA1, RSA の鍵を互いに変換して使えるようにします。 -2 configure 実行時に --enable-full-compat-agent を追加すると 使える。ssh-agent2 としての機能を全て使えるようにします。 (-2 option を付けないと使えないのは、reqest SSH_COM_AGENT2_PRIVATE_KEY_OP での command "sign", "sign[pkcs1,sha1]", "sign[pkcs1,md5]", "decrypt" の 4 つで、 付けなくても特殊な場合以外では問題ないでしょう。 というか、付けない方が security 的にはより良いかもしれません。 ssh-agent に debug option '-d' をつけると、どういう command が利用されているか わかります。 Internet Draft(http://ietf.org/html.charters/secsh-charter.html) にあった draft-ietf-secsh-agent-02.txt も参考にしてください。) 4. 互換性 Internet Draft(http://ietf.org/html.charters/secsh-charter.html) にあった draft-ietf-secsh-agent-02.txt に従うようにしました。 OpenSSH に対しては上位互換のはずです。 ただし、同じ鍵を追加した際の鍵の制限の情報の扱いが異なってます。 original だと、鍵の制限の情報は変化しないのに対し、patch をあてると新しい 制限で上書きします。 鍵の同一性はちゃんと確認しているので、鍵の制限の情報の update がやりやすくて いいと思いますがどうでしょうか? openssh-4.4p1-fwd_agent-testing-20061026 以降の ss-add と ssh-agent は以前の版と このパッチで拡張される部分の互換性が無くなっています。 SSH2 に対してはいくつか非互換性があります。 1. ForwardingNotice で送る host 名について調整できる SSH2 では command line で使ったそのまま。 (Internet Draft では SSH2 の仕様を推奨。default は Internet Draft に従う。) 2. forwarding_path で否定表現 "!hostname" が使える。 3. ssh-agent に option を付けないと完全互換でない。 4. ssh-add -D は機能しているが、ssh-agent2 が ssh1 対応になっていないと常に error message を吐く。 5. request を発生させる条件が判らず、debug できないのでどうなるか判らないもの。 6. その他気づいてないもの です。 1,2 は気にしなくても問題ないと思います。 5,6 どうしようもないものです。 3 は 特殊な場合しか関係ないようです。(というか問題の発生が確認できていません。) 4 は error message を無視してください。 5. TODO manual 整備 manual とか英語がなってない気がする。 6. その他 SSH2 の LICENSE に reverse engineer するな、とあり、扱いに注意がいるかも知れない。 しかし、Internet Draft がでたので、LICENSE 問題は緩和されたと思う。 ただし、2004/3/1 時点で最新の ssh-3.2.9.1 は Internet Draft に完全に従っていないため、 互換性のため鍵の追加に関して SSH2 の解析結果を用いている。 また、秘密鍵の変換に関しても SSH2 の解析結果を用いている。 この点について問題が残ったままである。 contrib/restart-agent を使うと、ssh-agent の再起動が楽かもしれない。 井出健智 ide@phys98.homeip.net http://www.phys98.homeip.net/~ide/aboutopenssh.html