Thứ ba, 26/01/2016 | 00:00 GMT+7

Cách bảo mật HAProxy bằng Let's Encrypt trên CentOS 7

Let's Encrypt là Tổ chức phát hành certificate (CA) mới cung cấp cách dễ dàng để lấy và cài đặt certificate TLS / SSL miễn phí, do đó cho phép HTTPS được mã hóa trên web server . Nó đơn giản hóa quy trình bằng cách cung cấp một ứng dụng client , Certbot, cố gắng tự động hóa hầu hết các bước cần thiết. Hiện tại, toàn bộ quá trình lấy và cài đặt certificate hoàn toàn tự động chỉ trên các web server Apache. Tuy nhiên, Certbot được dùng để dễ dàng có được certificate SSL miễn phí, certificate này có thể được cài đặt theo cách thủ công, dù bạn lựa chọn phần mềm web server nào.

Trong hướng dẫn này, ta sẽ chỉ cho bạn cách sử dụng Let's Encrypt để lấy certificate SSL miễn phí và sử dụng nó với HAProxy trên CentOS 7. Ta cũng sẽ hướng dẫn bạn cách tự động gia hạn certificate SSL của bạn .

HAProxy với Let's Encrypt TLS / SSL Certificate và Tự động gia hạn

Yêu cầu

Trước khi làm theo hướng dẫn này, bạn cần một vài thứ.

Bạn nên có một server CentOS 7 với user không phải root có quyền sudo . Bạn có thể tìm hiểu cách cài đặt một account user như vậy theo các bước 1-3 trong hướng dẫn cài đặt server ban đầu cho CentOS 7 của ta .

Bạn phải sở hữu hoặc kiểm soát domain đã đăng ký mà bạn muốn sử dụng certificate . Nếu bạn chưa có domain đã đăng ký, bạn có thể đăng ký một domain với một trong nhiều công ty đăng ký domain hiện có (ví dụ: Namecheap, GoDaddy, v.v.).

Nếu bạn chưa có, hãy đảm bảo tạo Bản ghi A trỏ domain của bạn đến địa chỉ IP công cộng trên server của bạn. Điều này là bắt buộc vì cách Let's Encrypt xác thực rằng bạn sở hữu domain mà nó đang cấp certificate . Ví dụ: nếu bạn muốn lấy certificate cho example.com , thì domain đó phải phân giải tới server của bạn để quá trình xác thực hoạt động. Cài đặt của ta sẽ sử dụng example.comwww.example.com làm domain , vì vậy cả hai bản ghi DNS đều được yêu cầu .

Khi bạn đã có tất cả các yêu cầu , hãy chuyển sang cài đặt Certbot, phần mềm client Let's Encrypt.

Bước 1 - Cài đặt Certbot, Ứng dụng khách Hãy Mã hóa

Bước đầu tiên để sử dụng Let's Encrypt để lấy certificate SSL là cài đặt phần mềm certbot trên server của bạn. Hiện tại, cách tốt nhất để cài đặt nó là thông qua kho EPEL.

Cho phép truy cập vào kho EPEL trên server của bạn bằng lệnh :

  • sudo yum install epel-release

Khi repository đã được kích hoạt, bạn có thể nhận được gói certbot bằng lệnh :

  • sudo yum install certbot

Máy khách certbot Let's Encrypt hiện đã được cài đặt và sẵn sàng sử dụng.

Bước 2 - Lấy certificate

Let's Encrypt cung cấp nhiều cách khác nhau để lấy certificate SSL, thông qua các plugin khác nhau. Không giống như plugin Apache, được đề cập trong một hướng dẫn khác , hầu hết các plugin sẽ chỉ giúp bạn lấy được certificate mà bạn phải cấu hình web server của bạn theo cách thủ công. Các plugin chỉ lấy certificate và không cài đặt chúng, được gọi là “trình xác thực” vì chúng được sử dụng để xác thực xem server có được cấp certificate hay không.

Ta sẽ hướng dẫn bạn cách sử dụng plugin Độc lập để lấy certificate SSL.

Xác minh cổng 80 đang mở

Plugin độc lập cung cấp một cách rất đơn giản để lấy certificate SSL. Nó hoạt động bằng cách tạm thời chạy một web server nhỏ, trên cổng 80 , trên server của bạn, mà Let's Encrypt CA có thể kết nối và xác thực danh tính server của bạn trước khi cấp certificate . Do đó, phương pháp này yêu cầu cổng 80 không được sử dụng. Đó là, hãy đảm bảo dừng web server bình thường của bạn, nếu nó đang sử dụng cổng 80 (tức là http ), trước khi cố gắng sử dụng plugin này.

Ví dụ: nếu bạn đang sử dụng HAProxy, bạn có thể dừng nó bằng cách chạy lệnh sau:

  • sudo systemctl stop haproxy

Nếu bạn không chắc liệu cổng 80 có đang được sử dụng hay không, bạn có thể chạy lệnh này:

netstat -na | grep ':80.*LISTEN' 

Nếu không có kết quả khi bạn chạy lệnh này, bạn có thể sử dụng plugin Độc lập.

Chạy Certbot

Bây giờ hãy sử dụng plugin Độc lập bằng cách chạy lệnh này:

  • sudo certbot certonly --standalone --preferred-challenges http --http-01-port 80 -d example.com -d www.example.com

Bạn sẽ được yêu cầu nhập địa chỉ email của bạn và đồng ý với các điều khoản dịch vụ của Let's Encrypt. Sau đó, thử thách http sẽ chạy. Nếu mọi thứ thành công, certbot sẽ in một thông báo kết quả như sau:

Output:
IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at /etc/letsencrypt/live/example.com/fullchain.pem. Your cert will expire on 2017-09-06. To obtain a new or tweaked version of this certificate in the future, simply run certbot again. To non-interactively renew *all* of your certificates, run "certbot renew" - Your account credentials have been saved in your Certbot configuration directory at /etc/letsencrypt. You should make a secure backup of this folder now. This configuration directory will also contain certificates and private keys obtained by Certbot so making regular backups of this folder is ideal. - 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

Bạn cần ghi chú đường dẫn và ngày hết hạn của certificate , được đánh dấu trong kết quả ví dụ ở trên.

Lưu ý: Nếu domain của bạn đang định tuyến thông qua một dịch vụ DNS như CloudFlare, bạn cần phải tạm thời vô hiệu hóa nó cho đến khi bạn có được certificate .

Tệp certificate

Sau khi có certificate , bạn sẽ có các file được mã hóa PEM sau:

  • cert.pem: Chứng chỉ domain của bạn
  • chain.pem: Chứng chỉ chuỗi Let's Encrypt
  • fullchain.pem: cert.pemchain.pem kết hợp
  • privkey.pem: Khóa riêng tư của certificate của bạn

Điều quan trọng là bạn phải biết vị trí của các file certificate vừa được tạo, vì vậy bạn có thể sử dụng chúng trong cấu hình web server của bạn . Bản thân các file được đặt trong một folder con trong /etc/letsencrypt/archive . Tuy nhiên, Certbot tạo các softlink đến các file certificate mới nhất trong folder /etc/letsencrypt/live/ your_domain_name .

Bạn có thể kiểm tra xem các file có tồn tại hay không bằng cách chạy lệnh này (thay thế bằng domain của bạn):

  • sudo ls /etc/letsencrypt/live/your_domain_name

Đầu ra phải là bốn file certificate đã đề cập trước đó.

Kết hợp fullchain.pem và privkey.pem

Khi cấu hình HAProxy để thực hiện kết thúc SSL, vì vậy nó sẽ mã hóa lưu lượng giữa chính nó và user cuối, bạn phải kết hợp fullchain.pemprivkey.pem thành một file duy nhất.

Đầu tiên, tạo folder nơi file kết hợp sẽ được đặt, /etc/haproxy/certs :

  • sudo mkdir -p /etc/haproxy/certs

Tiếp theo, tạo file kết hợp bằng lệnh cat này (thay thế example.com đánh dấu bằng domain của bạn):

  • DOMAIN='example.com' sudo -E bash -c 'cat /etc/letsencrypt/live/$DOMAIN/fullchain.pem /etc/letsencrypt/live/$DOMAIN/privkey.pem > /etc/haproxy/certs/$DOMAIN.pem'

Truy cập an toàn vào file kết hợp, có chứa private key , bằng lệnh sau:

  • sudo chmod -R go-rwx /etc/haproxy/certs

Bây giờ ta đã sẵn sàng sử dụng certificate SSL và private key với HAProxy.

Bước 3 - Cài đặt HAProxy

Bước này bao gồm cài đặt HAProxy. Nếu nó đã được cài đặt trên server của bạn, hãy bỏ qua bước này.

Cài đặt HAProxy với yum:

  • sudo yum install haproxy

HAProxy hiện đã được cài đặt nhưng cần được cấu hình .

Bước 4 - Cấu hình HAProxy

Phần này sẽ chỉ cho bạn cách cấu hình HAProxy cơ bản với cài đặt SSL. Nó cũng bao gồm cách cấu hình HAProxy để cho phép ta tự động gia hạn certificate Let's Encrypt của bạn .

Mở haproxy.cfg trong editor :

  • sudo vi /etc/haproxy/haproxy.cfg

Giữ cho file này mở khi ta chỉnh sửa nó trong một số phần tiếp theo.

Phần global

Thêm dòng này vào phần global để cấu hình kích thước tối đa các phím DHE tạm thời được tạo ra:

haproxy.cfg - 1/5
   tune.ssl.default-dh-param 2048 

Phần giao diện user

Bây giờ ta đã sẵn sàng để xác định các phần frontend .

Lưu ý: Cấu hình HAProxy mặc định bao gồm giao diện user và một số backend . Hãy xóa chúng vì ta sẽ không sử dụng chúng.

Điều đầu tiên ta muốn thêm là một giao diện user để xử lý các kết nối HTTP đến và gửi chúng đến một phần backend mặc định (mà ta sẽ xác định sau). Ở cuối file , hãy thêm giao diện user có tên là www-http . Đảm bảo thay thế haproxy_public_IP bằng địa chỉ IP công cộng của server HAProxy của bạn:

haproxy.cfg - 2/5
frontend www-http    bind haproxy_www_public_IP:80    reqadd X-Forwarded-Proto:\ http    default_backend www-backend 

Tiếp theo, ta sẽ thêm một giao diện user để xử lý các kết nối HTTPS đến. Ở cuối file , thêm giao diện user có tên là www-https . Đảm bảo thay thế haproxy_www_public_IP bằng IP công cộng của server HAProxy của bạn. Ngoài ra, bạn cần thay thế example.com bằng domain của bạn (phải tương ứng với file certificate bạn đã tạo trước đó):

haproxy.cfg - 3/5
frontend www-https    bind haproxy_www_public_IP:443 ssl crt /etc/haproxy/certs/example.com.pem    reqadd X-Forwarded-Proto:\ https    acl letsencrypt-acl path_beg /.well-known/acme-challenge/    use_backend letsencrypt-backend if letsencrypt-acl    default_backend www-backend 

Giao diện user này sử dụng ACL ( letsencrypt-acl ) để gửi các yêu cầu xác thực Let's Encrypt (cho /.well-known/acme-challenge ) tới phần letsencrypt-backend trợ letsencrypt-backend backend, điều này sẽ cho phép ta gia hạn certificate mà không cần dừng dịch vụ HAProxy. Tất cả các yêu cầu khác sẽ được chuyển tiếp đến www-backend , là chương trình backend sẽ phục vụ ứng dụng web hoặc trang web của ta .

Phần backend

Sau khi bạn hoàn tất cấu hình các giao diện user , hãy thêm www-backend trợ www-backend backend bằng cách thêm các dòng sau. Đảm bảo thay thế các từ được đánh dấu bằng địa chỉ IP riêng tương ứng của web server của bạn (điều chỉnh số dòng server để phù hợp với số lượng server backend bạn có):

haproxy.cfg - 4/5
backend www-backend    redirect scheme https if !{ ssl_fc }    server www-1 www_1_private_IP:80 check    server www-2 www_2_private_IP:80 check 

Bất kỳ lưu lượng nào mà chương trình backend này nhận được sẽ được cân bằng trên các mục nhập server của nó, qua HTTP (cổng 80).

Cuối cùng, thêm phần letsencrypt-backend trợ letsencrypt-backend backend, bằng cách thêm các dòng này

haproxy.cfg - 5/5
backend letsencrypt-backend    server letsencrypt 127.0.0.1:54321 

Phần backend này, chỉ xử lý các thử thách Let's Encrypt ACME được sử dụng cho các yêu cầu và gia hạn certificate , gửi lưu lượng truy cập đến server local trên cổng 54321 . Ta sẽ sử dụng cổng này thay vì 80443 khi ta gia hạn certificate SSL Let's Encrypt.

Bây giờ ta đã sẵn sàng để bắt đầu HAProxy:

  • sudo systemctl start haproxy

Lưu ý: Nếu bạn đang gặp sự cố với file cấu hình haproxy.cfg , hãy xem GitHub Gist này để làm ví dụ.

Chứng chỉ Let's Encrypt TLS / SSL hiện đã có và ta đã sẵn sàng cài đặt tập lệnh tự động gia hạn. Đến đây, bạn nên kiểm tra xem certificate TLS / SSL có hoạt động hay không bằng cách truy cập domain của bạn trong trình duyệt web.

Bước 5 - Cài đặt Tự động gia hạn

Chứng chỉ Let's Encrypt chỉ có giá trị trong 90 ngày, vì vậy điều quan trọng là phải tự động hóa quy trình gia hạn.

Một cách thiết thực đảm bảo certificate của bạn không bị lỗi thời là tạo một công việc cron sẽ tự động xử lý quá trình gia hạn cho bạn. certbot sẽ chạy certbot hàng ngày và gia hạn certificate nếu chúng hết hạn trong vòng ba mươi ngày. certbot cũng sẽ chạy một tập lệnh renew-hook đặc biệt sau khi gia hạn thành công. Ta sẽ sử dụng tập lệnh gia hạn này để cập nhật file .pem kết hợp của ta và reload haproxy.

Hãy tạo tập lệnh đó ngay bây giờ, sau đó kiểm tra nó.

Tạo kịch bản gia hạn

Mở một file mới trong /usr/local/bin dưới dạng folder gốc :

  • sudo vi /usr/local/bin/renew.sh

Đây sẽ là một file văn bản trống mới. Dán vào tập lệnh ngắn sau, đảm bảo cập nhật domain được đánh dấu bằng domain của bạn :

#!/bin/sh  SITE=example.com  # move to the correct let's encrypt directory cd /etc/letsencrypt/live/$SITE  # cat files to make combined .pem for haproxy cat fullchain.pem privkey.pem > /etc/haproxy/certs/$SITE.pem  # reload haproxy systemctl reload haproxy 

Lưu và đóng file . Tập lệnh này di chuyển vào đúng folder Let's Encrypt, chạy lệnh cat để nối hai file .pem thành một, sau đó reload haproxy.

Tiếp theo, làm cho tập lệnh có thể thực thi:

  • sudo chmod u+x /usr/local/bin/renew.sh

Sau đó chạy script:

  • sudo /usr/local/bin/renew.sh

Nó sẽ chạy mà không có lỗi. Tiếp theo, ta sẽ cập nhật Certbot và cấu hình nó để chạy tập lệnh gia hạn này.

Cập nhật cấu hình certbot

certbot renew mà ta sẽ sử dụng để gia hạn certificate của bạn đọc file cấu hình được tạo lần đầu tiên ta chạy certbot . Ta cần mở file này và cập nhật cổng mà certbot sử dụng để chạy server http độc lập của nó để nó không xung đột với haproxy (đã được lắng nghe trên cổng 80 và 443). Mở file cấu hình trong editor :

  • sudo vi /etc/letsencrypt/renewal/example.com.conf

Ta cần thay đổi dòng http01_port , vì vậy nó có nội dung như sau:

example.com.conf
http01_port = 54321 

Lưu và đóng file . Bây giờ hãy kiểm tra quá trình gia hạn, chỉ định --dry-run để ta thực sự không gia hạn bất kỳ thứ gì:

  • sudo certbot renew --dry-run

Certbot sẽ lắng nghe trên cổng 54321 cho thử thách gia hạn và haproxy sẽ ủy quyền yêu cầu từ cổng 80 đến 54321.

Tạo một công việc Cron

Tiếp theo, ta sẽ chỉnh sửa crontab để tạo một công việc mới sẽ chạy lệnh certbot renew mỗi ngày. Để chỉnh sửa crontab cho user root, hãy chạy:

  • sudo crontab -e

Thêm phần sau vào cuối file :

mục crontab
30 2 * * * /usr/bin/certbot renew --renew-hook "/usr/local/bin/renew.sh" >> /var/log/le-renewal.log 

Lưu và thoát. Điều này sẽ tạo một công việc cron mới sẽ thực thi lệnh certbot renew mỗi ngày vào lúc 2:30 sáng. Đầu ra do lệnh tạo ra sẽ được chuyển đến file log có địa chỉ tại /var/log/le-renewal.log . Nếu certificate thực sự được gia hạn, tập --renew-hook sẽ chạy để tạo file PEM kết hợp và reload haproxy .

Kết luận

Đó là nó! HAProxy hiện đang sử dụng certificate Let's Encrypt TLS / SSL miễn phí để phân phát truy cập HTTP S một cách an toàn.


Tags:

Các tin liên quan

Cách tạo thiết lập tính khả dụng cao với Pacemaker, Corosync và IP nổi trên CentOS 7
2015-12-22
Cách sử dụng Prometheus để giám sát server CentOS 7 của bạn
2015-11-06
Cách cài đặt Elasticsearch 1.7, Logstash 1.5 và Kibana 4.1 (ELK Stack) trên CentOS 7
2015-11-04
Cách cài đặt và cấu hình scponly trên CentOS 7
2015-07-22
Cách viết quy tắc kiểm tra hệ thống tùy chỉnh trên CentOS 7
2015-07-16
Cách viết quy tắc kiểm tra hệ thống tùy chỉnh trên CentOS 7
2015-07-16
Cách thiết lập firewall bằng FirewallD trên CentOS 7
2015-06-18
Cách thiết lập firewall bằng FirewallD trên CentOS 7
2015-06-18
Cách phát hiện bất thường với Skyline trên CentOS 7
2015-06-16
Cách cài đặt và cấu hình mod_deflate trên CentOS 7
2015-06-12