安全な通信プロトコルは何を守るか
安全な通信プロトコルとは、通信を暗号化し、相手が本物かを確かめ、途中で書き換えられていないかを見張る決まりのことです。TLSやSSHが代表です。
同じ内容を送るのでも、暗号の無いプロトコルを選ぶと、途中の誰でも読めます。守りたいものに合わせて、選べるようになりましょう。
このレッスンのゴール
メモ
通信で守りたいことに合わせて、安全なプロトコルを選べる。
重要な言葉
| ことば | いみ |
|---|---|
| 暗号化 | 鍵を持つ人だけが読めるように変えること |
| 認証 | 相手が本物かを確かめること |
| 完全性 | 途中で書き換えられていないこと |
| 証明書 | サーバーが本物だと示す、第三者の署名付きの書類 |
| 平文 | 暗号にしていない、そのまま読める文字 |
| トンネル | 通信全体を包んで、別の道で運ぶ仕組み |
学生が入力するセルは、このプレビューでは空白です。
通信で守りたい三つのこと
守りたいことは三つです。暗号化は、他人に読ませないこと。認証は、相手が本物だと確かめること。完全性は、途中で書き換えられていないと確かめることです。
安全なプロトコルは、この三つをまとめて満たします。暗号の無いものは、どれも満たしません。
例: プロトコルと守れること
| プロトコル | 暗号化 | 相手の確認 | 代わりに使うもの |
|---|---|---|---|
| HTTP | なし | なし | HTTPS(TLS) |
| Telnet | なし | パスワードのみ | SSH |
| FTP | なし | パスワードのみ | SFTP |
| HTTPS(TLS) | あり | 証明書 | そのまま使う |
| SSH | あり | 鍵 | そのまま使う |
学生が入力するセルは、このプレビューでは空白です。
文字を符号化する
printf 'admin:hunter2' | base64ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
符号を元に戻す
echo YWRtaW46aHVudGVyMg== | base64 -dここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
符号化は暗号化ではない
最初の実行は YWRtaW46aHVudGVyMg== と出ます。次の実行は、鍵も要らず、元の admin:hunter2 に戻します。
base64は、文字を決まった別の形に直すだけです。誰でも元に戻せます。ウェブの古い認証は、この形で名前とパスワードを送ります。
ある文字の要約を取る
printf 'hello' | sha256sumここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
一文字だけ変えて、要約を取る
printf 'hellp' | sha256sumここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
一文字の違いで要約が変わる
hello の要約は 2cf24dba で始まり、hellp の要約は fdd7585e で始まります。一文字の違いで、まるで別の値になります。
安全なプロトコルは、通信にこの種の署名を付けます。途中で一文字でも変われば、受け取る側が気づきます。これが完全性です。
TLSは暗号化と相手の確認を行う
TLSは、ウェブの暗号化に使います。始めに、ブラウザーはサーバーの証明書を受け取り、信頼できる署名があるかを確かめます。
確かめたら、二者だけが知る鍵を作ります。以降の通信は、その鍵で暗号化されます。下の図は、その順番です。
よくある間違い
注意
「鍵の印(HTTPS)があれば、そのサイトは安全」と思う人が多いです。HTTPSは、通信が暗号化され、サーバーが証明書の名前の持ち主だと確かめられた、という意味です。サイトの中身まで保証しません。
SSHはパスワードより鍵が強い
SSHは、遠隔ログインの通信を暗号化します。ログインには、パスワードか、鍵のペアを使います。
パスワードは、世界中から総当たりで試されます。鍵は、持っている人だけが入れるので、強い選択です。サーバー側でパスワード認証を切ると、総当たりは意味を失います。
DNSの問い合わせは覗かれ、偽られる
名前を引くDNSは、ふつう暗号が無く、誰が何のサイトを見たかが、途中の機器から見えます。偽の答えを返されるおそれもあります。
対策は二つです。問い合わせを暗号化するDNS over HTTPSなどを使うこと。答えに署名を付けて確かめる仕組みを使うことです。
トンネルは通信全体を包む
アプリごとに暗号化できないときは、トンネルで包みます。二つの拠点の間の通信を、まとめて暗号化して運びます。WireGuardがその例です。
WireGuardの鍵は、32バイトの乱数をbase64の文字にしたものです。次のコマンドで、鍵そのものは見ずに、長さだけを確かめます。
使い捨ての鍵の長さを数える
wg genkey | base64 -d | wc -cここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
出力の読み方
出力は 32 です。鍵は32バイトで、文字では44文字に見えます。
実行のたびに鍵は新しい乱数ですが、長さは変わりません。秘密鍵は、画面に出して見せたり、人に送ったりしてはいけません。
発展: 設定の点検表
自分が使っているサービスを一つ選び、通信が暗号化されているかを調べます。ブラウザーの鍵の印と、サイトの証明書の名前を確かめましょう。
最後に、守れていない点を一つ見つけ、直す方法を一文で書きます。