Table of Contents

No table of contents

Cách lưu trữ trang web bằng Cloudflare và Nginx trên Ubuntu 20.04

Posted on: 19 tháng 4 năm 2023

Ubuntu

Giới thiệu

Cloudflare là một dịch vụ nằm giữa khách truy cập và máy chủ của chủ sở hữu trang web, hoạt động như một proxy ngược cho các trang web. Cloudflare cung cấp Mạng phân phối nội dung (Content Delivery Network - CDN), cũng như các dịch vụ máy chủ tên miền phân tán và giảm thiểu DDoS.

Nginx là một máy chủ web phổ biến chịu trách nhiệm lưu trữ một số trang web lớn nhất và có lưu lượng truy cập cao nhất trên internet. Các tổ chức thường phục vụ các trang web bằng Nginx và sử dụng Cloudflare làm nhà cung cấp CDN và DNS.

Trong hướng dẫn này, bạn sẽ bảo mật trang web của mình do Nginx cung cấp bằng chứng chỉ CA gốc từ Cloudflare, sau đó định cấu hình Nginx để sử dụng các yêu cầu kéo được xác thực. Ưu điểm của việc sử dụng thiết lập này là bạn được hưởng lợi từ CDN của Cloudflare và độ phân giải DNS nhanh trong khi vẫn đảm bảo rằng tất cả các kết nối đều đi qua Cloudflare. Điều này ngăn chặn bất kỳ yêu cầu độc hại nào đến máy chủ của bạn.

Điều kiện tiên quyết

Để hoàn thành hướng dẫn này, bạn sẽ cần những thứ sau:

  • Một máy chủ Ubuntu 20.04 được thiết lập bằng cách làm theo hướng dẫn thiết lập máy chủ ban đầu của Ubuntu 20.04, bao gồm sudo non-root user và tường lửa.
  • Nginx được cài đặt trên máy chủ của bạn. Bạn có thể làm theo hướng dẫn của chúng tôi về cách cài đặt Nginx trên Ubuntu 20.04.
  • Một tài khoản Cloudflare.
  • Miền đã đăng ký được thêm vào tài khoản Cloudflare trỏ đến máy chủ Nginx của bạn. Hướng dẫn của chúng tôi về cách giảm thiểu các cuộc tấn công DDoS vào trang web của bạn bằng Cloudflare có thể giúp bạn thiết lập điều này. Phần giới thiệu của chúng tôi về thuật ngữ, thành phần và khái niệm DNS cũng có thể cung cấp hỗ trợ.
  • Khối máy chủ Nginx được định cấu hình cho miền của bạn, bạn có thể thực hiện việc này bằng cách làm theo Bước 5 của Cách cài đặt Nginx trên Ubuntu 20.04.

Bước 1 — Tạo chứng chỉ TLS gốc CA

Cloudflare Origin CA cho phép bạn tạo chứng chỉ TLS miễn phí do Cloudflare ký để cài đặt trên máy chủ Nginx của bạn. Bằng cách sử dụng chứng chỉ TLS do Cloudflare tạo, bạn có thể bảo mật kết nối giữa máy chủ của Cloudflare và máy chủ Nginx của bạn.

Để tạo chứng chỉ với Origin CA, hãy đăng nhập vào tài khoản Cloudflare của bạn trong trình duyệt web. Chọn miền mà bạn muốn bảo mật và điều hướng đến phần SSL/TLS trên bảng điều khiển Cloudflare của bạn. Từ đó, điều hướng đến tab Origin Server và nhấp vào nút Create Certificate:

description image

Để tùy chọn mặc định Generate private key and CSR with Cloudflare được chọn.

description image

Nhấp vào Next và bạn sẽ thấy hộp thoại có Origin CertificatePrivate key. Bạn cần chuyển cả origin certificate và private key từ Cloudflare sang máy chủ của mình. Vì lý do bảo mật, thông tin Private key sẽ không được hiển thị lại, vì vậy hãy sao chép khóa vào máy chủ của bạn trước khi nhấp vào Ok.

description image

Bạn sẽ sử dụng thư mục /etc/ssl trên máy chủ để giữ origin certificate và các tệp private key. Thư mục đã tồn tại trên máy chủ.

Đầu tiên, sao chép nội dung của Origin Certificate xuất xứ được hiển thị trong hộp thoại trên trình duyệt của bạn.

Sau đó, trên máy chủ của bạn, hãy mở /etc/ssl/cert.pem trong trình soạn thảo văn bản ưa thích của bạn:

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

Dán nội dung chứng chỉ vào tệp. Sau đó lưu và thoát khỏi trình chỉnh sửa. Nếu bạn đang sử dụng nano, hãy nhấn Ctrl + X, sau đó khi được nhắc, hãy nhấn Y rồi Enter.

Sau đó quay lại trình duyệt của bạn và sao chép nội dung của Private key. Mở file /etc/ssl/key.pem để chỉnh sửa:

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

Dán private key vào tệp, lưu tệp và thoát khỏi trình chỉnh sửa.

Lưu ý: Đôi khi, khi bạn sao chép chứng chỉ và khóa từ bảng điều khiển Cloudflare và dán vào các tệp có liên quan trên máy chủ, các dòng trống sẽ được chèn vào. Nginx sẽ coi các chứng chỉ và khóa đó là không hợp lệ, vì vậy hãy đảm bảo rằng không có dòng trống nào trong tệp của bạn.

Cảnh báo: Chứng chỉ CA gốc của Cloudflare chỉ được Cloudflare tin cậy và do đó chỉ nên được sử dụng bởi các máy chủ gốc được kết nối tích cực với Cloudflare. Nếu tại bất kỳ thời điểm nào bạn tạm dừng hoặc tắt Cloudflare, chứng chỉ CA gốc của bạn sẽ đưa ra lỗi chứng chỉ không đáng tin cậy.

Bây giờ bạn đã sao chép các tệp khóa và chứng chỉ vào máy chủ của mình, bạn cần cập nhật cấu hình Nginx để sử dụng chúng.

Bước 2 — Cài đặt Chứng chỉ CA gốc trong Nginx

Trong phần trước, bạn đã tạo origin certificate và private key bằng bảng điều khiển của Cloudflare và lưu các tệp vào máy chủ của bạn. Bây giờ, bạn sẽ cập nhật cấu hình Nginx cho trang web của mình để sử dụng chứng chỉ gốc và khóa riêng nhằm bảo mật kết nối giữa máy chủ của Cloudflare và máy chủ của bạn.

Trước tiên, hãy đảm bảo rằng UFW sẽ cho phép lưu lượng HTTPS. Bật Nginx Full, thao tác này sẽ mở cả cổng 80 (HTTP) và cổng 443 (HTTPS):

  1. sudo ufw allow 'Nginx Full'

Bây giờ hãy tải lại UFW:

  1. sudo ufw reload

Cuối cùng, hãy kiểm tra xem các quy tắc mới của bạn có được cho phép không và UFW có đang hoạt động không:

  1. sudo ufw status

Bạn sẽ thấy một đầu ra như thế này:

Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx Full ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx Full (v6) ALLOW Anywhere (v6)

Bây giờ bạn đã sẵn sàng để điều chỉnh khối máy chủ Nginx của mình. Nginx tạo khối máy chủ mặc định trong quá trình cài đặt. Xóa nó nếu nó vẫn tồn tại, vì bạn đã định cấu hình khối máy chủ tùy chỉnh cho miền của mình:

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

Tiếp theo, mở tệp cấu hình Nginx cho miền của bạn:

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

Các tập tin sẽ trông như thế này:

/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;
        }
}

Bạn sẽ sửa đổi tệp cấu hình Nginx để thực hiện các thao tác sau:

  • Nghe trên cổng 80 và chuyển hướng tất cả các yêu cầu sử dụng https.
  • Nghe trên cổng 443 và sử dụng origin certificate và private key được thêm vào trong phần trước.

Sửa đổi tệp để nó trông giống như sau:

/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;
    }
}

Lưu tệp và thoát khỏi trình chỉnh sửa.

Tiếp theo, hãy kiểm tra để đảm bảo rằng không có lỗi cú pháp trong bất kỳ tệp cấu hình Nginx nào của bạn:

  1. sudo nginx -t

Nếu bạn không tìm thấy vấn đề gì, hãy khởi động lại Nginx để kích hoạt các thay đổi của bạn:

  1. sudo systemctl restart nginx

Bây giờ, hãy chuyển đến phần SSL/TLS của bảng điều khiển Cloudflare, điều hướng đến tab Overview và thay đổi SSL/TLS encryption mode thành Full (strict). Điều này thông báo cho Cloudflare luôn mã hóa kết nối giữa Cloudflare và máy chủ Nginx gốc của bạn.

description image

Bây giờ, hãy truy cập trang web của bạn tại https://your_domain để xác minh rằng trang web được thiết lập đúng cách. Bạn sẽ thấy trang chủ của mình được hiển thị và trình duyệt sẽ báo cáo rằng trang web này an toàn.

description image

Trong phần tiếp theo, bạn sẽ thiết lập Authenticated Origin Pulls để xác minh rằng máy chủ gốc của bạn thực sự đang nói chuyện với Cloudflare chứ không phải một số máy chủ khác. Bằng cách đó, Nginx sẽ được định cấu hình để chỉ chấp nhận các yêu cầu sử dụng chứng chỉ ứng dụng khách hợp lệ từ Cloudflare; tất cả các yêu cầu chưa được chuyển qua Cloudflare sẽ bị hủy.

Bước 3 — Thiết lập Authenticated Origin Pulls

Chứng chỉ CA gốc sẽ giúp Cloudflare xác minh rằng nó đang giao tiếp với đúng máy chủ gốc. Bước này sẽ sử dụng TLS Client Authentication (Xác thực ứng dụng khách TLS) để xác minh rằng máy chủ Nginx ban đầu của bạn đang kết nối với Cloudflare.

Trong quá trình bắt tay TLS do khách hàng xác thực, cả hai bên đều cung cấp chứng chỉ để được xác minh. Máy chủ gốc được định cấu hình để chỉ chấp nhận các yêu cầu sử dụng chứng chỉ ứng dụng khách hợp lệ từ Cloudflare. Các yêu cầu chưa được chuyển qua Cloudflare sẽ bị hủy vì chúng sẽ không có chứng chỉ của Cloudflare. Điều này có nghĩa là những kẻ tấn công không thể phá vỡ các biện pháp bảo mật của Cloudflare và kết nối trực tiếp với máy chủ Nginx của bạn.

Cloudflare xuất trình các chứng chỉ được CA ký với chứng chỉ sau:

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

Bạn cũng có thể tải xuống chứng chỉ trực tiếp từ tài liệu của Cloudflare.

Sao chép chứng chỉ này.

Sau đó tạo tệp /etc/ssl/cloudflare.crt để giữ chứng chỉ của Cloudflare:

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

Thêm chứng chỉ vào tệp. Sau đó lưu tệp và thoát khỏi trình chỉnh sửa.

Bây giờ hãy cập nhật cấu hình Nginx của bạn để sử dụng TLS Authenticated Origin Pulls. Mở tệp cấu hình cho tên miền của bạn:

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

Thêm các chỉ thị ssl_client_certificatessl_verify_client như trong ví dụ sau:

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

    . . .

Lưu tệp và thoát khỏi trình chỉnh sửa.

Tiếp theo, hãy kiểm tra Nginx để đảm bảo rằng không có lỗi cú pháp nào trong cấu hình Nginx của bạn:

  1. sudo nginx -t

Nếu không tìm thấy vấn đề gì, hãy khởi động lại Nginx để kích hoạt các thay đổi của bạn:

  1. sudo systemctl restart nginx

Cuối cùng, để bật Authenticated Pulls, hãy mở phần SSL/TLS trong bảng điều khiển Cloudflare, điều hướng đến tab Origin Server và bật tùy chọn Authenticated Origin Pulls.

description image

Bây giờ, hãy truy cập trang web của bạn tại https://your_domain để xác minh rằng trang web đã được thiết lập đúng cách. Như trước đây, bạn sẽ thấy trang chủ của mình được hiển thị.

Để xác minh rằng máy chủ của bạn sẽ chỉ chấp nhận các yêu cầu do CA của Cloudflare ký, hãy bật tùy chọn Authenticated Origin Pulls để tắt tùy chọn này rồi tải lại trang web của bạn. Bạn sẽ nhận được thông báo lỗi sau:

description image

Máy chủ gốc của bạn phát sinh lỗi nếu CA của Cloudflare không ký yêu cầu.

Lưu ý: Hầu hết các trình duyệt sẽ lưu các yêu cầu vào bộ đệm ẩn, vì vậy, để xem sự thay đổi ở trên, bạn có thể sử dụng chế độ duyệt web Ẩn danh/Riêng tư trong trình duyệt của mình. Để ngăn Cloudflare lưu các yêu cầu vào bộ đệm trong khi bạn thiết lập trang web của mình, hãy điều hướng đến Overview trong bảng điều khiển Cloudflare và chuyển đổi Development Mode.

Bây giờ bạn đã biết nó hoạt động bình thường, hãy quay lại phần SSL/TLS trong bảng điều khiển Cloudflare, điều hướng đến tab Origin Server và chuyển đổi tùy chọn Authenticated Origin Pulls để bật lại.

Kết luận

Trong hướng dẫn này, bạn đã bảo mật trang web do Nginx cung cấp bằng cách mã hóa lưu lượng giữa Cloudflare và máy chủ Nginx bằng chứng chỉ CA gốc từ Cloudflare. Sau đó, bạn thiết lập Authenticated Origin Pulls trên máy chủ Nginx để đảm bảo rằng nó chỉ chấp nhận các yêu cầu của máy chủ Cloudflare, ngăn không cho bất kỳ ai khác kết nối trực tiếp với máy chủ Nginx.

0 replies