Cách bảo mật Nginx bằng Let's Encrypt trên Ubuntu 20.04

15 tháng 12, 2024 bởi
Cách bảo mật Nginx bằng Let's Encrypt trên Ubuntu 20.04
Phạm Hoàng Hiếu

Giới thiệu

Let's Encrypt là một Cơ quan cấp chứng chỉ (CA) cung cấp một cách dễ dàng để có được và cài đặt chứng chỉ TLS/SSL miễn phí , do đó cho phép HTTPS được mã hóa trên các máy chủ web. Nó đơn giản hóa quy trình bằng cách cung cấp một máy khách phần mềm, Certbot, cố gắng tự động hóa hầu hết (nếu không muốn nói là tất cả) các bước bắt buộc. Hiện tại, toàn bộ quy trình lấy và cài đặt chứng chỉ được tự động hóa hoàn toàn trên cả Apache và Nginx.

 

Trong hướng dẫn này, bạn sẽ sử dụng Certbot để lấy chứng chỉ SSL miễn phí cho Nginx trên Ubuntu 20.04 và thiết lập để chứng chỉ tự động gia hạn.

 

Hướng dẫn này sẽ sử dụng tệp cấu hình máy chủ Nginx riêng thay vì tệp mặc định. Chúng tôi khuyên bạn nên tạo tệp khối máy chủ Nginx mới cho mỗi miền vì điều này giúp tránh các lỗi thường gặp và duy trì các tệp mặc định làm cấu hình dự phòng.

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

Để làm theo hướng dẫn này, bạn sẽ cần:

  • 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 cho Ubuntu 20.04 này, bao gồm một người dùng không phải root được kích hoạt sudo và một tường lửa.
  • Tên miền đã đăng ký. Hướng dẫn này sẽ sử dụng example.comtrong suốt quá trình. Bạn có thể mua tên miền từ Namecheap , nhận một tên miền miễn phí với Freenom hoặc sử dụng công ty đăng ký tên miền mà bạn lựa chọn.
  • Cả hai bản ghi DNS sau đây được thiết lập cho máy chủ của bạn. Nếu bạn đang sử dụng DigitalOcean, vui lòng xem tài liệu DNS của chúng tôi để biết chi tiết về cách thêm chúng.
    • Bản ghi A example.comtrỏ tới địa chỉ IP công khai của máy chủ của bạn.
    • Bản ghi A trỏ tới địa chỉ IP công khai của máy chủ của bạn.www.example.com
  • Nginx được cài đặt bằng cách làm theo Cách cài đặt Nginx trên Ubuntu 20.04 . Hãy đảm bảo rằng bạn có khối máy chủ cho tên miền của mình. Hướng dẫn này sẽ sử dụng làm ví dụ./etc/nginx/sites-available/example.com

Bước 1 - Cài đặt Certbot

Bước đầu tiên để sử dụng Let's Encrypt để lấy chứng chỉ SSL là cài đặt phần mềm Certbot trên máy chủ của bạn.

Cài đặt Certbot và plugin Nginx của nó với apt:

sudo apt install certbot python3-certbot-nginx

Certbot hiện đã sẵn sàng để sử dụng, nhưng để nó có thể tự động cấu hình SSL cho Nginx, chúng ta cần xác minh một số cấu hình của Nginx.

Bước 2 - Xác nhận cấu hình của Nginx

Certbot cần có khả năng tìm đúng serverkhối trong cấu hình Nginx của bạn để có thể tự động cấu hình SSL. Cụ thể, nó thực hiện điều này bằng cách tìm kiếm một server_namechỉ thị khớp với tên miền mà bạn yêu cầu cấp chứng chỉ.

Nếu bạn làm theo bước thiết lập khối máy chủ trong hướng dẫn cài đặt Nginx , bạn sẽ có một khối máy chủ cho tên miền của mình với chỉ thị đã được thiết lập phù hợp./etc/nginx/sites-available/example.comserver_name

Để kiểm tra, hãy mở tệp cấu hình cho tên miền của bạn bằng nanotrình soạn thảo văn bản yêu thích của bạn:

sudo nano /etc/nginx/sites-available/example.com

Tìm server_name dòng hiện tại. Nó sẽ trông như thế này

/etc/nginx/sites-server_name example.com www.example.com;

 

Nếu có, hãy thoát khỏi trình soạn thảo và chuyển sang bước tiếp theo.

Nếu không, hãy cập nhật để khớp. Sau đó lưu tệp, thoát khỏi trình soạn thảo và xác minh cú pháp của các chỉnh sửa cấu hình của bạn:

sudo nginx -t

Nếu bạn gặp lỗi, hãy mở lại tệp khối máy chủ và kiểm tra xem có lỗi đánh máy hoặc ký tự bị thiếu không. Khi cú pháp của tệp cấu hình của bạn chính xác, hãy tải lại Nginx để tải cấu hình mới:

sudo systemctl reload nginx

 

Certbot hiện có thể tìm đúng serverkhối và tự động cập nhật.

Tiếp theo, hãy cập nhật tường lửa để cho phép lưu lượng HTTPS.

Bước 3 - Cho phép HTTPS qua Tường lửa

Nếu bạn đã ufwbật tường lửa, theo khuyến nghị của hướng dẫn về điều kiện tiên quyết, bạn sẽ cần điều chỉnh cài đặt để cho phép lưu lượng HTTPS. May mắn thay, Nginx đăng ký một số cấu hình khi ufwcài đặt.

Bạn có thể xem cài đặt hiện tại bằng cách nhập:

sudo ufw status

Có lẽ nó sẽ trông như thế này, nghĩa là chỉ có lưu lượng HTTP mới được phép vào máy chủ web:

Output

Status: active

 

To                         Action      From

--                         ------      ----

OpenSSH                    ALLOW       Anywhere                 

Nginx HTTP                 ALLOW       Anywhere                 

OpenSSH (v6)               ALLOW       Anywhere (v6)            

Nginx HTTP (v6)            ALLOW       Anywhere (v6)

 

Để cho phép thêm lưu lượng HTTPS, hãy cho phép cấu hình Nginx Full và xóa phần cho phép cấu hình Nginx HTTP thừa:

sudo ufw allow 'Nginx Full'

sudo ufw delete allow 'Nginx HTTP'

Trạng thái của bạn bây giờ sẽ trông như thế này:

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)

Tiếp theo, hãy chạy Certbot và lấy chứng chỉ của chúng ta.

Bước 4 - Nhận chứng chỉ SSL

Certbot cung cấp nhiều cách khác nhau để lấy chứng chỉ SSL thông qua plugin. Plugin Nginx sẽ đảm nhiệm việc cấu hình lại Nginx và tải lại cấu hình bất cứ khi nào cần thiết. Để sử dụng plugin này, hãy nhập lệnh sau:

sudo certbot --nginx -d example.com -d www.example.com

Phần này chạy certbotcùng với --nginxplugin, sử dụng -dđể chỉ định tên miền mà chúng ta muốn chứng chỉ có hiệu lực.

Nếu đây là lần đầu tiên bạn chạy certbot, bạn sẽ được nhắc nhập địa chỉ email và đồng ý với các điều khoản dịch vụ. Sau khi thực hiện, certbotsẽ liên lạc với máy chủ Let's Encrypt, sau đó chạy thử thách để xác minh rằng bạn kiểm soát tên miền mà bạn đang yêu cầu cấp chứng chỉ.

Nếu thành công, certbotbạn sẽ được hỏi muốn cấu hình cài đặt HTTPS như thế nào.

Output

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

1: No redirect - Make no further changes to the webserver configuration.

2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for

new sites, or if you're confident your site works on HTTPS. You can undo this

change by editing your web server's configuration.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Select the appropriate number [1-2] then [enter] (press 'c' to cancel):

Chọn lựa chọn của bạn sau đó nhấn ENTER. Cấu hình sẽ được cập nhật và Nginx sẽ tải lại để lấy các thiết lập mới. certbotsẽ kết thúc bằng một thông báo cho bạn biết quá trình đã thành công và nơi lưu trữ chứng chỉ của bạn:

Output

IMPORTANT NOTES:

 - Congratulations! Your certificate and chain have been saved at:

   /etc/letsencrypt/live/example.com/fullchain.pem

   Your key file has been saved at:

   /etc/letsencrypt/live/example.com/privkey.pem

   Your cert will expire on 2020-08-18. To obtain a new or tweaked

   version of this certificate in the future, simply run certbot again

   with the "certonly" option. To non-interactively renew *all* of

   your certificates, run "certbot renew"

 - If you like Certbot, please consider supporting our work by:


   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate

   Donating to EFF:                    https://eff.org/donate-le

Chứng chỉ của bạn đã được tải xuống, cài đặt và tải. Hãy thử tải lại trang web của bạn bằng https://và chú ý đến chỉ báo bảo mật của trình duyệt. Nó sẽ chỉ ra rằng trang web được bảo mật đúng cách, thường có biểu tượng ổ khóa. Nếu bạn kiểm tra máy chủ của mình bằng SSL Labs Server Test , máy chủ sẽ đạt điểm A.

Chúng ta hãy kết thúc bằng việc kiểm tra quá trình gia hạn.

Bước 5 - Xác minh việc tự động gia hạn của Certbot

Chứng chỉ của Let's Encrypt chỉ có hiệu lực trong chín mươi ngày. Điều này nhằm khuyến khích người dùng tự động hóa quy trình gia hạn chứng chỉ của họ. certbotGói chúng tôi đã cài đặt sẽ xử lý việc này cho chúng tôi bằng cách thêm bộ đếm thời gian systemd sẽ chạy hai lần một ngày và tự động gia hạn bất kỳ chứng chỉ nào còn trong vòng ba mươi ngày kể từ ngày hết hạn.

Bạn có thể truy vấn trạng thái của bộ đếm thời gian bằng systemctl:

sudo systemctl status certbot.timer

Output

● certbot.timer - Run certbot twice daily

     Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled)

     Active: active (waiting) since Mon 2020-05-04 20:04:36 UTC; 2 weeks 1 days ago

    Trigger: Thu 2020-05-21 05:22:32 UTC; 9h left

   Triggers: ● certbot.service

Để kiểm tra quá trình đổi mới, bạn có thể chạy thử với certbot:

sudo certbot renew --dry-run

Nếu bạn không thấy lỗi, bạn đã hoàn tất. Khi cần thiết, Certbot sẽ gia hạn chứng chỉ của bạn và tải lại Nginx để tiếp nhận các thay đổi. Nếu quá trình gia hạn tự động không thành công, Let's Encrypt sẽ gửi tin nhắn đến email bạn đã chỉ định, cảnh báo bạn khi chứng chỉ của bạn sắp hết hạn.

 

Phần kết luận

Trong hướng dẫn này, bạn đã cài đặt máy khách Let's Encrypt certbot, tải xuống chứng chỉ SSL cho tên miền của mình, cấu hình Nginx để sử dụng các chứng chỉ này và thiết lập gia hạn chứng chỉ tự động. Nếu bạn có thêm câu hỏi về việc sử dụng Certbot, tài liệu chính thức là nơi tốt để bắt đầu.


 

Nguồn: https://www.digitalocean.com/

Để cài đặt ứng dụng web này vào iPhone/iPad của bạn, hãy nhấn và sau đó Thêm vào Màn hình chính.