Thứ năm, 17/07/2014 | 00:00 GMT+7

Cách thiết lập cân bằng tải Nginx với kết thúc SSL

Bài viết này hướng dẫn bạn cách cài đặt cân bằng tải Nginx với kết thúc SSL chỉ với một certificate SSL trên trình cân bằng tải. Điều này sẽ giảm chi phí quản lý SSL của bạn, vì các bản cập nhật OpenSSL và các khóa và certificate hiện có thể được quản lý từ chính bộ cân bằng tải.

Giới thiệu về chấm dứt SSL

Nginx có thể được cấu hình như một bộ cân bằng tải để phân phối lưu lượng đến xung quanh một số server backend . Kết thúc SSL là quá trình xảy ra trên bộ cân bằng tải, xử lý mã hóa / giải mã SSL để lưu lượng truy cập giữa bộ cân bằng tải và server backend ở HTTP. Các phần backend phải được bảo mật bằng cách hạn chế quyền truy cập vào IP của bộ cân bằng tải, điều này sẽ được giải thích ở phần sau của bài viết này.

Sơ đồ kết thúc SSL

Yêu cầu

Trong hướng dẫn này, các lệnh phải được chạy với quyền user root hoặc user có quyền sudo. Bạn có thể xem cách cài đặt điều đó trong Hướng dẫn user .

Các hướng dẫn sau được dùng để tham khảo:

Server LAMP là không bắt buộc, nhưng ta sẽ sử dụng nó làm ví dụ trong hướng dẫn này.

Cài đặt

Hướng dẫn này sử dụng 3 server sau:

Server 1 (Giao diện user )

  • Hình ảnh: Ubuntu 14.04
  • Tên server : loadbalancer
  • IP riêng: 10.130.227.33

Server 2 ( Backend )

  • Hình ảnh: Ubuntu 14.04
  • Tên server : web1
  • IP riêng: 10.130.227.11

Server 3 ( Backend )

  • Hình ảnh: Ubuntu 14.04
  • Tên server : web2
  • IP riêng: 10.130.227.22

Tên domain - example.com

Tất cả các server này phải được bật mạng riêng .

Cập nhật và nâng cấp phần mềm trên cả ba server :

apt-get update && apt-get upgrade -y 

Khởi động lại từng server để áp dụng các nâng cấp. Điều này rất quan trọng, vì OpenSSL cần phải sử dụng version mới nhất để được bảo mật.

Ta sẽ cài đặt một server ảo Nginx mới cho domain với module ngược dòng cân bằng tải các phần backend .

Trước khi cài đặt cân bằng tải Nginx, bạn nên cài đặt Nginx trên VPS của bạn . Bạn có thể cài đặt nó một cách nhanh chóng với apt-get :

apt-get install nginx 

Trên hai server backend , cập nhật repository của bạn và cài đặt Apache:

apt-get install apache2 

Cài đặt PHP trên cả hai server backend :

apt-get install php5 libapache2-mod-php5 php5-mcrypt 

Để biết thêm thông tin, hãy xem bài viết này .

Tạo khóa và tạo certificate SSL

Trong phần này, bạn sẽ thực hiện các bước cần thiết để tạo certificate SSL. Bài viết này giải thích chi tiết về certificate SSL trên Nginx.

Tạo folder certificate SSL và chuyển sang nó.

mkdir -p /etc/nginx/ssl/example.com cd /etc/nginx/ssl/example.com 

Tạo private key :

openssl genrsa -des3 -out server.key 2048 

Xóa passphrase (password bảo vệ) của nó:

openssl rsa -in server.key -out server.key 

Tạo CSR (Yêu cầu ký certificate ):

openssl req -new -key server.key -out server.csr 

Sử dụng CSR này để lấy certificate hợp lệ từ tổ chức phát hành certificate hoặc tạo certificate tự ký bằng lệnh sau.

openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt 

Sau khi thực hiện xong, folder này sẽ chứa các file sau:

  • server.key - Khóa riêng tư
  • ca-certs.pem - Tập hợp các certificate root và certificate trung gian của CA của bạn. Chỉ xuất trình nếu bạn nhận được certificate hợp lệ từ CA.
  • server.crt - Chứng chỉ SSL cho domain của bạn

Tệp server ảo và module ngược dòng

Tạo file server ảo bên trong folder Nginx

nano /etc/nginx/sites-available/example.com 

Thêm module ngược dòng chứa địa chỉ IP riêng của các server backend

upstream mywebapp1 {     server 10.130.227.11;     server 10.130.227.22; } 

Bắt đầu khối server sau dòng này. Khối này chứa domain , các tham chiếu đến các server ngược dòng và các tiêu đề sẽ được chuyển đến phần backend .

server {     listen 80;     server_name example.com www.example.com;      location / {         proxy_pass http://mywebapp1;         proxy_set_header Host $host;         proxy_set_header X-Real-IP $remote_addr;         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;         proxy_set_header X-Forwarded-Proto $scheme;     } } 

Chỉ thị proxy_set_header được sử dụng để chuyển thông tin quan trọng về yêu cầu tới các server ngược dòng.

Lưu file này và tạo một softlink đến folder sites-enabled .

ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com 

Thực hiện kiểm tra cấu hình để kiểm tra lỗi.

service nginx configtest 

Nếu không có lỗi nào được hiển thị, hãy reload dịch vụ nginx.

service nginx reload 

Cân bằng tải hiện đã được cấu hình cho HTTP.

Bật SSL

Thêm các lệnh sau vào file server ảo (/etc/nginx/sites-available/example.com) bên trong khối server {} . Những dòng này sẽ được hiển thị trong ngữ cảnh trong ví dụ tiếp theo.

listen 443 ssl; ssl on; ssl_certificate         /etc/nginx/ssl/example.com/server.crt; ssl_certificate_key     /etc/nginx/ssl/example.com/server.key; ssl_trusted_certificate /etc/nginx/ssl/example.com/ca-certs.pem; 

Bỏ qua chỉ thị ssl_trusted_certificate nếu bạn đang sử dụng certificate tự ký. Bây giờ khối server sẽ trông như thế này:

server {     listen 80;     listen 443 ssl;     server_name example.com www.example.com;      ssl on;     ssl_certificate         /etc/nginx/ssl/example.com/server.crt;     ssl_certificate_key     /etc/nginx/ssl/example.com/server.key;     ssl_trusted_certificate /etc/nginx/ssl/example.com/ca-certs.pem;      location / {         proxy_pass http://mywebapp1;         proxy_set_header Host $host;         proxy_set_header X-Real-IP $remote_addr;         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;         proxy_set_header X-Forwarded-Proto $scheme;     } } 

Kiểm tra lỗi cấu hình và reload dịch vụ Nginx.

service nginx configtest && service nginx reload 

Bảo mật các server backend

Hiện tại, trang web được lưu trữ trên các server backend có thể được truy cập trực tiếp bởi bất kỳ ai biết địa chỉ IP công khai của nó. Điều này có thể được ngăn chặn bằng cách cấu hình các web server trên phần backend để chỉ lắng nghe trên giao diện riêng tư. Các bước để thực hiện việc này trong Apache như sau.

Chỉnh sửa file ports.conf .

nano /etc/apache2/ports.conf 

Tìm dòng sau:

Listen 80 

Thay thế nó bằng địa chỉ IP riêng của server backend :

Listen 10.130.227.22:80 

Thực hiện việc này trên tất cả các server backend và khởi động lại Apache.

service apache2 restart 

Bước tiếp theo là hạn chế quyền truy cập HTTP vào IP riêng của trình cân bằng tải . Luật firewall sau đây đạt được điều này.

iptables -I INPUT -m state --state NEW -p tcp --dport 80 ! -s 10.130.227.33 -j DROP 

Thay thế ví dụ bằng địa chỉ IP riêng của trình cân bằng tải và thực thi luật này trên tất cả các server backend .

Kiểm tra cài đặt

Tạo một file PHP trên tất cả các server backend (web1 và web2 trong ví dụ này). Điều này là để thử nghiệm và có thể được gỡ bỏ sau khi cài đặt hoàn tất.

nano /var/www/html/test.php 

Nó sẽ in domain được truy cập, địa chỉ IP của server , địa chỉ IP của user và cổng được truy cập.

<?php     header( 'Content-Type: text/plain' );     echo 'Host: ' . $_SERVER['HTTP_HOST'] . "\n";     echo 'Remote Address: ' . $_SERVER['REMOTE_ADDR'] . "\n";     echo 'X-Forwarded-For: ' . $_SERVER['HTTP_X_FORWARDED_FOR'] . "\n";     echo 'X-Forwarded-Proto: ' . $_SERVER['HTTP_X_FORWARDED_PROTO'] . "\n";     echo 'Server Address: ' . $_SERVER['SERVER_ADDR'] . "\n";     echo 'Server Port: ' . $_SERVER['SERVER_PORT'] . "\n\n"; ?> 

Truy cập file này nhiều lần bằng trình duyệt của bạn hoặc sử dụng curl . Sử dụng curl -k trên các cài đặt certificate tự ký để làm cho curl bỏ qua lỗi SSL.

curl https://example.com/test.php https://example.com/test.php https://example.com/test.php 

Đầu ra sẽ tương tự như sau.

   Host: example.com    Remote Address: 10.130.245.116    X-Forwarded-For: 117.193.105.174    X-Forwarded-Proto: https    Server Address: 10.130.227.11    Server Port: 80     Host: example.com    Remote Address: 10.130.245.116    X-Forwarded-For: 117.193.105.174    X-Forwarded-Proto: https    Server Address: 10.130.227.22    Server Port: 80     Host: example.com    Remote Address: 10.130.245.116    X-Forwarded-For: 117.193.105.174    X-Forwarded-Proto: https    Server Address: 10.130.227.11    Server Port: 80 

Lưu ý Địa chỉ server thay đổi theo từng yêu cầu, cho biết rằng một server khác đang phản hồi từng yêu cầu.

Tăng cường cấu hình SSL

Phần này giải thích việc cấu hình SSL theo các phương pháp hay nhất để loại bỏ các lỗ hổng bảo mật với các giao thức và mật mã cũ hơn. Các dòng riêng lẻ được hiển thị trong phần này và file cấu hình hoàn chỉnh được hiển thị trong phần cuối cùng của hướng dẫn này.

Bật cache phiên SSL cải thiện hiệu suất của các trang web HTTPS. Các lệnh sau phải được đặt sau ssl_trusted_certificate . Chúng cho phép chia sẻ bộ nhớ đệm có kích thước 20MB với thời gian tồn tại của bộ nhớ cache là 10 phút .

ssl_session_cache shared:SSL:20m; ssl_session_timeout 10m; 

Chỉ định các giao thức và mật mã sẽ được sử dụng trong kết nối SSL. Ở đây ta đã bỏ qua SSLv2 và vô hiệu hóa các mật mã không an toàn như MD5 và DSS.

ssl_prefer_server_ciphers       on; ssl_protocols                   TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers                     ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS; 

Bảo mật vận tải nghiêm ngặt hướng dẫn tất cả các trình duyệt web hỗ trợ chỉ sử dụng HTTPS. Kích hoạt nó bằng chỉ thị add_header .

add_header Strict-Transport-Security "max-age=31536000"; 

Kiểm tra lỗi cấu hình và reload dịch vụ Nginx.

service nginx configtest && service nginx reload 

Cấu hình hoàn chỉnh

Sau khi cấu hình và củng cố kết thúc SSL, file cấu hình hoàn chỉnh sẽ giống như sau:

/etc/nginx/sites-available/ example.com

upstream mywebapp1 {     server 10.130.227.11;     server 10.130.227.22; }  server {     listen 80;     listen 443 ssl;     server_name example.com www.emxaple.com;      ssl on;     ssl_certificate         /etc/nginx/ssl/example.com/server.crt;     ssl_certificate_key     /etc/nginx/ssl/example.com/server.key;     ssl_trusted_certificate /etc/nginx/ssl/example.com/ca-certs.pem;      ssl_session_cache shared:SSL:20m;     ssl_session_timeout 10m;      ssl_prefer_server_ciphers       on;     ssl_protocols                   TLSv1 TLSv1.1 TLSv1.2;     ssl_ciphers                     ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS;      add_header Strict-Transport-Security "max-age=31536000";      location / {         proxy_pass http://mywebapp1;         proxy_set_header Host $host;         proxy_set_header X-Real-IP $remote_addr;         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;         proxy_set_header X-Forwarded-Proto $scheme;     } } 

Thực hiện Kiểm tra server SSL và cài đặt này sẽ đạt điểm A +. Chạy lại bài kiểm tra độ cong để kiểm tra xem mọi thứ có hoạt động bình thường không.

curl https://example.com/test.php https://example.com/test.php https://example.com/test.php 

Đọc thêm

Để tìm hiểu thêm về các thuật toán cân bằng tải, hãy đọc bài viết này .


Tags:

Các tin liên quan

Cách cài đặt Laravel với web server Nginx trên Ubuntu 14.04
2014-06-24
Cách cài đặt gpEasy CMS với NGINX và PHP5-FPM trên Debian 7
2014-06-03
Cách sử dụng Nginx làm Giám đốc lưu lượng toàn cầu trên Debian hoặc Ubuntu
2014-05-30
Cách sử dụng HAProxy làm bộ cân bằng tải lớp 7 cho WordPress và Nginx trên Ubuntu 14.04
2014-05-27
Cách cung cấp tệp mật khẩu KeePass2 với Nginx trên server Ubuntu 14.04
2014-05-16
Cách cài đặt WordPress với Nginx trên Ubuntu 14.04
2014-05-15
Cách tạo chứng chỉ SSL trên Nginx cho Ubuntu 14.04
2014-05-09
Cách tạo chứng chỉ SSL trên Nginx cho Ubuntu 14.04
2014-05-09
Cách cài đặt Nginx trên Ubuntu 14.04 LTS
2014-04-29
Cách thiết lập server block Nginx (server ảo) trên Ubuntu 14.04 LTS
2014-04-25