Haproxy là gì? Cách bảo mật HAProxy với Let’s Encrypt trên CentOS 7

Let's Encrypt đã cung cấp một chứng chỉ SSL/TLS miễn phí, tạo điều kiện cho việc mã hóa dữ liệu và bảo mật kết nối HTTPS trên máy chủ. Trong bài viết dưới đây, LANIT sẽ chia sẻ các bước bảo mật HAProxy với Let’s Encrypt trên CentOS 7 chi tiết cùng với việc tự động gia hạn chứng chỉ để duy trì mức bảo mật tốt hơn nhé!

Haproxy là gì?

HAProxy là trình cân bằng tải phần mềm phổ biến có tốc độ nhanh nhất. Đây cũng là giải pháp phân phối các máy chủ Proxy trên hệ điều hành Linux, MacOS và FreeBSD. Công cụ sử dụng mã nguồn mở để cân bằng tải TCP và HTTP.

HAProxy có rất nhiều tính năng nổi bật đó là:

  • Hỗ trợ cân bằng tải ở lớp thứ 4 và lớp thứ 7 (Tương ứng với TCP và HTTP).
  • Hỗ trợ giao thức HTTP, HTTP / 2, gRPC và FastCGI.
  • Lưu trữ chứng chỉ số SSL động.
  • Phân phối, chuyển đổi và kiểm tra nội dung giữa các máy chủ.
  • Ghi lại nhật ký chi tiết về các nội dung chuyển đổi.
  • Kiểm tra, xác thực giao thức HTTP.
  • Ghi lại và lưu trữ các URL.
  • Tính năng ủy quyền công khai, minh bạch.
  • Cung cấp các giao diện dòng lệnh CLI để hỗ trợ tương tác giữa các máy chủ.

Hướng dẫn bảo mật HAProxy với Let’s Encrypt trên CentOS 7

Trước khi bảo mật HAProxy bằng Let’s Encrypt trên CentOS 7, bạn cần chuẩn bị các yêu cầu dưới đây:

  • Một máy chủ chạy CentOS 7 và một user không phải là root nhưng có quyền sudo. 
  • Tên miền mà bạn đã đăng ký để sử dụng trong chứng chỉ. 
  • Bạn cần tạo một bản ghi A Record để liên kết tên miền với địa chỉ IP public với máy chủ. Bởi Let’s Encrypt sẽ dùng bản ghi này để xác minh bạn sở hữu tên miền.
  • Bạn cần cài đặt Certbot – phần mềm của Let’s Encrypt được dùng để lấy và quản lý chứng chỉ bảo mật.

Dưới đây là các bước chi tiết hướng dẫn bảo mật HAProxy với Let’s Encrypt trên CentOS 7:

Bước 1: Cài đặt cerbot

Bước đầu tiên để sử dụng Let’s Encrypt để thu được chứng chỉ SSL là cài đặt phần mềm certbot trên máy chủ của bạn. Cách tốt nhất để cài đặt nó là thông qua kho lưu trữ EPEL.

Bật quyền truy cập vào kho lưu trữ EPEL trên máy chủ của bạn bằng cách sử dụng lệnh sau:

sudo yum install epel-release

Sau khi kho lưu trữ bật, bạn lấy gói certbot bằng cách sử dụng lệnh sau:

sudo yum install certbot

Ứng dụng khách certbot của Let’s Encrypt bây giờ đã được cài đặt và sẵn sàng sử dụng.

Bước 2: Cài đặt chứng chỉ

Để lấy chứng chỉ SSL từ Let’s Encrypt, chúng ta làm theo các bước sau:

#1. Xác minh port 80 mở

Để xác minh port 80 mở, bạn sử dụng công cụ Certbot để lấy chứng chỉ SSL. Để làm điều này, port 80 trên máy chủ cần phải trống và không được sử dụng bởi các dịch vụ khác (Nếu bạn đã sử dụng port 80 để chạy một trang web, bạn cần tạm thời tắt trang web đó).

Nếu bạn đang sử dụng HAProxy, bạn có thể sử dụng lệnh sau để tắt:

sudo systemctl stop haproxy

Nếu bạn không chắc chắn port 80 có đang được sử dụng hay không, hãy sử dụng lệnh sau:

netstat -na | grep ‘:80.*LISTEN’

#2. Chạy Cerbot

Chúng ta sẽ dùng Certbot với plugin Standalone để lấy chứng chỉ SSL. Plugin này tạm thời chạy một máy chủ web nhỏ trên port 80 trên máy chủ để xác minh và lấy chứng chỉ. Để tiến hành bạn sử dụng lệnh sau:

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

Sau đó, bạn sẽ được hỏi về địa chỉ email và bạn cần đồng ý với điều khoản dịch vụ của Let’s Encrypt.

Nếu như việc chạy Certbot thành công, hệ thống sẽ hiển thị một thông báo xác nhận chứa địa chỉ lưu trữ chứng chỉ và ngày hết hạn của chững chỉ..

Lưu ý: Nếu bạn đang sử dụng một dịch vụ DNS như CloudFlare để quản lý tên miền thì hãy tạm thời tắt dịch vụ này cho đến khi bạn lấy được chứng chỉ.

#3. File chứng chỉ SSL

Sau khi đã nhận được chứng chỉ, bạn sẽ nhận được các file được mã hóa PEM bao gồm:

  • cert.pem: Chứng chỉ của tên miền
  • chain.pem: Chuỗi chứng chỉ từ Let’s Encrypt
  • fullchain.pem: Kết hợp của cert.pem và chain.pem
  • privkey.pem: Khóa riêng tư của chứng chỉ

Để sử dụng chứng chỉ này trong cấu hình máy chủ web, bạn cần nhớ vị trí mà bạn đã lưu chúng.

#4. Kết hợp tập tin chứng chỉ fullchain.pem & privkey.pem

Nếu bạn đang sử dụng HAProxy, bạn cần kết hợp tập tin fullchain.pemprivkey.pem thành một tập tin duy nhất. 

Hãy tạo thư mục file kết hợp sẽ được đặt vào ví dụ như /etc/haproxy/certs, bạn có thể chạy lệnh sau:

sudo mkdir -p /etc/haproxy/certs

Tiếp theo, bạn tạo một file kết hợp với lệnh cat (hãy thay example.comm bằng tên 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'

Để bảo mật quyền truy cập tới các file kết hợp chứa private key, bạn sử dụng lệnh sau:

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

Bây giờ, hãy sẵn sàng sử dụng chứng chỉ SSL và khóa riêng tư với HAProxy.

Xem thêm >>> Hướng Dẫn Cách Bảo Mật Apache Bằng Let’s Encrypt trên CentOS 7

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

Để cài đặt HAProxy với yum bạn có thể sử dụng lệnh sau:

sudo yum install haproxy

Sau khi chạy lệnh xong, HAProxy đã được cài đặt, bước tiếp theo bạn cần cấu hình HAProxy.

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

Bước này bao gồm cả cách cấu hình HAProxy để cho phép người dùng tự động gia hạn chứng chỉ Let’s Encrypt. Đầu tiên, bạn mở file haproxy.cfg trong một text editor, hãy sử dụng lệnh sau:

sudo vi /etc/haproxy/haproxy.cfg

Tiếp theo là chỉnh sửa các phần trong file này, hãy giữ cho file luôn được mở.

#1. Global Section

Thêm dòng sau vào phần global để cấu hình size tối đa các DHE key được tạo ra:

 tune.ssl.default-dh-param 2048

#2. Frontend Sections

Trước hết, chúng ta sẽ cấu hình Frontend Sections từ người dùng đến máy chủ bên trong thông qua HAProxy. Cấu hình mặc định của HAProxy bao gồm 1 frontend và một số backend. Vậy nên, bạn hãy xóa các cấu hình này nếu không cần thiết.

Thêm Frontend cho Kết Nối HTTP: Để thực hiện thao tác này, bạn hãy thêm một phần frontend mới để xử lý kết nối HTTP. Điều này cho phép HAProxy nhận các yêu cầu  từ HTTP và gửi chúng đến máy chủ bên trong. Bạn có thể chạy lệnh dưới đây:

frontend www-http
   bind haproxy_www_public_IP:80
   reqadd X-Forwarded-Proto:\ http
   default_backend www-backend

Thêm Frontend cho Kết Nối HTTPS: Tiếp theo, bạn hãy thêm một phần frontend khác để xử lý kết nối HTTPS. Điều này cho phép HAProxy nhận các yêu cầu HTTPS và gửi chúng đến các phần backend khác nhau. Bạn có thể chạy lệnh dưới đây:

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

Như vậy, frontend sẽ đảm nhiệm việc định tuyến các kết nối từ người dùng và gửi chúng đến các phần backend tương ứng để phục vụ ứng dụng web và trang web của bạn.

#3. Backend Sections

Sau khi đã cấu hình phần frontend, tiếp theo cần thêm phần backend để định tuyến kết nối đến các máy chủ bên trong.

Thêm backend cho www-backend: Bạn cần thêm phần backend để xử lý kết nối đến các máy chủ web. Thay thế các địa chỉ IP private của máy chủ web bằng tên miền hoặc địa chỉ IP tương ứng. Bạn có thể sử dụng lệnh sau:

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

Backend này sẽ chuyển hướng lưu lượng truy cập HTTP đến HTTPS (nếu không phải là kết nối SSL). Các kết nối sẽ được cân bằng tải trên các máy chủ đã liệt kê thông qua giao thức HTTP (port 80).

Thêm backend cho letsencrypt-backend: Bạn cần thêm backend để xử lý giao thức ACME của Let’s Encrypt, được sử dụng để yêu cầu và gia hạn chứng chỉ SSL của Let’s Encrypt. Để  thêm backend, bạn có thể sử dụng lệnh sau:

backend letsencrypt-backend
server letsencrypt 127.0.0.1:54321

Backend này sẽ xử lý yêu cầu từ Let’s Encrypt và được định tuyến đến địa chỉ localhost trên cổng 54321. Sau khi bạn đã hoàn thành phần cấu hình backend và frontend, hãy khởi động lại HAProxy bằng lệnh sau đây:

sudo systemctl start haproxy

Sau khi hoàn thành tất, Chứng chỉ TLS/SSL của Let’s Encrypt đã được cài đặt cho trang web thành công. Để kiểm tra chứng chỉ hoạt động hay chưa, bạn có thể truy cập vào trang web qua trình duyệt xem biểu tượng khóa an toàn bảo mật.

Bước 5: Thiết lập tự động gia hạn chứng chỉ SSL

Chứng chỉ Let’s Encrypt chỉ có giá trị trong 90 ngày, nên bạn cần tự động gia hạn. Để chứng chỉ hoạt động hiệu quả không bị hết hạn bạn cần tạo một cron job tự động xử lý gia hạn. Công việc cron này sẽ chạy certbot hàng ngày và gia hạn chứng chỉ nếu còn 30 ngày trước khi hết hạn. Cerbot cũng sẽ chạy một script đặc biệt sau khi gia hạn thành công. Và bạn sẽ sử dụng script này để cập nhật tệp .pem kết hợp và tải lại haproxy.

#1. Tạo Script Gia Hạn

Để mở một tệp mới trong /usr/local/bin với quyền root, bạn sử dụng lệnh sau:

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

Tiếp theo, bạn dán đoạn script sau, lệnh sẽ có dạng như sau:

#!/bin/sh
SITE=example.com
cd /etc/letsencrypt/live/$SITE
cat fullchain.pem privkey.pem > /etc/haproxy/certs/$SITE.pem
systemctl reload haproxy

Sau đó, bạn hãy lưu và đóng tệp. Làm cho script có thể chạy:

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

Để chạy script, bạn chạy lệnh sau đây:

sudo /usr/local/bin/renew.sh

#2. Cập nhật cấu hình certbot

Lệnh certbot renew đọc tệp cấu hình đã tạo lúc chạy certbot lần đầu. Bạn hãy mở tệp cấu hình này và cập nhật cổng cho certbot chạy máy chủ http độc lập để không xung đột với haproxy ( trên cổng 80 và 443):

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

Để thay đổi dòng http01_port, bạn có thể sử dụng lệnh sau:

http01_port = 54321

Hãy lưu và thoát khỏi màn hình. Tiếp tục kiểm tra quá trình gia hạn, bằng cách chỉ định –dry-run để kiểm tra bằng lệnh sau đây:

sudo certbot renew --dry-run

#3. Tạo một Cron Job

Tiếp theo, bạn chỉnh sửa crontab cho người dùng root bằng lệnh sau đây:

sudo crontab -e

Để thêm đoạn sau vào cuối tệp bạn sử dụng lệnh:

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

Sau khi đã thêm nội dung được chỉ định vào file crontab, lưu và thoát khỏi text editor. Cron Job sẽ chạy lệnh certbot renew hàng ngày lúc 2:30 sáng và cập nhật haproxy nếu cần.

Bạn đang cần mua SSL thì LANIT chính là một lựa chọn àn toàn và chất lượng dành cho bạn. Để được tư vẫn chi tiết, vui lòng liên hệ với chúng tôi nhé!

Trên đây là toàn bộ các bước hướng dẫn bảo mật HAProxy với Let’s Encrypt trên CentOS 7 mà bạn có thể tham khảo. Nếu có bất kỳ thắc mắc nào hãy dể lại bình luận hoặc liên hệ chúng tôi ngay để được giải đáp ngay lập tức nhé!

Nguyễn Đức Hòa

Xin chào, mình là Nguyễn Đức Hoà, hiện đang đảm nhận vị trí Trưởng phòng kỹ thuật tại LANIT. Với 8 năm kinh nghiệm trong mảng System, Network , Security; mình luôn hướng đến việc tìm kiếm và áp dụng các giải pháp kỹ thuật tiên tiến nhất cho mọi dự án. Công việc của mình không chỉ dừng lại ở việc quản lý mà còn mang đến cho khách hàng những giải pháp lưu trữ dữ liệu tốt nhất hiện nay. Rất hy vọng những kinh nghiệm và chia sẻ của mình sẽ mang lại nhiều giá trị hữu ích cho các bạn.

Chat với chúng tôi qua Zalo!
Chat với chúng tôi qua Zalo!