見知らぬ人に話しすぎた書店
町の書店が Web サイトを公開しました。だれも侵入していません。でも、どのソフトを使っているかが分かり、バックアップのファイルが読め、仕入れ先の名前が並ぶフォルダの一覧まで見えます。
設定は、ソフトが最初から持っていたものでした。安全な初期設定は、サーバーを出す人の最初の仕事です。
このレッスンのゴール
メモ
Web サーバーの設定を、チェックリストと見比べて見直せる。
大事な言葉
| ことば | いみ | れい |
|---|---|---|
| ハードニング | 設定を変えて、漏らすものと許すものを減らすこと(hardening) | |
| ヘッダー | Web の返事といっしょに届く、事実を並べた行(header) | |
| ステータスコード | 要求がどうなったかを表す番号 | 404 |
| 初期設定 | 何も選ばなかったときに使われる設定(default) | |
| 攻撃対象領域 | 外の人が届く範囲のすべて(attack surface) | |
| リロード | 止めずに、サーバーに設定を読み直させること |
学生が入力するセルは、このプレビューでは空白です。
サーバーは、ページ以外も返す
Web サーバーの返事には、ステータスコードとヘッダーがついています。コードは結果を表します。200 は成功、404 は見つからない、405 は許されない方法です。
ヘッダーは、話しすぎることがあります。外の人が1つ事実を知るたびに、攻撃対象領域が少し広がります。
ラボには、書店の Web サーバー web があります。次の3つの Run は、サーバーが何を言うかを見るだけです。
返事のヘッダーを読む
curl -s -I http://webここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
ないページを頼む
curl -s -o /dev/null -w "%{http_code}\n" http://web/nothing-hereここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
静的サイトが断る方法を試す
curl -s -o /dev/null -w "%{http_code}\n" -X DELETE http://web/ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
見直しは、設定をチェックリストと比べる
サーバーをハードニングするには、設定を1行ずつ読み、毎回同じ問いをします。話しすぎていないか。許しすぎていないか。記録を残しているか。
初期設定は、始めやすいように作られていて、そのまま置いても安全とは限りません。表に、よくある危険を並べました。
例: 見直しのチェックリスト
| 設定 | 危険 | より安全な選択 |
|---|---|---|
| 古いプロトコルの版 | 知られた弱点を突かれる | 新しい版だけ許す |
| アップロードの大きさに上限なし | 1人でディスクをいっぱいにできる | 合う上限を決める |
| ログを切っている | 何が起きたか、だれも見られない | ログを残す |
| どのサイトからも API を呼べる | 他のサイトがデータを読める | 許すサイトを名指しする |
学生が入力するセルは、このプレビューでは空白です。
見直す書店の設定
server {
listen 443 ssl;
server_name books.example.com;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
client_max_body_size 0;
access_log off;
add_header Access-Control-Allow-Origin *;
location / {
proxy_pass http://127.0.0.1:3000;
}
}よくある間違い
注意
版の番号を隠せばサーバーは安全になる、と思う人が多いです。隠れるのは手がかり1つだけです。外の人は、知られた欠陥をすべて試せます。手がかりを隠すだけでなく、ソフトを新しく保ち、いらないものを取り除きます。
変えたら、試してからリロード
設定にまちがいがあると、nginx はリロードを断り、エラーをログに書いて、前の設定のまま動き続けます。けれども、次に再起動したとき、サーバーは起動しません。だから、先にファイルを試します。nginx には、設定を読んで正しいかを答えるテストがあります。
試すのは先で、そのあとでリロードします。リロードは、動いているサーバーに、お客さんを切らずに新しい設定を読ませます。
チェックのスクリプトは、チェックリストの各項目を合格か不合格にして、見直しを機械にくり返させます。ラボにもあり、レッスンのあとで使えます。
設定を試す(何も変えない)
docker exec web nginx -tここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
動いている版を聞く
docker exec web nginx -vここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
もう一歩先へ
課題のあとで、lint_config に7つ目のルールを足しましょう。client_max_body_size の大きさが 100m を超えていれば big-upload-limit です。大きさは k か m で終わります。
テストを自分で2つ書きます。client_max_body_size 500m; と client_max_body_size 2m; です。指摘が出るのは1つ目だけだと確かめましょう。