著者は、 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解決の恩恵を受けることです。 これにより、悪意のあるリクエストがサーバーに到達するのを防ぎます。

前提条件

このチュートリアルを完了するには、次のものが必要です。

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

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

Origin CAで証明書を生成するには、WebブラウザでClouflareアカウントにログインします。 保護するドメインを選択し、Cloudflareダッシュボードの SSL /TLSセクションに移動します。 そこから、 Origin Server タブに移動し、証明書の作成ボタンをクリックします。

Create certificate option in the Cloudflare dashboard

デフォルトオプションのままにして、Cloudflareに秘密鍵を生成させ、CSRを選択します。

Origin CA GUI options

次へをクリックすると、原産地証明書秘密鍵のダイアログが表示されます。 原産地証明書と秘密鍵の両方をCloudflareからサーバーに転送する必要があります。 セキュリティ上の理由から、秘密鍵情報は再度表示されないため、 [OK] をクリックする前に、キーをサーバーにコピーしてください。

Dialog showing the origin certificate and private key

サーバー上の/etc/sslディレクトリを使用して、オリジン証明書と秘密鍵ファイルを保持します。 フォルダはすでにサーバー上に存在します。

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

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

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

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

次に、ブラウザに戻り、秘密鍵の内容をコピーします。 編集のためにファイル/etc/ssl/key.pemを開きます。

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

秘密鍵をファイルに貼り付け、ファイルを保存して、エディターを終了します。

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

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

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

ステップ2—NginxにOriginCA証明書をインストールする

前のセクションでは、Cloudlfareのダッシュボードを使用して原産地証明書と秘密鍵を生成し、ファイルをサーバーに保存しました。 次に、サイトのNginx構成を更新して、原産地証明書と秘密鍵を使用してCloudflareのサーバーとサーバー間の接続を保護します。

まず、UFWがHTTPSトラフィックを許可することを確認します。 Nginx Fullを有効にします。これにより、ポート80(HTTP)とポート443(HTTPS)の両方が開きます。

  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 configuration

    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    ssl        on;
    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に通知します。

Enable Full(strict) SSL mode in the Cloudflare Dashboard

次に、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ファイルを作成します。

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

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

次に、TLS AuthenticatedOriginPullを使用するようにNginx構成を更新します。 ドメインの構成ファイルを開きます。

  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        on;
    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

最後に、Authenticated Pullsを有効にするには、Cloudflareダッシュボードの SSL / TLS セクションを開き、 Origin Server タブに移動して、 Authenticated OriginPullsオプションを切り替えます。

Enable Authenticated Origin Pulls

次に、Webサイトhttps://your_domainにアクセスして、正しく設定されていることを確認します。 以前と同様に、ホームページが表示されます。

サーバーがCloudflareのCAによって署名されたリクエストのみを受け入れることを確認するには、 Authenticated Origin Pulls オプションを切り替えて無効にし、Webサイトをリロードします。 次のエラーメッセージが表示されます。

Error message

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

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

正常に動作することがわかったので、Cloudflareダッシュボードの SSL / TLS セクションに戻り、 Origin Server タブに移動して、 Authenticated OriginPullsを切り替えます。もう一度オプションを選択して有効にします。

結論

このチュートリアルでは、CloudflareからのOrigin CA証明書を使用して、CloudflareとNginxサーバー間のトラフィックを暗号化することにより、Nginxを利用したWebサイトを保護しました。 次に、NginxサーバーでAuthenticated Origin Pullsを設定して、Cloudflareのサーバーからのリクエストのみを受け入れ、他のユーザーがNginxサーバーに直接接続できないようにします。