SSH — 秘密鍵は見せずに、署名だけを見せる
SSH は、遠くのサーバーに安全にログインして操作するための仕組みです。パスワードでも入れますが、現場では公開鍵認証が主流です。理由は1つ。一番大事な秘密(秘密鍵)を、一度も回線に流さずにログインできるからです。
図1でログインの手順を1つずつ進めてください。回線を流れるものを追っていくと、秘密鍵が最後まで手元から動かないことが分かります。「偽のサーバー」に切り替えると、SSHがサーバー側の本人確認もしていることも見えてきます。
鍵は2本1組。閉じる鍵と、確かめる鍵
最初に ssh-keygen で秘密鍵と公開鍵のペアを作ります。公開鍵はサーバーに渡し(authorized_keys に登録)、秘密鍵は自分のPCにしまっておく。公開鍵は名前の通り、誰に見られても構いません。
ログインのとき、サーバーは「この公開鍵と対になる秘密鍵を持っているなら、それを証明して」と言います。クライアントは秘密鍵で署名を作って返し、サーバーは公開鍵でその署名が本物かを確かめる。秘密鍵を持っていなければ作れない印を見せることで、秘密鍵そのものを見せずに証明するのです。
サーバーの本人確認も、SSHの仕事
初めて接続するとき、「このサーバーの指紋は〇〇です。接続しますか?」と聞かれた経験があるかもしれません。これはサーバーのホスト鍵(身分証)を known_hosts に覚えておくための確認です。
2回目以降は、覚えた身分証と照らし合わせます。図1で「偽のサーバー」にすると、身分証が一致しないので接続を止めます。途中で誰かが本物になりすましても、ログインの手前で気づけるわけです。この警告が出たら、「はい」で進めず理由を確かめるのが鉄則です。
ポートフォワーディング — SSHの通路に相乗りする
一度SSHの暗号化された通路ができると、ほかの通信をその中に通すこともできます。これがポートフォワーディングです。外から直接触れないデータベースに、SSHで入れるサーバーを踏み台にして安全につなぐ、といった使い方が定番です。図2で比べてみてください。
22番だけ開いている
- SSH
- 遠くのサーバーに暗号化された通路でログインし、操作するための仕組み。
- 公開鍵認証
- 秘密鍵で作った署名を、登録済みの公開鍵で確かめてログインを許す方式。
- authorized_keys
- サーバー側に置く、ログインを許す公開鍵の一覧。
- known_hosts
- クライアント側に置く、過去に接続したサーバーのホスト鍵の記録。
- ホスト鍵
- サーバー自身の鍵。なりすましを見抜くための身分証になる。
- ポートフォワーディング
- SSHの通路の中に別の通信を通し、離れた場所のポートへ届けること。
まとめ
SSHの公開鍵認証は、秘密鍵を見せる代わりに、秘密鍵でしか作れない署名を見せる方式です。署名は毎回違うデータに対して作るので、盗み見ても使い回せません。同時にSSHはサーバーの身分証も確かめ、なりすましを入口で止めます。そうしてできた安全な通路には、ほかの通信を相乗りさせることもできるのです。