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.
- Một bản ghi A dành cho
- 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 đó.
Ta nhấn vào tên miền rồi chọn DNS ở sidebar bên trái:
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.
- 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 “@” choxn—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.
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
Để 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:
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:
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:
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ìnhrenew
hoặc lấycertonly
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