コース一覧
サーバー運用実践:セキュリティ・監視・デプロイ
nginxにHTTPSを設定

サーバー運用実践:セキュリティ・監視・デプロイ

構築済みのnginxサーバーを、専用ユーザー・SSH鍵認証・ufwで保護し、HTTPS化、ログとヘルスチェックの監視、systemdタイマー、リリース切替、ロールバック、障害復旧までを実践します。本番を想定した安全な公開・監視・デプロイの基本を身につける30レッスンのコースです。

1
セキュリティのきほん
01. 専用ユーザーで動かす16分
02. SSH鍵認証16分
03. sshdを固める16分
04. ufwファイアウォール16分
05. ポートの棚卸し16分
06. ミッション サーバーを固める16分
07. 第4章クイズ12分
2
HTTPS
01. HTTPSとTLSのしくみ16分
02. 自己署名証明書を作る16分
03. nginxにHTTPSを設定16分
04. HTTPからのリダイレクト16分
05. ミッション HTTPS化完了16分
06. 第5章クイズ12分
3
運用と監視
01. tmuxで多重端末16分
02. ログローテーション16分
03. エラーログ監視16分
04. ヘルスチェック16分
05. systemdタイマー16分
06. ミッション 監視の自動化16分
07. 第6章クイズ12分
4
デプロイ
01. デプロイの型16分
02. シンボリックリンク16分
03. deploy.sh v216分
04. ロールバック16分
05. ミッション ワンコマンドデプロイ16分
06. 第7章クイズ12分
5
総合制作
01. ゼロから構築ミッション16分
02. 障害対応演習16分
03. 自由拡張16分
04. 完成と次のステップ16分

nginxにHTTPSを設定

443 番で待たせる

証明書と鍵ができました。あとは nginx に「443 番でも待て、そのときはこの証明書を使え」と伝えるだけです。書く場所は 3 章で作った server ブロックの中です。

nginx

server {
    listen 80;
    listen 443 ssl;

    ssl_certificate     /etc/ssl/certs/mysite.crt;
    ssl_certificate_key /etc/ssl/private/mysite.key;

    server_name mysite.local;
    root /var/www/mysite;
    ...
}

足したのは3行です。listen 443 ssl の ssl が、この番号では暗号化して話す、という指定です。これを書き忘れて listen 443 だけにすると、443 番で平文を話すサーバーになり、ブラウザからは何も読めません。

残り2行は、どの証明書とどの鍵を使うかです。ssl_certificate が公開する証明書、ssl_certificate_key が秘密鍵。名前が似ているので、逆に書いて起動しない、というのが定番の失敗です。

80 番の行は消さない

ここでは 80 番の待ち受けを残したままにします。次の回で、80 番に来た訪問者を 443 番へ送る仕組みを作るからです。いま消してしまうと、http:// で来た人が繋がらないサイトになります。

両方書けることが分かると、listen は 1 つの server ブロックに何行でも書ける、という感覚もつかめます。

反映と確認

手順はいつもの3手です。

ターミナル

nginx -t
systemctl reload nginx

nginx -t は証明書と鍵が読めるかどうかも見ます。パスの書き間違いや、鍵の権限が厳しすぎて nginx から読めない場合も、ここで止まります。

警告が出るのが正しい

ターミナル

curl https://localhost/

これは失敗します。

プレーンテキスト

curl: (60) SSL certificate problem: self-signed certificate

壊れているのではありません。前々回に見たとおり、この証明書はブラウザや curl が信頼する一覧に入っていないので、拒まれるのが正しい動きです。ここでエラーが出ないほうがおかしいのです。

信頼の確認をあえて飛ばして中身を見るには、こう書きます。

ターミナル

curl -k https://localhost/

-k は、証明書の検証を省く指定です。これでページが返れば、暗号化そのものは成立していると分かります。足りないのは第三者の保証だけ、という状態が、この2つのコマンドの差にそのまま出ています。

-k は学習と検証のための指定です。本番のスクリプトで使うと、途中の誰かにすり替えられても気づけなくなります。安易に付ける癖を付けないでください。

どんな暗号で話しているかを見る

ターミナル

curl -kv https://localhost/ 2>&1 | grep -i 'SSL connection\|TLS'

-v を付けると、やり取りの詳細が出ます。TLS のどのバージョンで、どの暗号方式で合意したかまで見られます。設定を締めていくときは、ここを見ながら進めます。

ファイアウォールも忘れない

4章で 22 番と 80 番だけを通しました。443 番はまだ塞がったままです。

ターミナル

ufw allow 443/tcp

サーバー本体からの curl は通ってしまうので、この開け忘れは手元では気づけません。外から見えないという苦情で初めて分かる、という典型的な見落としです。待ち受けを足したら、通す設定も足す。4章の点検で見た噛み合わせの話が、そのまま出てきます。

手を動かす

自分のサイトを 443 番でも待たせ、暗号化された通信が成立するところまでを確かめます。ファイアウォールも合わせて開けます。

ヒント

拒まれるのが正しい動きです。エラーが出ないほうを疑ってください

-k は検証を省く指定です。学習と検証のためのもので、本番の運用では使いません

  • 1. mysite.conf に listen 443 ssl; を足す。80 番の行は残す
  • 2. ssl_certificate と ssl_certificate_key で証明書と鍵を指定する
  • 3. nginx -t のあと systemctl reload nginx で反映する
  • 4. curl -k https://localhost/ > /root/https-ok.txt で中身を保存する
  • 5. curl https://localhost/ > /root/https-refused.txt 2>&1 で拒まれる様子を保存する。-s は付けない。そのあと ufw allow 443/tcp を打つ

Linux は使うときに起動します(初回は約102MB通信します)

10 項目で採点します