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