opensshの鍵交換について意外にまとまっているページが無いのでまとめてみる。

鍵の種類


現在はほぼssh2かつrsaがデフォルト。

種類 作成コマンド パス 説明
SSH1 RSA ssh-keygen -t rsa1 ~/.ssh/identity SSH v1のみ
SSH2 RSA ssh-keygen -t rsa
(”-t”オプションなしはこれ)
~/.ssh/id_rsa 特許期限切れ後、SSH v2で利用可能に
SSH2 DSA ssh-keygen -t dsa ~/.ssh/id_dsa SSH v2のみ

公開鍵と秘密鍵


接続元ユーザの秘密鍵(SSH client)⇔接続先ユーザの公開鍵(SSH server)のペアで認証される。キーペアはどこで作成したものかは問われない(鍵の中に作成したホスト、ユーザの情報は持っていない)。ファイルは暗号化されたテキストファイルの為、コピー&ペーストで操作しても問題はないが、適切なパーミッション(秘密鍵は600、公開鍵は644で良さそう)が設定されていないと正しく動作しない。Linuxなら/var/log/secureあたりを確認してエラーが出ていないか確認する。

接続元ユーザの秘密鍵(デフォルト) 接続先ユーザの公開鍵
~/.ssh/identity
~/.ssh/id_rsa
~/.ssh/id_dsa
~/.ssh/authorized_keys(※)

※OpenSSHのバージョンが古いものは、SSH2のみ”authorized_keys2″としていたが現在は統一されている

※公開鍵に複数指定が必要な場合は改行して追記することが可能

鍵変換


SSH関連ソフトウェアの鍵生成ツールにはOpenSSH変換機能がある。PuttyGenなら、”Conversions→Import  key/Export OpenSSH key”等の操作でssh-keygenで作成した秘密鍵⇔OpenSSH鍵を相互に変換することができる。不要に鍵ファイルを増やすことが無いよう注意。

設定ファイル(SSH server)


OpenSSH serverの設定ファイルは/etc/ssh/sshd_config。デフォルトで鍵認証は許されているはずなので、よりセキュアな設定とする為にはパスワード認証は許可しない等の設定を追加する。もちろんパスワード認証拒否は公開鍵認証での接続が確認できてから。

/etc/ssh/sshd_config設定 説明
PasswordAuthentication パスワード認証の許可
ChallengeResponseAuthentication インタラクティブなパスワード認証の許可
RSAAuthentication RSA鍵認証の許可(SSH1のみ)
PubkeyAuthentication 公開鍵認証の許可
AuthorizedKeyFile 公開鍵のパス

設定ファイル(SSH client)


OpenSSH clientのデフォルト設定は/etc/ssh/ssh_config。オプション指定なしの場合にデフォルトで利用される秘密鍵等もここで定義されているが、ユーザ単位で操作する場合には、同一書式で、~/.ssh/configに記載しておくことで細かいオプションをHost指定で設定できる。詳細はssh_configのmanを参照。

# 設定サンプル
Host cent70
    Hostname 192.168.x.x
    PubkeyAuthentication no
    User root

Host 86sol11
    Hostname 192.168.x.x
    IdentityFile ~/.ssh/id_rsa
    Port 22222
    User XXXX

sshコマンドオプション


覚えておくべきsshコマンドのオプションはこのくらい。

ssh [オプション] 接続先ホスト [リモート実行コマンド] 説明
-l 接続先ユーザ指定(デフォルトは実行ユーザと同じ、接続先ホスト名の前に@指定も可能)
-i 秘密鍵ファイル指定
-p ポート番号がデフォルトの22以外を使用している場合に指定
-X X11フォワードしたい場合に指定(Oracle導入等、Xを使いたい時に覚えておくと便利)
接続先ホスト config指定のHost、名前解決できる名前、IPアドレス等を指定できる
リモート実行コマンド ホスト名指定に続けて実行するコマンドを指定することができる

known_hosts


初めてsshサーバに接続した際に、接続元ユーザの~/.ssh/known_hostsにサーバのホスト公開鍵が保存される(追記型)。サーバのホスト鍵は前項の”接続先ホスト”に指定した名前単位(config指定のHost、名前解決できる名前、IPアドレス)で管理され、同一の名前で接続した先のホスト鍵が異なると、接続に失敗するので、known_hostsから該当行を削除(またはコマンドにより削除可能)する必要がある。

# はじめての接続
$ ssh aaaaa
Are you sure you want to continue connecting (yes/no)? 

# 同じ名前で異なるホスト公開鍵だった場合
$ ssh aaaaa
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

# known_hostsから接続先ホストの公開鍵を削除
$ ssh-keygen -R aaaaa
/root/.ssh/known_hosts updated.
Original contents retained as /root/.ssh/known_hosts.old

 

TOP