クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

安全な通信プロトコルの選び方

このレッスンのあとで: 通信で守りたいことに合わせて、安全なプロトコルを選べる。

60分のレッスンコマンド5件WireGuard のラボ:2つの拠点をつなぐ VPN トンネルをブラウザーで作る

安全な通信プロトコルは何を守るか

安全な通信プロトコルとは、通信を暗号化し、相手が本物かを確かめ、途中で書き換えられていないかを見張る決まりのことです。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文字に見えます。

実行のたびに鍵は新しい乱数ですが、長さは変わりません。秘密鍵は、画面に出して見せたり、人に送ったりしてはいけません。

発展: 設定の点検表

自分が使っているサービスを一つ選び、通信が暗号化されているかを調べます。ブラウザーの鍵の印と、サイトの証明書の名前を確かめましょう。

最後に、守れていない点を一つ見つけ、直す方法を一文で書きます。

このラボとソースについて: WireGuard のラボ:2つの拠点をつなぐ VPN トンネルをブラウザーで作る

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。