如何在Ubuntu16.04上使用Cloudflare和Nginx托管网站
作为 Write for DOnations 计划的一部分,作者选择了 Electronic Frontier Foundation 来接受捐赠。
介绍
Cloudflare 是一种位于访问者和网站所有者服务器之间的服务,充当网站的反向代理。 Cloudflare 提供内容交付网络 (CDN),以及 DDoS 缓解和分布式域名服务器服务。
Nginx 是一种流行的 Web 服务器,负责托管 Internet 上一些最大和流量最高的网站。 组织使用 Nginx 为网站提供服务并使用 Cloudflare 作为 CDN 和 DNS 提供商是很常见的。
在本教程中,您将使用来自 Cloudflare 的 Origin CA 证书保护由 Nginx 服务的网站,并配置 Nginx 以使用经过身份验证的拉取请求。 使用此设置的优点是您可以从 Cloudflare 的 CDN 和快速 DNS 解析中受益,同时确保所有连接都通过 Cloudflare。 这可以防止任何恶意请求到达您的服务器。
先决条件
要完成本教程,您需要以下内容:
- 按照 Ubuntu 16.04 初始服务器设置指南 设置一台 Ubuntu 16.04 服务器,包括 sudo 非 root 用户和防火墙。
- 在你的服务器上安装了 Nginx,如如何在 Ubuntu 16.04 上安装 Nginx。
- 一个 Cloudflare 帐户。
- 添加到您的 Cloudflare 帐户并指向您的 Nginx 服务器的注册域。 按照 如何使用 CloudFlare 缓解针对您网站的 DDoS 攻击进行设置。
- 为您的域配置的 Nginx 服务器块,您可以按照 如何在 Ubuntu 16.04 上设置 Nginx 服务器块(虚拟主机)来完成。
第 1 步 — 生成 Origin CA TLS 证书
Cloudflare Origin CA 允许您生成由 Cloudflare 签名的免费 TLS 证书,以安装在您的 Nginx 服务器上。 通过使用 Cloudflare 生成的 TLS 证书,您可以保护 Cloudflare 的服务器和您的 Nginx 服务器之间的连接。
要使用 Origin CA 生成证书,请导航到 Cloudflare 仪表板的 Crypto 部分。 从那里,单击 Origin Certificates 部分中的 Create Certificate 按钮:
保留默认选项 Let CloudFlare generate a private key 并选中 CSR。
单击 Next,您将看到一个对话框,其中包含 Origin Certificate 和 Private key。 您需要将原始证书和私钥从 CloudFlare 传输到您的服务器。
我们将使用服务器上的 /etc/ssl/certs
目录来保存原始证书。 /etc/ssl/private
目录将保存私钥文件。 服务器上已经存在这两个文件夹。
首先,复制浏览器对话框中显示的Origin Certificate的内容。
然后,在您的服务器上,打开 /etc/ssl/certs/cert.pem
进行编辑:
sudo nano /etc/ssl/certs/cert.pem
将证书内容粘贴到文件中。 然后保存并退出编辑器。
然后返回浏览器并复制私钥的内容。 打开文件/etc/ssl/private/key.pem
进行编辑:
sudo nano /etc/ssl/private/key.pem
将密钥粘贴到文件中,保存文件,然后退出编辑器。
警告: Cloudflare 的 Origin CA 证书仅受 Cloudflare 信任,因此只能由主动连接到 Cloudflare 的原始服务器使用。 如果您在任何时候暂停或禁用 Cloudflare,您的 Origin CA 证书将引发不受信任的证书错误。
现在您已将密钥和证书文件复制到服务器,您需要更新 Nginx 配置以使用它们。
第 2 步 — 在 Nginx 中安装 Origin 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/<^>example.com<^>
server { listen 80; listen [::]:80; root /var/www/example.com/html; index index.html index.htm index.nginx-debian.html; server_name example.com www.example.com; location / { try_files $uri $uri/ =404; } }
我们将修改 Nginx 配置文件以执行以下操作:
- 监听端口
80
并将所有请求重定向到使用https
。 - 监听端口
443
并使用您在上一节中添加的原始证书和私钥。
修改文件,使其如下所示:
/etc/nginx/sites-available/<^>example.com<^>
server { listen 80; listen [::]:80; server_name example.com www.example.com; return 302 https://$server_name$request_uri; } 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; server_name example.com www.example.com; 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 始终加密 Cloudflare 和您的原始 Nginx 服务器之间的连接。
现在访问您的网站 https://example.com
以验证其设置是否正确。 您将看到您的主页显示,并且浏览器将报告该站点是安全的。
在下一部分中,您将设置 Authenticated Origin Pulls 以验证您的源服务器确实在与 Cloudflare 而不是其他服务器通信。 通过这样做,Nginx 将被配置为仅接受使用来自 Cloudflare 的有效客户端证书的请求,而未通过 CloudFlare 的请求将被丢弃。
第 3 步 — 设置经过身份验证的来源拉取
Origin 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 here 下载证书。
复制此证书。
然后创建文件 /etc/ssl/certs/cloudflare.crt
文件来保存 Cloudflare 的证书:
sudo nano /etc/ssl/certs/cloudflare.crt
将证书粘贴到文件中。 然后保存文件并退出编辑器。
现在更新您的 Nginx 配置以使用 TLS Authenticated Origin Pulls。 打开您的域的配置文件:
sudo nano /etc/nginx/sites-available/example.com
添加 ssl_client_certificate
和 ssl_verify_client
指令,如下例所示:
/etc/nginx/sites-available/<^>example.com<^>
. . . 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; ssl_client_certificate /etc/ssl/certs/cloudflare.crt; ssl_verify_client on; . . .
保存文件并退出编辑器。
接下来,测试以确保您的 Nginx 配置中没有语法错误。
sudo nginx -t
如果没有发现问题,重新启动 Nginx 以启用您的更改:
sudo systemctl restart nginx
最后,要启用 Authenticated Pulls,请打开 Cloudflare 仪表板中的 Crypto 部分并切换 Authenticated Origin Pulls 选项。
现在访问您的网站 https://example.com
以验证它是否已正确设置。 和以前一样,您将看到您的主页显示。
要验证您的服务器是否只接受由 Cloudflare 的 CA 签名的请求,请切换 Authenticated Origin Pulls 选项以禁用它,然后重新加载您的网站。 您应该收到以下错误消息:
如果请求未由 Cloudflare 的 CA 签名,您的源服务器会引发错误。
既然您知道它可以正常工作,请返回 Cloudflare 仪表板中的 Crypto 部分并再次切换 Authenticated Origin Pulls 选项以启用它。
结论
在本教程中,您通过使用 Cloudflare 的 Origin CA 证书加密 Cloudflare 和 Nginx 服务器之间的流量来保护您的 Nginx 支持的网站。 然后,您在 Nginx 服务器上设置 Authenticated Origin Pulls 以确保它只接受来自 Cloudflare 服务器的请求,从而防止其他任何人直接连接到 Nginx 服务器。