Ubuntu 22.04でCloudflareとNginxを使用してウェブサイトをホストする方法

著者は、プログラムの一環として寄付先にElectronic Frontier Foundationを選択しました。

紹介

Cloudflareは、訪問者とウェブサイトの所有者のサーバーの間に位置し、ウェブサイトの逆プロキシとして機能するサービスです。Cloudflareは、コンテンツデリバリーネットワーク(CDN)を提供すると同時に、DDoS対策や分散型ドメインネームサーバーサービスも提供しています。

Nginxは、インターネット上で最も大規模で高トラフィックなサイトのいくつかをホストする責任がある人気のあるWebサーバーです。組織がNginxを使用してウェブサイトを提供し、CDNおよびDNSプロバイダーとしてCloudflareを使用するのは一般的です。

このチュートリアルでは、CloudflareのOrigin CA証明書を使用してNginxでサービスされるウェブサイトをセキュリティで保護し、その後、Nginxを認証済みのプルリクエストを使用するように構成します。このセットアップを使用する利点は、CloudflareのCDNと高速DNS解決の恩恵を受けながら、すべての接続がCloudflareを介して通過するようにすることです。これにより、悪意のあるリクエストがサーバーに到達するのを防ぎます。

前提条件

このチュートリアルを完了するには、以下が必要です:

ステップ1 — オリジンCA TLS証明書の生成

Cloudflare Origin CAを使用すると、Cloudflareによって署名された無料のTLS証明書を生成してNginxサーバーにインストールできます。Cloudflareが生成したTLS証明書を使用することで、CloudflareのサーバーとNginxサーバー間の接続を安全にできます。

Origin CAを使用して証明書を生成するには、WebブラウザでCloudflareアカウントにログインします。セキュリティを強化したいドメインを選択し、CloudflareダッシュボードのSSL/TLSセクションに移動します。そこから、Origin Serverタブに移動し、Create Certificateボタンをクリックします:

Generate private key and CSR with Cloudflareのデフォルトオプションを選択したままにしておきます。

Createをクリックすると、Origin CertificateとPrivate keyが表示されるダイアログが表示されます。セキュリティ上の理由から、Private Key情報は再表示されませんので、Okをクリックする前にキーをサーバーにコピーしてください。

サーバー上でOrigin Certificateとプライベートキーのファイルを保持するために、/etc/sslディレクトリを使用します。このフォルダは既にサーバーに存在しています。

まず、ブラウザのダイアログボックスに表示されるOrigin Certificateの内容をコピーします。

次に、サーバー上で、好みのテキストエディタで/etc/ssl/cert.pemを開きます:

  1. sudo nano /etc/ssl/cert.pem

証明書の内容をファイルに貼り付けます。その後、エディタを保存して終了します。nanoを使用している場合は、Ctrl+Xを押し、プロンプトが表示されたらYを押してEnterを押します。

その後、ブラウザに戻ってPrivate keyの内容をコピーします。編集用にファイル/etc/ssl/key.pemを開きます:

  1. sudo nano /etc/ssl/key.pem

プライベートキーをファイルに貼り付け、ファイルを保存してエディタを終了します。

注意:時々、Cloudflare ダッシュボードから証明書とキーをコピーし、サーバーの関連ファイルに貼り付けると、空行が挿入されることがあります。Nginx はそのような証明書とキーを無効と見なすため、ファイルに空行がないことを確認してください。

警告:Cloudflare のオリジン CA 証明書は、Cloudflare だけが信頼しているため、Cloudflare にアクティブに接続されているオリジンサーバーでのみ使用する必要があります。Cloudflare を一時停止または無効にすると、オリジン CA 証明書が信頼されていない証明書エラーを発生させます。

サーバーにキーと証明書ファイルをコピーしたので、それらを使用するように Nginx 構成を更新する必要があります。

ステップ 2 — Nginx にオリジン CA 証明書をインストールする

前のセクションで、Cloudflare のダッシュボードを使用してオリジン証明書と秘密鍵を生成し、ファイルをサーバーに保存しました。これで、サイトの Nginx 構成を更新して、Cloudflare のサーバーとサーバー間の接続をセキュリティで保護するために、オリジン証明書と秘密鍵を使用します。

まず、UFW が HTTPS トラフィックを許可するようにしてください。ポート 80 (HTTP) とポート 443 (HTTPS) の両方を開く Nginx Full を有効にします:

  1. sudo ufw allow 'Nginx Full'

そして、UFW をリロードします:

  1. sudo ufw reload

最後に、新しいルールが許可されており、UFW がアクティブであることを確認してください:

  1. sudo ufw status

次のような出力が表示されます:

Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx Full ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx Full (v6) ALLOW Anywhere (v6)

これで、Nginxサーバーブロックを調整する準備が整いました。Nginxはインストール時にデフォルトのサーバーブロックを作成します。カスタムのサーバーブロックをすでに設定している場合は、存在する場合は削除してください:

  1. sudo rm /etc/nginx/sites-enabled/default

次に、ドメインのNginx構成ファイルを開きます:

  1. sudo nano /etc/nginx/sites-available/your_domain

ファイルは次のようになります:

/etc/nginx/sites-available/your_domain
server {
        listen 80;
        listen [::]:80;

        root /var/www/your_domain/html;
        index index.html index.htm index.nginx-debian.html;

        server_name your_domain www.your_domain;

        location / {
                try_files $uri $uri/ =404;
        }
}

次の操作を行うためにNginx構成ファイルを変更します:

  • ポート80でリクエストを受け付け、すべてのリクエストをhttpsを使用してリダイレクトします。
  • ポート443でリクエストを受け付け、前のセクションで追加したオリジン証明書と秘密鍵を使用します。

ファイルを次のように変更します:

/etc/nginx/sites-available/your_domain
server {
    listen 80;
    listen [::]:80;
    server_name your_domain www.your_domain;
    return 302 https://$server_name$request_uri;
}

server {

    # SSL設定

    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    ssl_certificate         /etc/ssl/cert.pem;
    ssl_certificate_key     /etc/ssl/key.pem;

    server_name your_domain www.your_domain;

    root /var/www/your_domain/html;
    index index.html index.htm index.nginx-debian.html;


    location / {
            try_files $uri $uri/ =404;
    }
}

ファイルを保存してエディターを終了します。

次に、Nginx構成ファイルに構文エラーがないことを確認するためにテストします:

  1. sudo nginx -t

問題がなければ、変更内容を有効にするためにNginxを再起動します:

  1. sudo systemctl restart nginx

次に、CloudflareダッシュボードのSSL/TLSセクションに移動し、概要タブに移動し、SSL/TLS暗号化モード完全 (厳格)に変更します。これにより、CloudflareとオリジンNginxサーバー間の接続が常に暗号化されるようにCloudflareに通知されます。

これで、ウェブサイトをhttps://your_domainで訪問して正しく設定されているかを確認できます。ホームページが表示され、ブラウザがサイトが安全であると報告します。

証明書の詳細を表示するには、ブラウザの開発者ツールにアクセスし、セキュリティタブを選択し、証明書を表示してください。

注意: 証明書にCloudflareが発行者として表示されない場合があります。これは、CloudflareがLet’s Encryptなどの他の証明書機関を使用する場合があるためです。完全なリストについては、Cloudflareの証明書機関に関する製品ドキュメントを確認してください。

次のセクションでは、認証済みのオリジンプルを設定して、オリジンサーバーがCloudflareと通信していることを確認します。これにより、NginxはCloudflareからの有効なクライアント証明書を使用するリクエストのみを受け入れるように構成され、Cloudflareを経由していないすべてのリクエストは破棄されます。

ステップ3 — 認証済みのオリジンプルの設定

オリジンCA証明書は、Cloudflareが正しいオリジンサーバーと通信していることを検証するのに役立ちます。このステップでは、TLSクライアント認証を使用して、オリジンのNginxサーバーがCloudflareと通信していることを確認します。

クライアント認証されたTLSハンドシェイクでは、両側が検証される証明書を提供します。オリジンサーバーは、Cloudflareの有効なクライアント証明書を使用するリクエストのみを受け入れるように構成されています。Cloudflareを経由していないリクエストは、Cloudflareの証明書を持っていないため、ドロップされます。これにより、攻撃者はCloudflareのセキュリティ対策を回避してNginxサーバーに直接接続することはできません。

Cloudflareは、次の証明書でCAによって署名された証明書を提供します:

-----BEGIN CERTIFICATE-----
MIIGCjCCA/KgAwIBAgIIV5G6lVbCLmEwDQYJKoZIhvcNAQENBQAwgZAxCzAJBgNV
BAYTAlVTMRkwFwYDVQQKExBDbG91ZEZsYXJlLCBJbmMuMRQwEgYDVQQLEwtPcmln
aW4gUHVsbDEWMBQGA1UEBxMNU2FuIEZyYW5jaXNjbzETMBEGA1UECBMKQ2FsaWZv
cm5pYTEjMCEGA1UEAxMab3JpZ2luLXB1bGwuY2xvdWRmbGFyZS5uZXQwHhcNMTkx
MDEwMTg0NTAwWhcNMjkxMTAxMTcwMDAwWjCBkDELMAkGA1UEBhMCVVMxGTAXBgNV
BAoTEENsb3VkRmxhcmUsIEluYy4xFDASBgNVBAsTC09yaWdpbiBQdWxsMRYwFAYD
VQQHEw1TYW4gRnJhbmNpc2NvMRMwEQYDVQQIEwpDYWxpZm9ybmlhMSMwIQYDVQQD
ExpvcmlnaW4tcHVsbC5jbG91ZGZsYXJlLm5ldDCCAiIwDQYJKoZIhvcNAQEBBQAD
ggIPADCCAgoCggIBAN2y2zojYfl0bKfhp0AJBFeV+jQqbCw3sHmvEPwLmqDLqynI
42tZXR5y914ZB9ZrwbL/K5O46exd/LujJnV2b3dzcx5rtiQzso0xzljqbnbQT20e
ihx/WrF4OkZKydZzsdaJsWAPuplDH5P7J82q3re88jQdgE5hqjqFZ3clCG7lxoBw
hLaazm3NJJlUfzdk97ouRvnFGAuXd5cQVx8jYOOeU60sWqmMe4QHdOvpqB91bJoY
QSKVFjUgHeTpN8tNpKJfb9LIn3pun3bC9NKNHtRKMNX3Kl/sAPq7q/AlndvA2Kw3
Dkum2mHQUGdzVHqcOgea9BGjLK2h7SuX93zTWL02u799dr6Xkrad/WShHchfjjRn
aL35niJUDr02YJtPgxWObsrfOU63B8juLUphW/4BOjjJyAG5l9j1//aUGEi/sEe5
lqVv0P78QrxoxR+MMXiJwQab5FB8TG/ac6mRHgF9CmkX90uaRh+OC07XjTdfSKGR
PpM9hB2ZhLol/nf8qmoLdoD5HvODZuKu2+muKeVHXgw2/A6wM7OwrinxZiyBk5Hh
CvaADH7PZpU6z/zv5NU5HSvXiKtCzFuDu4/Zfi34RfHXeCUfHAb4KfNRXJwMsxUa
+4ZpSAX2G6RnGU5meuXpU5/V+DQJp/e69XyyY6RXDoMywaEFlIlXBqjRRA2pAgMB
AAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgECMB0GA1Ud
DgQWBBRDWUsraYuA4REzalfNVzjann3F6zAfBgNVHSMEGDAWgBRDWUsraYuA4REz
alfNVzjann3F6zANBgkqhkiG9w0BAQ0FAAOCAgEAkQ+T9nqcSlAuW/90DeYmQOW1
QhqOor5psBEGvxbNGV2hdLJY8h6QUq48BCevcMChg/L1CkznBNI40i3/6heDn3IS
zVEwXKf34pPFCACWVMZxbQjkNRTiH8iRur9EsaNQ5oXCPJkhwg2+IFyoPAAYURoX
VcI9SCDUa45clmYHJ/XYwV1icGVI8/9b2JUqklnOTa5tugwIUi5sTfipNcJXHhgz
6BKYDl0/UP0lLKbsUETXeTGDiDpxZYIgbcFrRDDkHC6BSvdWVEiH5b9mH2BON60z
0O0j8EEKTwi9jnafVtZQXP/D8yoVowdFDjXcKkOPF/1gIh9qrFR6GdoPVgB3SkLc
5ulBqZaCHm563jsvWb/kXJnlFxW+1bsO9BDD6DweBcGdNurgmH625wBXksSdD7y/
fakk8DagjbjKShYlPEFOAqEcliwjF45eabL0t27MJV61O/jHzHL3dknXeE4BDa2j
bA+JbyJeUMtU7KMsxvx82RmhqBEJJDBCJ3scVptvhDMRrtqDBW5JShxoAOcpFQGm
iYWicn46nPDjgTU0bX1ZPpTpryXbvciVL5RkVBuyX2ntcOLDPlZWgxZCBp96x07F
AnOzKgZk4RzZPNAxCXERVxajn/FLcOhglVAKo5H0ac+AitlQ0ip55D2/mf8o72tM
fVQ6VpyjEXdiIXWUq/o=
-----END CERTIFICATE-----

また、証明書はCloudflareのドキュメントから直接ダウンロードすることもできます。

この証明書をコピーしてください。

次に、Cloudflareの証明書を保持するファイル/etc/ssl/cloudflare.crtを作成します:

  1. sudo nano /etc/ssl/cloudflare.crt

証明書をファイルに追加します。その後、ファイルを保存してエディタを終了します。

次に、Nginxの構成をTLS認証されたオリジンプルに更新します。ドメインの構成ファイルを開きます:

  1. sudo nano /etc/nginx/sites-available/your_domain

次の例に示すように、ssl_client_certificateおよびssl_verify_clientディレクティブを追加します:

/etc/nginx/sites-available/your_domain
. . .

server {

    # SSL configuration

    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    ssl_certificate         /etc/ssl/cert.pem;
    ssl_certificate_key     /etc/ssl/key.pem;
    ssl_client_certificate /etc/ssl/cloudflare.crt;
    ssl_verify_client on;

    . . .

ファイルを保存してエディタを終了します。

次に、Nginxで構文エラーがないかをテストします:

  1. sudo nginx -t

問題がない場合は、変更を有効にするためにNginxを再起動します:

  1. sudo systemctl restart nginx

最後に、認証済みプルを有効にするには、CloudflareダッシュボードでSSL/TLSセクションを開き、オリジンサーバータブに移動し、認証済みオリジンプルオプションを切り替えます。

これで、ウェブサイトをhttps://your_domainで訪れて、適切に設定されていることを確認できます。前と同様に、ホームページが表示されます。

サーバーがCloudflareのCAによって署名されたリクエストのみを受け入れることを確認するには、認証済みオリジンプルオプションを無効にしてウェブサイトをリロードします。次のエラーメッセージが表示されるはずです:

CloudflareのCAによってリクエストが署名されていない場合、オリジンサーバーがエラーを発生させます。

注意: ほとんどのブラウザはリクエストをキャッシュしますので、上記の変更を確認するには、ブラウザのシークレットモードを使用できます。ウェブサイトを設定する間、Cloudflareがリクエストをキャッシュしないようにするには、Cloudflareダッシュボードの概要に移動し、開発モードを切り替えます。

これで正常に動作することがわかったので、CloudflareダッシュボードのSSL/TLSセクションに戻り、オリジンサーバータブに移動し、認証済みオリジンプルオプションを再度有効にします。

結論

このチュートリアルでは、Cloudflare と Nginx サーバー間のトラフィックを暗号化することで、Nginx パワードのウェブサイトを保護しました。これは、Cloudflare の Origin CA 証明書を使用しています。さらに、Nginx サーバー上で認証済みの Origin Pulls を設定しています。これにより、Cloudflare サーバーからのリクエストのみを受け入れ、他のユーザーが直接 Nginx サーバーに接続することを防止しています。

Source:
https://www.digitalocean.com/community/tutorials/how-to-host-a-website-using-cloudflare-and-nginx-on-ubuntu-22-04