如何在Ubuntu 22.04上使用Cloudflare和Nginx托管网站

作者選擇了電子前線基金會作為為捐贈而寫計劃的受益方。

介紹

Cloudflare是一項服務,位於訪問者與網站所有者的伺服器之間,充當網站的反向代理。Cloudflare提供內容交付網絡(CDN),以及防止分佈式阻斷服務(DDoS)攻擊和分佈式域名系統服務。

Nginx是一個流行的網絡伺服器,負責托管一些互聯網上最大和流量最高的網站。組織通常使用Nginx來提供網站並使用Cloudflare作為CDN和DNS提供者。

在本教程中,您將使用來自Cloudflare的Origin CA證書保護由Nginx提供的您的網站,然後配置Nginx使用驗證的拉取請求。使用此設置的優點是您可以從Cloudflare的CDN和快速DNS解析中受益,同時確保所有連接都通過Cloudflare。這可以防止任何惡意請求到達您的伺服器。

先決條件

要完成這個教程,您需要以下東西:

步驟1 — 生成來源CA TLS證書

Cloudflare Origin CA允許您生成由Cloudflare簽署的免費TLS證書,以安裝在您的Nginx伺服器上。通過使用Cloudflare生成的TLS證書,您可以加密Cloudflare伺服器與您的Nginx伺服器之間的連接。

使用 Origin CA 生成证书,请在网页浏览器中登录到您的 Cloudflare 帐户。选择您要保护的域并导航到 Cloudflare 仪表板的 SSL/TLS 部分。从那里,导航到 源服务器 选项卡,然后点击 创建证书 按钮:

保留默认选项 使用 Cloudflare 生成私钥和CSR

点击 创建,您将会看到一个对话框,显示 源证书私钥。您需要将 Cloudflare 的源证书和私钥都传输到您的服务器上。出于安全原因,私钥 信息不会再次显示,因此在点击 确定 之前,请将私钥复制到您的服务器上。

您将使用服务器上的 /etc/ssl 目录来保存源证书和私钥文件。该文件夹已经存在于服务器上。

首先,在浏览器中复制对话框中显示的 源证书 的内容。

然后,在您的服务器上,使用您喜欢的文本编辑器打开 /etc/ssl/cert.pem

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

将证书内容粘贴到文件中。然后保存并退出编辑器。如果您使用的是 nano,请按 Ctrl+X,然后在提示时按 Y,然后按 Enter。

然后返回浏览器,复制 私钥 的内容。打开文件 /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流量。启用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配置

    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始終加密Cloudflare與你的源Nginx服務器之間的連接。

現在訪問你的網站: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 提供由以下證書簽署的證書:

-----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 文檔下載證書。

複製這個證書。

然後創建文件 /etc/ssl/cloudflare.crt 來保存 Cloudflare 的證書:

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

將證書添加到文件中。然後保存文件並退出編輯器。

現在更新您的 Nginx 配置以使用 TLS 認證的來源拉取。打開您域名的配置文件:

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

按照以下示例添加 ssl_client_certificatessl_verify_client 指令:

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

server {

    # SSL 配置

    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 配置中沒有語法錯誤:

  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 的 Origin CA 證書加密 Cloudflare 和 Nginx 伺服器之間的流量,為您的 Nginx 動力網站增強了安全性。然後,您在 Nginx 伺服器上設置了驗證來源拉取,以確保它僅接受來自 Cloudflare 伺服器的請求,從而防止其他任何人直接連接到 Nginx 伺服器。

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