Ubuntu20.04でCloudflareとNginxを使用してWebサイトをホストする方法
著者は、 Electronic Frontier Foundation を選択して、 Write forDOnationsプログラムの一環として寄付を受け取りました。
序章
Cloudflare は、訪問者とWebサイト所有者のサーバーの間に位置し、Webサイトのリバースプロキシとして機能するサービスです。 Cloudflareは、コンテンツ配信ネットワーク(CDN)に加えて、DDoS軽減および分散ドメインネームサーバーサービスを提供します。
Nginx は、インターネット上で最大かつ最もトラフィックの多いサイトのいくつかをホストする人気のあるWebサーバーです。 組織がNginxでWebサイトにサービスを提供し、CloudflareをCDNおよびDNSプロバイダーとして使用することは一般的です。
このチュートリアルでは、CloudflareからのOrigin CA証明書を使用してNginxが提供するWebサイトを保護し、認証されたプルリクエストを使用するようにNginxを構成します。 このセットアップを使用する利点は、すべての接続がCloudflareを通過することを保証しながら、CloudflareのCDNと高速DNS解決の恩恵を受けることです。 これにより、悪意のあるリクエストがサーバーに到達するのを防ぎます。
前提条件
このチュートリアルを完了するには、次のものが必要です。
- Ubuntu 20.04初期サーバーセットアップガイドに従ってセットアップされた1つのUbuntu20.04サーバー。これには、
sudo
非rootユーザーとファイアウォールが含まれます。 - Nginxがサーバーにインストールされています。 Ubuntu20.04にNginxをインストールする方法についてはガイドに従ってください。
- Cloudflareアカウント。
- Nginxサーバーを指すCloudflareアカウントに追加された登録済みドメイン。 Cloudflare を使用してWebサイトに対するDDoS攻撃を軽減する方法に関するガイドは、これを設定するのに役立ちます。 DNSの用語、コンポーネント、および概念の紹介も支援を提供できます。
- ドメイン用に構成されたNginxサーバーブロック。これは、 Ubuntu20.04にNginxをインストールする方法のステップ5に従って実行できます。
ステップ1—オリジンCATLS証明書の生成
Cloudflare Origin CAを使用すると、Cloudflareによって署名された無料のTLS証明書を生成して、Nginxサーバーにインストールできます。 Cloudflareで生成されたTLS証明書を使用することで、CloudflareのサーバーとNginxサーバー間の接続を保護できます。
Origin CAで証明書を生成するには、WebブラウザーでCloudflareアカウントにログインします。 保護するドメインを選択し、Cloudflareダッシュボードの SSL /TLSセクションに移動します。 そこから、 Origin Server タブに移動し、証明書の作成ボタンをクリックします。
Cloudflareで秘密鍵とCSRを生成するというデフォルトのオプションを選択したままにします。
次へをクリックすると、原産地証明書と秘密鍵のダイアログが表示されます。 原産地証明書と秘密鍵の両方をCloudflareからサーバーに転送する必要があります。 セキュリティ上の理由から、秘密鍵の情報は再度表示されないため、 [OK] をクリックする前に、鍵をサーバーにコピーしてください。
サーバー上の/etc/ssl
ディレクトリを使用して、原産地証明書と秘密鍵ファイルを保持します。 フォルダはすでにサーバー上に存在します。
まず、ブラウザのダイアログボックスに表示される原産地証明書の内容をコピーします。
次に、サーバーで、お好みのテキストエディタで/etc/ssl/cert.pem
を開きます。
sudo nano /etc/ssl/cert.pem
証明書の内容をファイルに貼り付けます。 次に、エディターを保存して終了します。 nano
を使用している場合は、Ctrl+X
を押し、プロンプトが表示されたらY
を押して、Enterキーを押します。
次に、ブラウザに戻り、秘密鍵の内容をコピーします。 編集のためにファイル/etc/ssl/key.pem
を開きます。
sudo nano /etc/ssl/key.pem
秘密鍵をファイルに貼り付け、ファイルを保存して、エディターを終了します。
注: Cloudflareダッシュボードから証明書とキーをコピーしてサーバー上の関連ファイルに貼り付けると、空白行が挿入されることがあります。 Nginxはそのような証明書とキーを無効として扱うため、ファイルに空白行がないことを確認してください。
警告: CloudflareのオリジンCA証明書はCloudflareによってのみ信頼されるため、Cloudflareにアクティブに接続されているオリジンサーバーのみが使用する必要があります。 Cloudflareを一時停止または無効にすると、OriginCA証明書は信頼できない証明書エラーをスローします。
キーファイルと証明書ファイルをサーバーにコピーしたので、それらを使用するにはNginx構成を更新する必要があります。
ステップ2—NginxにOriginCA証明書をインストールする
前のセクションでは、Cloudflareのダッシュボードを使用して原産地証明書と秘密鍵を生成し、ファイルをサーバーに保存しました。 次に、サイトのNginx構成を更新して、原産地証明書と秘密鍵を使用してCloudflareのサーバーとサーバー間の接続を保護します。
まず、UFWがHTTPSトラフィックを許可することを確認します。 Nginx Full
を有効にします。これにより、ポート80
(HTTP)とポート443
(HTTPS)の両方が開きます。
sudo ufw allow 'Nginx Full'
次にUFWをリロードします。
sudo ufw reload
最後に、新しいルールが許可されていることと、UFWがアクティブであることを確認します。
sudo ufw status
次のような出力が表示されます。
OutputStatus: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx Full ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx Full (v6) ALLOW Anywhere (v6)
これで、Nginxサーバーブロックを調整する準備が整いました。 Nginxは、インストール中にデフォルトのサーバーブロックを作成します。 ドメインのカスタムサーバーブロックを既に構成しているため、まだ存在している場合は削除します。
sudo rm /etc/nginx/sites-enabled/default
次に、ドメインのNginx構成ファイルを開きます。
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 configuration 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構成ファイルのいずれにも構文エラーがないことを確認します。
sudo nginx -t
問題が見つからない場合は、Nginxを再起動して変更を有効にします。
sudo systemctl restart nginx
次に、Cloudflareダッシュボードの SSL / TLS セクションに移動し、概要タブに移動して、 SSL /TLS暗号化モードをフル(厳密)に変更します。 これは、CloudflareとオリジンNginxサーバー間の接続を常に暗号化するようにCloudflareに通知します。
次に、https://your_domain
のWebサイトにアクセスして、正しく設定されていることを確認します。 ホームページが表示され、ブラウザはサイトが安全であると報告します。
次のセクションでは、Authenticated Origin Pullsを設定して、オリジンサーバーが実際に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
ファイルを作成します。
sudo nano /etc/ssl/cloudflare.crt
証明書をファイルに追加します。 次に、ファイルを保存してエディターを終了します。
次に、TLS AuthenticatedOriginPullを使用するようにNginx構成を更新します。 ドメインの構成ファイルを開きます。
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をテストして、Nginx構成に構文エラーがないことを確認します。
sudo nginx -t
問題が見つからなかった場合は、Nginxを再起動して変更を有効にします。
sudo systemctl restart nginx
最後に、Authenticated Pullsを有効にするには、Cloudflareダッシュボードの SSL / TLS セクションを開き、 Origin Server タブに移動して、 Authenticated OriginPullsオプションを切り替えます。
次に、Webサイトhttps://your_domain
にアクセスして、正しく設定されていることを確認します。 以前と同様に、ホームページが表示されます。
サーバーがCloudflareのCAによって署名されたリクエストのみを受け入れることを確認するには、 Authenticated Origin Pulls オプションを切り替えて無効にし、Webサイトをリロードします。 次のエラーメッセージが表示されます。
CloudflareのCAがリクエストに署名しない場合、オリジンサーバーはエラーを発生させます。
注:ほとんどのブラウザはリクエストをキャッシュするため、上記の変更を確認するには、ブラウザでシークレット/プライベートブラウジングモードを使用できます。 ウェブサイトのセットアップ中にCloudflareがリクエストをキャッシュしないようにするには、Cloudflareダッシュボードの概要に移動し、開発モードを切り替えます。
正常に動作することがわかったので、Cloudflareダッシュボードの SSL / TLS セクションに戻り、 Origin Server タブに移動して、 Authenticated OriginPullsオプションを切り替えます。もう一度有効にします。
結論
このチュートリアルでは、CloudflareからのOrigin CA証明書を使用して、CloudflareとNginxサーバー間のトラフィックを暗号化することにより、Nginxを利用したWebサイトを保護しました。 次に、NginxサーバーでAuthenticated Origin Pullsを設定して、Cloudflareサーバーのリクエストのみを受け入れ、他のユーザーがNginxサーバーに直接接続できないようにします。