SSH の鍵管理


Solaris9 を入れたら,ssh がついていました.

SSH Version Sun_SSH_1.0, protocol versions 1.5/2.0.

みたいなやつでした.どうも,OpenSSHベースのようです. 学校で使っている ssh2 やら ssh1 やら OpenSSHやらわけわからなく なったので,メモがてらにまとめてみました.
主に,鍵の互換性などについて書いてありますが, それ以上にセキュリティにも注意してください.

SSHの分類

SSHには,おおまかにわけて, SSH Communications Security の作っている SSH と, OpenSSHというのがあります. それぞれ,Protocol 1 と Protocol 2があります. ここでは,便宜上, SSH1, SSH2, OpenSSH1, OpenSSH2と表記することにします.
Sun_SSHの設定は,OpenSSHと同じようです.
あと,lshというのとか, OSSHとかあるようですが,使っている人いるのかな….
SSH2やOpenSSH2では,設定によっては,SSH1,OpenSSH1でのクライアントからの 認証に答えることができます.

OpenSSHとSSH,Protocol 1とProtocol 2

OpenSSHとSSHでは,鍵の形式が異なります. ただし,簡単な変換で,相互の認証が可能となります.
SSH1
サーバ
OpenSSH1
サーバ
SSH2
サーバ
OpenSSH2
サーバ
SSH1
クライアント
OpenSSH1
クライアント
SSH2
クライアント
××
OpenSSH2
クライアント
××
△は,サーバの設定しだいです.

SSH2のサーバで,Protocol 1(SSH1, OpenSSH1)のクライアント

SSH2のサーバは,

/etc/ssh2/sshd2_config:
Ssh1Compatibility               yes

とすることで,Protocol 1のクライアントからの認証を受けつけることが できます. ただし,ssh1 をインストールしておく必要があります.

OpenSSH2のサーバで,Protocol 1(SSH1, OpenSSH1)のクライアント

OpenSSH2のサーバでも,Protocol 1のクライアントからの 認証が可能です.SSH2との違いは,OpenSSHのサーバ自体が, Protocol 1 も 2も話すことです.ssh1などを別途インストールする 必要はありません.
設定は以下のとおり.

/etc/ssh/sshd_config:
Protocol 2,1
HostKey /etc/ssh/ssh_host_key

Protocol 1用の鍵は入らないので,新規に作ってやるか, もしくは,ssh1 で使っていた鍵を流用することができます.
新規に作るには,

# /usr/bin/ssh-keygen -b 1024 -t rsa1 -f /etc/ssh/ssh_host_key -N '' 

とするといいです.

鍵の生成

鍵の配置

公開鍵 秘密鍵
SSH1~/.ssh/authorized_keys~/.ssh/identity
OpenSSH1~/.ssh/authorized_keys~/.ssh/identity
SSH2 ~/.ssh2/authorizationで指定 ~/.ssh2/identificationで指定
OpenSSH2 ~/.ssh/authorized_keys~/.ssh/id_dsa
~/.ssh/id_rsa

SSH1 と OpenSSH1 では,同じ公開鍵と秘密鍵を使うことができます. 設定なども同じです.

ここで,~/.ssh/authorized_keys は,SSH1とOpenSSH1だけでなく, OpenSSH2でも使うことがわかります. ~/.ssh/authorized_keysは,以下のように複数のProtocolの鍵を 入れることができます.

~/.ssh/authorized_keys:

1024 41 13403979999670711380 〜 4092737 okada@server
ssh-dss AAAAB3NzaC1kc3MAAACB 〜 cbeiLps=
ssh-rsa AAAAB3NzaC1kc3MAAACB 〜 cbeiLps=

~/.ssh/authorized_keys2 を使うものもありますが, 詳しくはマニュアルを読んで調べてください.

OpenSSH1 の鍵生成

OpenSSHの ssh-keygen を使って,鍵の生成を行ないます.

% ssh-keygen -b 1024 -t rsa1

/home/kokada/.ssh/identity と /home/kokada/.ssh/identity.pub が できます.

% cat ~/.ssh/identity.pub >> ~/.ssh/authorized_keys
% chmod 600 ~/.ssh/authorized_keys

してください.

SSH1 の鍵生成

SSH1の ssh-keygen を使って,鍵の生成を行ないます.

% ssh-keygen1

/home/kokada/.ssh/identity と /home/kokada/.ssh/identity.pub が できます.

% cat ~/.ssh/identity.pub >> ~/.ssh/authorized_keys
% chmod 600 ~/.ssh/authorized_keys

してください.

OpenSSH2 の鍵生成

OpenSSHの ssh-keygenを使って,鍵の生成を行ないます.

% ssh-keygen -b 1024 -t dsa
% cat ~/.ssh/id_dsa.pub >>  ~/.ssh/authorized_keys
% chmod 600 ~/.ssh/authorized_keys

もしくは,

% ssh-keygen -b 1024 -t rsa
% cat ~/.ssh/id_rsa.pub >>  ~/.ssh/authorized_keys
% chmod 600 ~/.ssh/authorized_keys

してください.

SSH2 の鍵生成

SSH2の ssh-keygen2を使って,鍵の生成を行ないます.

% ssh-keygen2 -b 1024 -t dsa

秘密鍵 /home/kokada/.ssh2/id_dsa_1024_a
公開鍵 /home/kokada/.ssh2/id_dsa_1024_a.pub
ができます. SSH2では,各鍵の位置は, ~/.ssh2/authorization と ~/.ssh2/identification で 指定します.

~/.ssh2/identification:
IdKey id_dsa_1024_a

~/.ssh2/authorization:
Key     id_dsa_1024_a.pub

複数指定したり,名前を変えたりもできます.

鍵の変換

OpenSSH1 と SSH1 の鍵は,そのままで使い回すことができます.
しかし, OpenSSH2 と SSH2 の鍵は,形式の変換が必要です.
わたしは,SSH2で作った鍵をOpenSSHのssh-keygenを使って, OpenSSH2用の鍵に変換して,両者の鍵を共有しています.

OpenSSH2 の鍵を SSH2で使う

OpenSSHの ssh-keygen を使って,鍵の変換を行ないます.


% ssh-keygen -e -f ~/.ssh/id_dsa.pub > ~/.ssh2/id_dsa_openssh.pub

~/.ssh2/authorization も変更しておきます.

秘密鍵の変換について間違っていましたので,修正しました(2005/06/03). ありがとうございます(To 小林さん).

Sun_SSHでは,このあたりのオプションが 微妙に違うようです. (ベースのOpenSSHが違う?)

/usr/bin/ssh-keygen -x -f ~/.ssh/id_dsa > ~/.ssh2/id_dsa

SSH2 の鍵を OpenSSH2で使う

OpenSSHの ssh-keygen を使って,鍵の変換を行ないます.

% ssh-keygen -i -f ~/.ssh2/id_dsa_1024_a.pub >> ~/.ssh/authorized_keys
% ssh-keygen -i -f ~/.ssh2/id_dsa_1024_a > ~/.ssh/id_dsa
% chmod 600 ~/.ssh/id_dsa

RSAの場合は,

% ssh-keygen -i -f ~/.ssh2/id_rsa_1024_a.pub >> ~/.ssh/authorized_keys
% ssh-keygen -i -f ~/.ssh2/id_rsa_1024_a > ~/.ssh/id_rsa
% chmod 600 ~/.ssh/id_rsa

ただし,鍵が暗号化されていない場合 (passphrase が空の場合)しか変換することができないようです. だめな場合は,以下のようになります.

unsupported cipher 3des-cbc
decode blob failed.

ここに,暗号化されている場合の方法がありました. 情報ありがとうございます(To 小林さん)

鍵はそれぞれで用意し,公開鍵のみ両方で使う

上にも書いたように,一般にはSSH2とOpenSSH2とで秘密鍵の変換はできません. そこで,秘密鍵,公開鍵はそれぞれについて生成し, 公開鍵のみ両者で使う方法について検討します.

まず,鍵の組を SSH2,OpenSSH2 それぞれについて準備します. 生成の方法については,前項目を参照してください.

次に,OpenSSH2 で作成した公開鍵を SSH2のサーバでも使えるように します.鍵の変換には OpenSSH2 の ssh-keygen を使います. OpenSSH2で作成した

% ssh-keygen -e -f ~/.ssh/id_dsa.pub > ~/.ssh2/id_dsa_openssh.pub
% echo "Key id_dsa_openssh.pub" >> ~/.ssh2/authorization

SSH2 で作成した公開鍵を OpenSSH2のサーバでも使えるようにもします.

% ssh-keygen -i -f ~/.ssh2/id_dsa_1024_a.pub >> ~/.ssh/authorized_keys