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 .
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.com
và www.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.pem
vàchain.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.pem
và privkey.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:
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:
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 đó):
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ó):
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
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ì 80
và 443
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:
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 :
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.
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 72015-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