Bảo mật Nginx bằng Let’s Encrypt trên CentOS 8

0

secure nginx 1

Let’s Encrypt là một chứng chỉ số (Certificates Authority) mã nguồn mở, miễn phí và tự động, hoạt động vì lợi ích cộng đồng. Đây là dịch vụ được cung cấp bởi Internet Security Research Group (ISRG), một nhà cung cấp chứng chỉ SSL nổi tiếng.

Chứng chỉ do Let’s Encrypt cấp được mọi trình duyệt lớn tin cậy và có giá trị trong 90 ngày kể từ ngày cấp.

Trong bài này, chúng tôi sẽ chỉ dẫn bạn từng bước cách cài đặt chứng chỉ SSL Let’s Encrypt miễn phí trên môi trường CentOS 8 và có Nginx hoạt động. Chúng tôi cũng sẽ hướng dẫn cách cấu hình Nginx để sử dụng chứng chỉ SSL và mở giao thức HTTP / 2.

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

Trước tiên, bạn hãy đảm bảo rằng đã thực hiện những điều sau:

  • Bạn đã mua tên miền đã đăng ký. Ví dụ: example.com
  • Nginx đã được cài đặt sẵn. Bạn phải cần đảm bảo rằng có một server block cho domain của bạn
  • Bạn đã cấu hình tường lửa cho phép truy cập port 80 và 443

Cài đặt Certbot

Certbot là một tool miễn phí dùng command-line giúp bạn gia hạn chứng chỉ SSL và tự động bật HTTPS trên server.

Gói certbot không có sẵn trong kho lưu trữ (repository) của CentOS 8, nhưng ta có thể tải trực tiếp từ website của nhà cung cấp

Chạy lệnh wget với quyền root hoặc sudo để tải certbot script về thư mục /usr/local/bin:

sudo wget -P /usr/local/bin https://dl.eff.org/certbot-auto

Khi tải xong thì dùng lệnh chmod để cấp quyền thực thi cho file:

sudo chmod +x /usr/local/bin/certbot-auto

Tạo Diffie-Hellman:

Trao đổi khóa Diffie – Hellman (DH) là một phương pháp trao đổi một khóa bí mật chung để mã hóa dữ liệu trên kênh truyền thông không an toàn.

Tạo một bộ tham số DH 2048 bit mới bằng dòng lệnh sau:

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Bạn vẫn có thể tăng độ dài khóa lên thành 4096 bit, nhưng sẽ tốn hơn nửa tiếng để sinh khoá, tuỳ thuộc vào độ nhiễu loạn thông tin trong hệ thống.

Lấy chứng chỉ SSL

Ta sẽ sử dụng plugin Webroot. Webroot tạo một file tạm thời để xác thực tên miền được yêu cầu trong thư mục ${webroot-path}/.Well-known/acme-challenge. Server Let’s Encrypt gửi các HTTP requests đến file tạm để xác thực rằng tên miền được yêu cầu sẽ phân giải tới máy chủ nơi certbot hoạt động.

Để đơn giản hơn, chúng tôi sẽ ánh xạ tất cả các HTTP requests cho .well-known/acme-challenge vào một thư mục duy nhất là /var/lib/letsencrypt.

Các lệnh sau sẽ tạo thư mục và cấp quyền cho group sở hữu:

sudo mkdir -p /var/lib/letsencrypt/.well-known
sudo chgrp nginx /var/lib/letsencrypt
sudo chmod g+s /var/lib/letsencrypt

Để tránh code bị trùng lặp, ta cần tạo hai snippets riêng nằm trong toàn bộ block file của Nginx bằng lệnh sau:

sudo mkdir /etc/nginx/snippets

location ^~ /.well-known/acme-challenge/ {
allow all;
root /var/lib/letsencrypt/;
default_type “text/plain”;
try_files $uri =404;
}

ssl_dhparam /etc/ssl/certs/dhparam.pem;

ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;

ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;

ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 30s;

add_header Strict-Transport-Security “max-age=63072000” always;
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;

Đoạn snippet ở trên bao gồm các chipper do Mozilla đề xuất, cấp quyền cho OCSP Stapling, HTTP Strict Transport Security (HSTS) và thực thi một số HTTP header chuyên về bảo mật.

Khi đã tạo snippet xong, mở file server block của tên miền và chèn snippet letsencrypt.conf vào:

server {

  listen 80;

  server_name example.com www.example.com;

 

  include snippets/letsencrypt.conf;

}

Reload Nginx để những thay đổi có hiệu lực:

sudo systemctl reload nginx

Chạy tool certbot kèm với plugin webroot để lấy file chứng chỉ SSL:

sudo /usr/local/bin/certbot-auto certonly –agree-tos –email admin@example.com –webroot -w /var/lib/letsencrypt/ -d example.com -d www.example.com

Certbot sẽ cài đặt các phần dependencies còn thiếu.

Khi đã có SSL, certbot sẽ in thông báo sau:

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-03-12. To obtain a new or tweaked

   version of this certificate in the future, simply run certbot-auto

   again. To non-interactively renew *all* of your certificates, run

   “certbot-auto 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

Giờ thì bạn đã có file chứng chỉ, bạn có thể chỉnh sửa code trong server block như sau:

 server {

    listen 80;

    server_name www.example.com example.com;

 

    include snippets/letsencrypt.conf;

    return 301 https://$host$request_uri;

}

 

server {

    listen 443 ssl http2;

    server_name www.example.com;

 

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

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

    ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;

    include snippets/ssl.conf;

    include snippets/letsencrypt.conf;

 

    return 301 https://example.com$request_uri;

}

 

server {

    listen 443 ssl http2;

    server_name example.com;

 

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

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

    ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;

    include snippets/ssl.conf;

    include snippets/letsencrypt.conf;

 

    # . . . other code

}

Với cấu hình ở trên, ta đang yêu cầu redirect từ HTTP sang HTTPS

Cuối cùng, reload Nginx để các thay đổi có hiệu lực:

sudo systemctl reload nginx

Mở thử trang web của bạn bằng https:// thì bạn sẽ thấy biểu tượng ổ khóa màu xanh lục ở trên thanh trình duyệt.

Nếu bạn kiểm tra miền của mình bằng SSL Labs Server Test, bạn sẽ được xếp hạng A +:

secure nginx 2

Thiết lập gia hạn tự động SSL:

Chứng chỉ Let’s Encrypt chỉ có thời hạn 90 ngày. Để tự động gia hạn, hãy tạo cronjob có tần suất hoạt động 2 lần trong ngày và sẽ tự động gia hạn trước khi hết hạn 30 ngày.

Sử dụng lệnh crontab để tạo một cronjob mới:

sudo crontab -e

Sau đó paste dòng lệnh sau:

0 */12 * * * root test -x /usr/local/bin/certbot-auto -a \! -d /run/systemd/system && perl -e ‘sleep int(rand(3600))’ && /usr/local/bin/certbot-auto -q renew –renew-hook “systemctl reload nginx”

Lưu và thoát file

Bạn cũng có kiểm tra bằng lệnh bên dưới để đảm bảo quá trình gia hạn diễn ra suôn sẻ.

sudo ./certbot-auto renew –dry-run

Khi không có gì trục trặc, tức là quá trình thiết lập tự động gia hạn đã thành công suôn sẻ.

Tổng quan

Trong bài hướng dẫn này, chúng tôi đã chỉ cho bạn cách sử dụng Let’s Encrypt, certbot để tải chứng chỉ SSL. Chúng tôi cũng đã tạo đoạn code Nginx để tránh trùng lặp và cấu hình Nginx để sử dụng SSL. Ở cuối bài hướng dẫn là cách thiết lập một cronjob để tự động gia hạn chứng chỉ.

Để tìm hiểu thêm về Certbot, hãy truy cập trang tài liệu của họ.

Nếu bạn có bất kỳ câu hỏi hoặc phản hồi nào, hãy bình luận bên dưới.

Leave A Reply

Your email address will not be published.