Ubuntu 16.04でCloudflareとNginxを使用してWebサイトをホストする方法

著者はhttps://www.brightfunds.org/organizations/electronic-frontier-foundation-inc[Electronic Frontier Foundation]を選択して、https://do.co/w4do-cta [Write DOnations]プログラム。

前書き

Cloudflareは、訪問者とWebサイト所有者のサーバーの間に位置し、Webサイトのリバースプロキシとして機能するサービスです。 Cloudflareは、コンテンツ配信ネットワーク(CDN)、DDoS緩和、および分散ドメインネームサーバーサービスを提供します。

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

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

前提条件

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

手順1-オリジンCA TLS証明書の生成

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

Origin CAで証明書を生成するには、Cloudflareダッシュボードの* Crypto セクションに移動します。 そこから、 Origin Certificates セクションの Create Certificate *ボタンをクリックします。

image:https://assets.digitalocean.com/articles/cloudflare_secure_nginx_1604/KcTiCQW.png [Cloudflareダッシュボードで証明書オプションを作成]

  • CloudFlareで秘密キーとCSR *を生成するデフォルトオプションを選択したままにします。

image:https://assets.digitalocean.com/articles/cloudflare_secure_nginx_1604/8IX2ULI.png [Origin CA GUI options]

[次へ]をクリックすると、* Origin Certificate Private key *のダイアログが表示されます。 オリジン証明書と秘密鍵の両方をCloudFlareからサーバーに転送する必要があります。

image:https://assets.digitalocean.com/articles/cloudflare_secure_nginx_1604/bIBA8tf.png [元の証明書と秘密鍵を示すダイアログ]

サーバー上の `+ / etc / ssl / certs `ディレクトリを使用して、元の証明書を保持します。 ` / etc / ssl / private +`ディレクトリは秘密鍵ファイルを保持します。 両方のフォルダーがサーバーに既に存在します。

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

次に、サーバー上で、編集のために `+ / etc / ssl / certs / cert.pem +`を開きます。

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

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

次に、ブラウザに戻り、* Private key *の内容をコピーします。 ファイル `+ / etc / ssl / private / key.pem +`を編集用に開きます。

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

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

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

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

前のセクションでは、Cloudlfareのダッシュボードを使用して元の証明書と秘密キーを生成し、サーバーにファイルを保存しました。 ここで、サイトのNginx設定を更新して、オリジン証明書とプライベートキーを使用して、Cloudflareのサーバーとサーバー間の接続を保護します。

Nginxはインストール中にデフォルトのサーバーブロックを作成します。 ドメインのカスタムサーバーブロックを既に構成しているため、存在する場合は削除します。

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

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

sudo nano /etc/nginx/sites-available/

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

example.com ’> / etc / nginx / sites-available /

server {
       listen 80;
       listen [::]:80;

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

       server_name  ;

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

Nginx構成ファイルを変更して、次のことを行います。

  • ポート `+ 80 `でリッスンし、すべてのリクエストをリダイレクトして ` https +`を使用します。

  • ポート「443」でリッスンし、前のセクションで追加した元の証明書と秘密キーを使用します。

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

example.com ’> / etc / nginx / sites-available /

server {
   listen 80;
   listen [::]:80;
   server_name  ;

}











   server_name  ;

   root /var/www/example.com/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ダッシュボードの* Crypto セクションに移動し、 SSL モードを Full *に変更します。 これにより、CloudflareとオリジンNginxサーバー間の接続を常に暗号化するようにCloudflareに通知します。

image:https://assets.digitalocean.com/articles/cloudflare_secure_nginx_1604/xO3frBH.png [Cloudflareダッシュボードで完全SSLモードを有効にする]

次に、「+ https:// +」のWebサイトにアクセスして、正しく設定されていることを確認します。 ホームページが表示され、ブラウザがサイトが安全であることを報告します。

次のセクションでは、認証されたオリジンプルを設定して、オリジンサーバーが実際にCloudflareと通信し、他のサーバーと通信していないことを確認します。 そうすることで、NginxはCloudflareからの有効なクライアント証明書を使用するリクエストのみを受け入れるように設定され、CloudFlareを通過しなかったリクエストはドロップされます。

ステップ3-認証済みオリジンプルのセットアップ

オリジンCA証明書は、Cloudflareが正しいオリジンサーバーと通信していることを確認するのに役立ちます。 しかし、オリジンNginxサーバーは、実際にCloudflareと通信していることをどのように確認できますか? TLSクライアント認証を入力します。

クライアント認証のTLSハンドシェイクでは、両側が検証する証明書を提供します。 オリジンサーバーは、Cloudflareからの有効なクライアント証明書を使用するリクエストのみを受け入れるように設定されています。 Cloudflareの証明書がないため、Cloudflareを通過していないリクエストは破棄されます。 これは、攻撃者がCloudflareのセキュリティ対策を回避して、Nginxサーバーに直接接続できないことを意味します。

Cloudflareは、CAによって署名された証明書と次の証明書を提示します。

-----BEGIN CERTIFICATE-----
MIIGBjCCA/CgAwIBAgIIV5G6lVbCLmEwCwYJKoZIhvcNAQENMIGQMQswCQYDVQQG
EwJVUzEZMBcGA1UEChMQQ2xvdWRGbGFyZSwgSW5jLjEUMBIGA1UECxMLT3JpZ2lu
IFB1bGwxFjAUBgNVBAcTDVNhbiBGcmFuY2lzY28xEzARBgNVBAgTCkNhbGlmb3Ju
aWExIzAhBgNVBAMTGm9yaWdpbi1wdWxsLmNsb3VkZmxhcmUubmV0MB4XDTE1MDEx
MzAyNDc1M1oXDTIwMDExMjAyNTI1M1owgZAxCzAJBgNVBAYTAlVTMRkwFwYDVQQK
ExBDbG91ZEZsYXJlLCBJbmMuMRQwEgYDVQQLEwtPcmlnaW4gUHVsbDEWMBQGA1UE
BxMNU2FuIEZyYW5jaXNjbzETMBEGA1UECBMKQ2FsaWZvcm5pYTEjMCEGA1UEAxMa
b3JpZ2luLXB1bGwuY2xvdWRmbGFyZS5uZXQwggIiMA0GCSqGSIb3DQEBAQUAA4IC
DwAwggIKAoICAQDdsts6I2H5dGyn4adACQRXlfo0KmwsN7B5rxD8C5qgy6spyONr
WV0ecvdeGQfWa8Gy/yuTuOnsXfy7oyZ1dm93c3Mea7YkM7KNMc5Y6m520E9tHooc
f1qxeDpGSsnWc7HWibFgD7qZQx+T+yfNqt63vPI0HYBOYao6hWd3JQhu5caAcIS2
ms5tzSSZVH83ZPe6Lkb5xRgLl3eXEFcfI2DjnlOtLFqpjHuEB3Tr6agfdWyaGEEi
lRY1IB3k6TfLTaSiX2/SyJ96bp92wvTSjR7USjDV9ypf7AD6u6vwJZ3bwNisNw5L
ptph0FBnc1R6nDoHmvQRoyytoe0rl/d801i9Nru/fXa+l5K2nf1koR3IX440Z2i9
+Z4iVA69NmCbT4MVjm7K3zlOtwfI7i1KYVv+ATo4ycgBuZfY9f/2lBhIv7BHuZal
b9D+/EK8aMUfjDF4icEGm+RQfExv2nOpkR4BfQppF/dLmkYfjgtO1403X0ihkT6T
PYQdmYS6Jf53/KpqC3aA+R7zg2birtvprinlR14MNvwOsDOzsK4p8WYsgZOR4Qr2
gAx+z2aVOs/87+TVOR0r14irQsxbg7uP2X4t+EXx13glHxwG+CnzUVycDLMVGvuG
aUgF9hukZxlOZnrl6VOf1fg0Caf3uvV8smOkVw6DMsGhBZSJVwao0UQNqQIDAQAB
o2YwZDAOBgNVHQ8BAf8EBAMCAAYwEgYDVR0TAQH/BAgwBgEB/wIBAjAdBgNVHQ4E
FgQUQ1lLK2mLgOERM2pXzVc42p59xeswHwYDVR0jBBgwFoAUQ1lLK2mLgOERM2pX
zVc42p59xeswCwYJKoZIhvcNAQENA4ICAQDKDQM1qPRVP/4Gltz0D6OU6xezFBKr
LWtDoA1qW2F7pkiYawCP9MrDPDJsHy7dx+xw3bBZxOsK5PA/T7p1dqpEl6i8F692
g//EuYOifLYw3ySPe3LRNhvPl/1f6Sn862VhPvLa8aQAAwR9e/CZvlY3fj+6G5ik
3it7fikmKUsVnugNOkjmwI3hZqXfJNc7AtHDFw0mEOV0dSeAPTo95N9cxBbm9PKv
qAEmTEXp2trQ/RjJ/AomJyfA1BQjsD0j++DI3a9/BbDwWmr1lJciKxiNKaa0BRLB
dKMrYQD+PkPNCgEuojT+paLKRrMyFUzHSG1doYm46NE9/WARTh3sFUp1B7HZSBqA
kHleoB/vQ/mDuW9C3/8Jk2uRUdZxR+LoNZItuOjU8oTy6zpN1+GgSj7bHjiy9rfA
F+ehdrz+IOh80WIiqs763PGoaYUyzxLvVowLWNoxVVoc9G+PqFKqD988XlipHVB6
Bz+1CD4D/bWrs3cC9+kk/jFmrrAymZlkFX8tDb5aXASSLJjUjcptci9SKqtI2h0J
wUGkD7+bQAr+7vr8/R+CBmNMe7csE8NeEX6lVMF7Dh0a1YKQa6hUN18bBuYgTMuT
QzMmZpRpIBB321ZBlcnlxiTJvWxvbCPHKHj20VwwAz7LONF59s84ZsOqfoBv8gKM
s0s5dsq5zpLeaw==
-----END CERTIFICATE-----

Cloudflare https://support.cloudflare.com/hc/en-us/article_attachments/201243967/origin-pull-ca.pem [こちら]から証明書を直接ダウンロードすることもできます。

この証明書をコピーします。

次に、ファイル `+ / etc / ssl / certs / cloudflare.crt +`ファイルを作成して、Cloudflareの証明書を保持します。

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

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

Nginxの設定を更新して、TLS Authenticated Origin Pullsを使用します。 ドメインの構成ファイルを開きます。

sudo nano /etc/nginx/sites-available/

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

example.com ’> / etc / nginx / sites-available /

. . .

server {

   # SSL configuration

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



   . . .

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

次に、Nginxの構成に構文エラーがないことをテストして確認します。

sudo nginx -t

問題が見つからなかった場合、Nginxを再起動して変更を有効にします。

sudo systemctl restart nginx

最後に、認証済みプルを有効にするには、Cloudflareダッシュボードの* Crypto セクションを開き、 Authenticated Origin Pulls *オプションを切り替えます。

image:https://assets.digitalocean.com/articles/cloudflare_secure_nginx_1604/s5sYOVs.png [認証されたオリジンプルを有効にする]

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

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

image:https://assets.digitalocean.com/articles/cloudflare_secure_nginx_1604/w7qNH8P.png [エラーメッセージ]

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

正しく動作することがわかったので、Cloudflareダッシュボードの* Crypto セクションに戻り、 Authenticated Origin Pulls *オプションを再度切り替えて有効にします。

結論

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

Related