Thứ sáu, 22/01/2016 | 00:00 GMT+7

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

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 Certbot để lấy certificate SSL miễn phí và sử dụng nó với HAProxy trên Ubuntu 14.04. 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 phải có server Ubuntu 14.04 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 account user như vậy theo các bước 1-3 trong cài đặt server ban đầu của ta cho Ubuntu 14.04 .

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 Let's Encrypt Client

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. Các nhà phát triển Certbot cung cấp một repository với các version cập nhật của phần mềm. Hãy thêm repository đó vào trình quản lý gói của ta ngay bây giờ:

  • sudo add-apt-repository ppa:certbot/certbot

Bạn sẽ được yêu cầu xác nhận việc bổ sung. Nhấn ENTER để tiếp tục. Sau đó, cập nhật bộ nhớ cache của gói để nhận danh sách gói mới:

  • sudo apt-get update

Và cuối cùng, cài đặt gói certbot :

  • sudo apt-get install certbot

Bây giờ ta đã cài đặt certbot , ta đã sẵn sàng để nhận certificate SSL của bạn .

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 theo mặc định) 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 service haproxy stop

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.

Ta sẽ cài đặt HAProxy 1.6, không có trong repository lưu trữ mặc định của Ubuntu. Tuy nhiên, ta vẫn có thể sử dụng trình quản lý gói để cài đặt HAProxy 1.6, nếu ta sử dụng PPA, với lệnh này:

  • sudo add-apt-repository ppa:vbernat/haproxy-1.6

Cập nhật index gói local trên bộ cân bằng tải của bạn và cài đặt HAProxy bằng lệnh :

  • sudo apt-get update
  • sudo apt-get 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 nano /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

Hãy thêm một số cài đặt cơ bản dưới sự global phần.

Điều đầu tiên bạn cần làm là đặt maxconn thành một số hợp lý. Điều này ảnh hưởng đến số lượng kết nối đồng thời mà HAProxy sẽ cho phép, điều này có thể ảnh hưởng đến QoS và ngăn web server của bạn gặp sự cố khi cố gắng phục vụ quá nhiều yêu cầu. Bạn cần phải thử với nó để tìm ra thứ phù hợp với môi trường của bạn. Thêm dòng sau đây (với một giá trị mà bạn nghĩ là hợp lý) đến phần global :

haproxy.cfg - 1 trên 7
   maxconn 2048 

Tiếp theo, thêm dòng này, để cấu hình kích thước tối đa của các khóa DHE tạm thời được tạo:

haproxy.cfg - 2/7
   tune.ssl.default-dh-param 2048 

Phần mặc định

Thêm các dòng sau vào phần mặc định :

haproxy.cfg - 3/7
   option forwardfor    option http-server-close 

Tùy chọn forwardfor đặt HAProxy thêm tiêu đề X-Forwarded-For cho mỗi yêu cầu và tùy chọn http-server-close làm giảm độ trễ giữa HAProxy và user của bạn bằng cách đóng kết nối nhưng vẫn duy trì giữ bí mật.

Phần giao diện user

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

Đ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 - 4/7
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 - 5/7
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 - 6/7
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 - 7/7
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 service haproxy restart

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 nano /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 service haproxy reload 

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. Bạn sẽ thấy một số kết quả về việc reload haproxy. 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 nano /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 backup database OrientDB của bạn trên Ubuntu 14.04
2015-12-19
Cách cài đặt và cấu hình OrientDB trên Ubuntu 14.04
2015-12-19
Cách cài đặt và cấu hình Naxsi trên Ubuntu 14.04
2015-12-19
Cách cài đặt VestaCP và thiết lập trang web trên Ubuntu 14.04
2015-12-16
Cách cài đặt Go 1.6 trên Ubuntu 14.04
2015-12-04
Cách cài đặt Go 1.6 trên Ubuntu 14.04
2015-12-04
Cách triển khai ứng dụng Symfony sang sản xuất trên Ubuntu 14.04
2015-11-24
Cách triển khai Hugo Site sang Sản xuất với Git Hooks trên Ubuntu 14.04
2015-11-12
Cách cài đặt và sử dụng Hugo, Trình tạo trang web tĩnh, trên Ubuntu 14.04
2015-11-09
Cách tạo thiết lập HAProxy khả dụng cao với Corosync, Pacemaker và IP nổi trên Ubuntu 14.04
2015-11-05