むりやり 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
