Cấu hình bảo mật cho Nginx bằng Let’s Encrypt trên Ubuntu 22.04

Cấu hình bảo mật cho Nginx bằng Let’s Encrypt trên Ubuntu 22.04

Giới thiệu

Let’s Encrypt là một nhà cung cấp chứng chỉ (Certificate Authority - CA) cung cấp cách lấy và cài đặt miễn phí chứng chỉ TLS/SSL.

Certbot đơn giản hóa quy trình lấy chứng chỉ TLS/SSL bằng cách cung cấp phần mềm cho client, Certbot tự động hóa hầu hết các bước cần thiết để lấy và cài đặt chứng chỉ. Hiện tại, toàn bộ quá trình lấy và cài đặt chứng chỉ là tự động trên cả Apache và Nginx.

Trong bài viết này, ta sử dụng Certbot để lấy chứng chỉ SSL miễn phí cho Nginx trên hệ điều hành Ubuntu 22.04 và cài đặt tự động lấy chứng chỉ mới khi chứng chỉ cũ hết hạn.

Chuẩn bị

Để làm theo bài viết, ta cần có:

  • Một server Ubuntu 22.04.
  • Một tên miền, tại bài viết mình sử dụng xn--snmykolor-vmc.vn. Bạn có thể mua các tên miền khác từ Namecheap hoặc các nhà cung cấp tên miền khác.
  • Hai bản ghi DNS được cài đặt dành cho máy chủ. Ở đây mình dùng DNS của CloudFlare hoặc bạn cũng có thể dùng dịch vụ DNS của nhà cung cấp tên miền cho bạn. Cách thêm bản ghi DNS của CloudFlare được viết bên dưới nhé.
    • Một bản ghi A dành cho xn—snmykolor-vmc.vn được trỏ vào địa chỉ IP Public của server.
    • Một bản ghi A dành cho www.xn—snmykolor-vmc.vn được trỏ vào địa chỉ IP Public của server.
  • Server được cài đặt Nginx. Hãy chắc chắn rằng bạn sử dụng server block dành cho tên miền của bạn. Bài viết này sử dụng /etc/nginx/sites-available/xn—snmykolor-vmc.vn làm ví dụ.

Thêm các bản ghi DNS

Bạn vào dashboard của CluodFlare khi đó ta thấy tên miền mà ta đã thêm vào. Nếu chưa có tên miền nào được thêm vào, ta nhấn Add a site rồi làm theo hướng dẫn tại trang đó.

Cấu hình bảo mật cho Nginx bằng Let’s Encrypt trên Ubuntu 22.04 - Ảnh 1.

Ta nhấn vào tên miền rồi chọn DNS ở sidebar bên trái:

Cấu hình bảo mật cho Nginx bằng Let’s Encrypt trên Ubuntu 22.04 - Ảnh 2.

Tại đây, ta có vài bản ghi DNS mặc định sau khi thêm tên miền vào CloudFlare. Ta nhấn Add Record để thêm hai bản ghi DNS cần thiết ở phần trên.

Cấu hình bảo mật cho Nginx bằng Let’s Encrypt trên Ubuntu 22.04 - Ảnh 3.

  • Type: A viết tắt của ‘address’, đây là bản ghi cơ bản nhất của DNS. Nó cho biết địa chỉ IP của một tên miền.
  • Name: tại đây ta ghi “www” cho www.xn—snmykolor-vmc.vn và ghi “@” cho xn—snmykolor-vmc.vn
  • IPv4 Address: Ta điền địa chỉ IPv4 của server.

Cuối cùng ta nhấn Save để lưu bản ghi DNS. Cuối cùng t được hai bản ghi như bên dưới.

Cấu hình bảo mật cho Nginx bằng Let’s Encrypt trên Ubuntu 22.04 - Ảnh 4.

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

sudo snap install core; sudo snap refresh core 

Nếu bạn đã cài đặt Certbot trước đó rồi và phiên bản đó đã cũ, hãy gỡ bỏ bản cũ đi trước khi bắt đầu:

sudo apt remove certbot 

Sau đó, ta cài đặt gói Certbot mới:

sudo snap install --classic certbot 

Cuối cùng, ta tạo một symbolic link từ thư mục cài đặt snap đến /usr/bin để có thể dùng câu lệnh certbot.

sudo ln -s /snap/bin/certbot /usr/bin/certbot 

Bước 2: Xem lại cấu hình của Nginx

Certbot cần tìm đúng server block của Nginx để có thể tự động cấu hình SSL. Cụ thể, Certbot tìm tham số server_name giống với tên miền cần cấp chứng chỉ.

Khi sử dụng Nginx web server, server block được sử dụng để đóng gói cấu hình cho nhiều tên miền từ một máy chủ. Tại bài viết này, tên miền của mình dùng là xn--snmykolor-vmc.vn. Ta có thể tìm server_name tại /etc/nginx/sites-available/xn—snmykolor-vmc.vn

Để kiểm tra file cấu hình cho tên miền của bạn, ta dùng vim hoặc trình chỉnh sửa văn bản bạn thích:

sudo vim /etc/nginx/sites-available/xn--snmykolor-vmc.vn 

Tìm dòng chứa server_name . Kết quả hiển thị như bên dưới:

..

erver_name xn--snmykolor-vmc.vn www.xn--snmykolor-vmc.vn; ...

...

Nếu giống với tên miền của bạn thì ta chuyển sang bước tiếp theo.

Nếu không giống với tên miền của bạn, ta sửa lại cho giống tên miền của bạn và kiểm tra lại cú pháp của file cấu hình bằng:

sudo nginx -t 

Nếu có lỗi, mở lại server block file và kiểm tra các lỗi văn bản hay thiếu ký tự. Khi không còn lỗi thì ta reload lại Nginx để tải lại các cấu hình:

sudo systemctl reload nginx 

Bây giờ Certbot có thể tìm đúng server block.

Tiếp theo ta cập nhật firewall để cho phép các HTTPS traffic.

Bước 3: Cho phép HTTPS đi qua Firewall

Nếu ufw firewall được bật, ta cần chỉnh lại cài đặt cho phép các HTTPS traffic đi qua firewall.

Ta có thể xem cài đặt của firewall:

sudo ufw status 

Kết quả hiển thị như bên dưới, ufw cho phép các HTTP traffic đến web server

Cấu hình bảo mật cho Nginx bằng Let’s Encrypt trên Ubuntu 22.04 - Ảnh 5.

Để cho phép các HTTPS traffic, cho phép hồ sơ Nginx Full và xóa hồ sơ Nginx HTTP:

sudo ufw allow 'Nginx Full'

sudo ufw delete allow 'Nginx HTTP'

Ta có thể xem lại cài đặt ufw sau hai câu lệnh trên:

sudo ufw status
Cấu hình bảo mật cho Nginx bằng Let’s Encrypt trên Ubuntu 22.04 - Ảnh 8.

Tiếp theo, ta chạt Certbot và lấy chứng chỉ cho tên miền của mình.

Bước 4: Lấy chứng chỉ SSL bằng Certbot

Certbot cung cấp nhiều cách khác nhau để lấy được chứng chỉ SSL thông qua các plugins.

Tìm dòng chứa server_name trong file /etc/nginx/sites-available/xn--snmykolor-vmc.vn. Kết quả hiển thị như bên dưới:

...

server_name xn--snmykolor-vmc.vn www.xn--snmykolor-vmc.vn; ...

Certbot cung cấp hai phương thức để lấy chứng chỉ SSL:

  • Lấy chứng chỉ bằng tay và tự cập nhật các cài đặt liên quan đến Nginx hoặc Apache2 bằng cách dùng tùy chọn —manual do certbot cung cấp.
  • Lấy chứng chỉ tự động và tự động cập nhật các cài đặt liên quan đến Nginx

Ở đây mình sử dụng lấy chứng chỉ tự động với plugin nginx do certbot cung cấp. Nếu bạn sử dụng apache2 thì ta sử dụng plugin apache do certbot cung cấp để lấy và cài đặt chứng chỉ.

sudo certbot --nginx -d xn--snmykolor-vmc.vn -d www.xn--snmykolor-vmc.vn 

Như câu lệnh trên, Certbot chạy với plugin —nginx, dùng -d để chỉ định tên miền mà ta muốn lấy chứng chỉ SSL.

Khi chạy câu lệnh trên, nếu lỗi ta hãy kiểm tra tên miền sau -d có giống với server_name ở bước 2. Nếu đúng ta được nhắc nhập địa chỉ email và đồng ý với điều khoản dịch vụ. Sau đó ta nhận được thông báo hoàn thành quá trình cài đặt và nơi lưu trữ chứng chỉ:

IMPORTANT NOTES:

Successfully received certificate.

Certificate is saved at: /etc/letsencrypt/live/xn--snmykolor-vmc.vn/fullchain.pem

Key is saved at: /etc/letsencrypt/live/xn--snmykolor-vmc.vn/privkey.pem

This certificate expires on 2023-05-09.

These files will be updated when the certificate renews.

Certbot has set up a scheduled task to automatically renew this certificate in the background.

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

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

Sau khi chạy thành công, ta vào thư mục /etc/letsencrypt/live/xn--snmykolor-vmc.vn để kiểm tra:

Cấu hình bảo mật cho Nginx bằng Let’s Encrypt trên Ubuntu 22.04 - Ảnh 10.

Kết quả hiển thị như hình trên là ta đã cài đặt thành công chứng chỉ SSL cho tên miền của mình rồi.

Bước 5: Gia hạn chứng chỉ

Chứng chỉ của Let’s Encrypt’s có thời gian hiệu lực là 90 ngày. Điều này để khuyến khích mọi người dùng quá trình tự động hoá lấy chứng chỉ mới của Let’s Encrypt’s. Gói certbot mà ta đã cài đặt trước đó đã bao gồm việc gia hạn chứng chỉ bằng cách tự động chạy hai lần một ngày và tự động lấy chứng chỉ mới sau 30 ngày từ khi chứng chỉ hết hạn.

Ta có thể truy vấn trạng thái của dịch vụ certbot.renew bằng systemctl:

sudo systemctl status snap.certbot.renew.service

Output

● snap.certbot.renew.service - Service for snap application certbot.renew [0/2639]

Loaded: loaded (/etc/systemd/system/snap.certbot.renew.service; static; vendor preset: enabled)

Active: inactive (dead) since Tue 2023-05-16 05:30:16 +07; 2h 45min ago

TriggeredBy: ● snap.certbot.renew.timer

Process: 127438 ExecStart=/usr/bin/snap run --timer=00:00~24:00/2 certbot.renew (code=exited, status=0/SUCCESS)

Main PID: 127438 (code=exited, status=0/SUCCESS)

Để kiểm tra quá trình renewal, ta dùng tùy chọn —dry-run với certbot:

sudo certbot renew --dry-run 

Với tùy chọn —dry-run: Kiểm tra quá trình renew hoặc lấy certonly mà không lưu lại chứng chỉ

Nếu không có lỗi được tìm thấy thì tất cả cài đặt đã xong. Khi cần thiết Certbot sẽ lấy chứng chỉ mới và reload lại Nginx để áp dụng các thay đổi. Nếu quá trình tự động lấy chứng chỉ bị lỗi, Let’s Encrypt sẽ gửi một mail đến email mà bạn chỉ định trong lúc cài đặt.

Tổng kết

Trong bài viết này, ta đã cài đặt Let’s Encrypt client, cài đặt chứng chỉ SSL cho một tên miền và cài đặt tự động lấy chứng chỉ mới. Nếu có bất kì câu hỏi nào về Certbot, tài liệu về Certbot là trang để tìm hiểu.

>> Có thể bạn quan tâm: Phòng chống DDoS với Nginx và Nginx Plus

SHARE