Cách mã hóa lưu lượng truy cập vào Redis với Stunnel trên Ubuntu 16.04
Redis là một repository dữ liệu key-value open-souce , sử dụng mô hình lưu trữ trong bộ nhớ với chức năng ghi đĩa tùy chọn để duy trì sự bền bỉ. Nó có các giao dịch, kiểu nhắn tin pub / sub và chuyển đổi dự phòng tự động trong số các chức năng khác. Redis có khách hàng được viết bằng hầu hết các ngôn ngữ với những ngôn ngữ được đề xuất được giới thiệu trên trang web của họ .Redis không cung cấp bất kỳ khả năng mã hóa nào của riêng mình. Nó hoạt động theo giả định nó đã được triển khai tới một mạng riêng biệt lập, chỉ các bên tin cậy mới có thể truy cập được. Nếu môi trường của bạn không phù hợp với giả định đó, bạn sẽ phải bọc lưu lượng Redis trong mã hóa riêng.
 Trong hướng dẫn này,  ta  sẽ trình bày cách mã hóa lưu lượng Redis bằng cách sử dụng một chương trình tunnel  an toàn được gọi là stunnel . Lưu lượng giữa các client  và  server  Redis sẽ được định tuyến thông qua một tunnel  được mã hóa SSL chuyên dụng.  Ta  sẽ sử dụng hai  server  Ubuntu 16.04 để chứng minh.
Yêu cầu
 Để bắt đầu, bạn nên có một  user  không phải root với các  quyền  sudo  cấu hình  trên mỗi máy của bạn. Ngoài ra, hướng dẫn này sẽ  giả định  bạn đã có sẵn firewall  cơ bản. Bạn có thể làm theo hướng dẫn  cài đặt   server  ban đầu Ubuntu 16.04 của  ta  để đáp ứng các yêu cầu này.
Khi đã sẵn sàng để tiếp tục, hãy làm theo bên dưới.
Đường hầm là gì?
 Đối với giao tiếp được mã hóa cơ bản, tiện ích stunnel cài đặt và cấu hình đơn giản. Nó cho phép chuyển tiếp được mã hóa giữa hai máy. Máy khách kết nối với một cổng local  và đường stunnel bao bọc nó trong mã hóa trước khi chuyển tiếp nó đến  server  từ xa. Về phía  server , stunnel lắng nghe cổng đã  cấu hình  và giải mã lưu lượng trước khi chuyển tiếp nó đến một cổng local  (trong trường hợp của  ta  là cổng mà  server  Redis lắng nghe).
 Một số lợi thế của việc sử dụng đường stunnel là:
-  Ubuntu duy trì các gói cho stunneltrong repository lưu trữ mặc định của nó
- Ubuntu bao gồm một tập lệnh init để tự động bắt đầu quá trình khi khởi động
- Cấu hình dễ hiểu và trực quan
- Một tunnel mới được sử dụng cho từng mục đích. Đây có thể là một bất lợi trong một số trường hợp, nhưng nó cung cấp khả năng kiểm soát chi tiết đối với quyền truy cập.
Một số nhược điểm là:
- Khách hàng kết nối với máy từ xa bằng cách gắn vào cổng local không phải mặc định, lúc đầu có thể không trực quan.
- Nếu kết nối hai server Redis để sao chép hoặc phân cụm, hai tunnel phải được cấu hình trên mỗi máy để giao tiếp giữa server với server (một cho đường đi và một đường cho lưu lượng đến).
Với những đặc điểm này, ta hãy bắt đầu.
Cài đặt Server Redis và Gói client
Trước khi bắt đầu, ta nên cài đặt server Redis trên một máy và các gói ứng dụng client có sẵn trên máy kia. Nếu bạn đã có một hoặc cả hai cấu hình này, vui lòng bỏ qua.
 Lưu ý: Hướng dẫn  server  Redis đặt khóa kiểm tra sẽ được sử dụng để kiểm tra kết nối sau này. Nếu bạn đã cài đặt  server  Redis, bạn có thể tiếp tục và đặt khóa này hoặc sử dụng bất kỳ khóa đã biết nào khác khi  ta  kiểm tra kết nối.
Cài đặt Server Redis
Ta sẽ sử dụng PPA server Redis của Chris Lea để cài đặt version cập nhật của Redis. Luôn thận trọng khi sử dụng hệ thống lưu trữ của bên thứ ba. Trong trường hợp này, Chris Lea là người đóng gói tin cậy , người duy trì các gói chất lượng cao, cập nhật cho một số dự án nguồn mở phổ biến.
Thêm PPA và cài đặt phần mềm server Redis trên máy đầu tiên của bạn bằng lệnh :
- sudo apt-add-repository ppa:chris-lea/redis-server 
- sudo apt-get update 
- sudo apt-get install redis-server 
Gõ Enter để chấp nhận dấu nhắc trong quá trình này.
Khi quá trình cài đặt hoàn tất, hãy kiểm tra xem bạn có thể kết nối local với dịch vụ Redis bằng lệnh :
- redis-cli ping 
Nếu phần mềm đã được cài đặt và đang chạy, bạn sẽ thấy:
Redis server outputPONG Hãy đặt một khóa mà ta có thể sử dụng sau này:
- redis-cli set test 'success' 
 Ta  đã đặt  key  kiểm tra success giá trị.  Ta  sẽ cố gắng truy cập khóa này từ client   của bạn  sau khi  cấu hình  đường stunnel .
Cài đặt ứng dụng client Redis
 Máy Ubuntu 16.04 khác sẽ hoạt động như client . Tất cả phần mềm  ta  cần đều có sẵn trong gói redis-tools trong repository  lưu trữ mặc định:
- sudo apt-get update 
- sudo apt-get install redis-tools 
Với cấu hình mặc định của server Redis từ xa và firewall đang hoạt động, ta hiện không thể kết nối với version Redis từ xa để kiểm tra.
Cài đặt và kích hoạt tunnel trên mỗi máy tính
 Tiếp theo, bạn  cần  cài đặt stunnel trên từng  server  và client . Ubuntu bao gồm version  bốn của tiện ích, được gọi là stunnel4 trong repository  lưu trữ mặc định của nó. Nếu bạn không cần cài đặt bất kỳ thứ gì trong phần trước, hãy đảm bảo bao gồm sudo apt-get update để  cập nhật OS  của bạn trước khi cài đặt:
- # sudo apt-get update 
- sudo apt-get install stunnel4 
Các stunnel dịch vụ trên Ubuntu sử dụng một kịch bản SysVinit cũ cho khởi động, có thể được quản lý bởi systemd. Thay vì sử dụng các phương thức systemd root , để  cấu hình  dịch vụ  bắt đầu khi server khởi động , bạn phải sửa đổi file  /etc/default/stunnel4 :
- sudo nano /etc/default/stunnel4 
Cho phép dịch vụ  bắt đầu khi server khởi động  bằng cách đặt tùy chọn ENABLED thành “1”:
. . . ENABLED=1 . . . Lưu file trên mỗi server .
Tiếp theo, ta sẽ tạo certificate SSL tự ký và khóa sẽ được sử dụng để mã hóa giao tiếp.
Tạo certificate và khóa SSL tự ký trên server Redis
 Trên  server  Redis của bạn, hãy tạo certificate  SSL tự ký và khóa trong folder  /etc/stunnel . Điều này sẽ được sử dụng để mã hóa kết nối giữa hai version  của stunnel .  Ta  sẽ sử dụng tên redis-server để tham chiếu đến certificate  và các file  khóa:
- sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/stunnel/redis-server.key -out /etc/stunnel/redis-server.crt 
Bạn sẽ được yêu cầu về thông tin về certificate bạn đang tạo. Vì điều này sẽ chỉ được sử dụng trong nội bộ, các giá trị không quá quan trọng, vì vậy hãy điền vào bất kỳ thứ gì bạn muốn. Bạn có thể xem một ví dụ bên dưới:
Redis server output. . . ----- Country Name (2 letter code) [AU]:US State or Province Name (full name) [Some-State]:New York Locality Name (eg, city) []:New York City Organization Name (eg, company) [Internet Widgits Pty Ltd]:DigitalOcean Organizational Unit Name (eg, section) []:Community Common Name (e.g. server FQDN or YOUR name) []:redis-server Email Address []:admin@example.com Hạn chế quyền truy cập vào file  .key tạo  bằng lệnh :
- sudo chmod 600 /etc/stunnel/redis-server.key 
Bây giờ  ta  có một certificate  và khóa SSL,  ta  có thể tạo ra  server  Redis của  ta  stunnel  file  cấu hình.
Tạo file cấu hình tunnel server Redis
 Mở file  có đuôi .conf trong folder  /etc/stunnel trên  server  Redis để bắt đầu:
- sudo nano /etc/stunnel/redis.conf 
Bên trong, chỉ định một vị trí để ghi file  PID trong phần chính. Thư mục /run được thiết kế để lưu trữ các loại file  này, vì vậy  ta  sẽ sử dụng:
pid = /run/stunnel-redis.pid Tiếp theo, tạo một phần để cấu hình quyền truy cập vào dịch vụ Redis. Bạn  có thể đặt tùy ý  ( ta  sẽ gọi nó là redis-server ). Phần tách cấu hình này với bất kỳ tunnel  nào khác mà bạn có thể cần cấu hình trên máy này sau này.
  Ta  cần chỉ định vị trí của certificate  và private key  của  server  Redis bằng cách sử dụng các lệnh cert và key tương ứng.
  Ta  cũng sẽ xác định tunnel  cho dữ liệu đến ở đây.  Ta  muốn accept  truy cập được  mã hóa đến cổng Redis mặc định (cổng 6379) trên địa chỉ IP bên ngoài của  server  Redis. Sau đó,  ta  muốn connect lưu lượng đó với cổng Redis mặc định trên giao diện cục bộ để gửi  truy cập được  giải mã. Đây là nơi mà dịch vụ Redis thực sự đang lắng nghe:
pid = /run/stunnel-redis.pid  [redis-server] cert = /etc/stunnel/redis-server.crt key = /etc/stunnel/redis-server.key accept = redis_servers_public_IP:6379 connect = 127.0.0.1:6379 Khi bạn hoàn tất, hãy lưu file .
Khởi động lại stunnel và cấu hình firewall
 Bây giờ đường stunnel đó đã được  cấu hình  trên  server  Redis,  ta  có thể khởi động lại dịch vụ  bằng lệnh :
- sudo systemctl restart stunnel4.service 
Nếu bạn kiểm tra các dịch vụ đang lắng nghe kết nối trên  server  Redis  của bạn , bạn sẽ thấy đường stunnel đang lắng nghe trên cổng 6379 trên giao diện công khai. Bạn cũng sẽ thấy Redis đang nghe cùng một cổng đó trên giao diện local :
- sudo netstat -plunt 
Redis server outputActive Internet connections (only servers) Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name tcp        0      0 public_IP:6379          0.0.0.0:*               LISTEN      4292/stunnel4    tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      2679/redis-server 1 tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1720/sshd        tcp6       0      0 :::22                   :::*                    LISTEN      1720/sshd Mặc dù đường stunnel đang lắng nghe trên giao diện công khai, nhưng firewall  có thể chưa được  cấu hình  để cho phép lưu lượng truy cập.
Để cho phép tất cả lưu lượng đến cổng 6379, hãy nhập:
- sudo ufw allow 6379 
Điều này sẽ mở ra quyền truy cập vào cổng 6379 trên giao diện công cộng của bạn, nơi đường stunnel đang lắng nghe. Cổng stunnel chỉ chấp nhận  truy cập được  mã hóa.
Phân phối Chứng chỉ cho Khách hàng
 Mỗi ứng dụng Redis  cần  một bản sao của file  certificate  của  server  Redis. Cách đơn giản nhất để phân phối các file  .crt là chỉ cần xuất nội dung của file  trên  server  và sau đó sao chép nội dung vào file  tương ứng trên các máy kết nối.
 Xuất nội dung của file  .crt trên  server  Redis của bạn  bằng lệnh :
- cat /etc/stunnel/redis-server.crt 
Redis server output-----BEGIN CERTIFICATE----- MIIEGTCCAwGgAwIBAgIJALUdz8P8q8UPMA0GCSqGSIb3DQEBCwUAMIGiMQswCQYD VQQGEwJVUzERMA8GA1UECAwITmV3IFlvcmsxFjAUBgNVBAcMDU5ldyBZb3JrIENp  . . .  Tq7WJk77tk4nPI8iGv1WuK8xTAm5aOncxP16VoMpsDMV+GB1p3nBkMQ/GKF8pPXU fn6BnDWKmeZqAlBM+MGYAfkbZWdBslrWasCJzs+tehTqL0LLJ6d3Gi9biBPb -----END CERTIFICATE----- Sao chép certificate được hiển thị, bao gồm các dòng được đánh dấu BEGIN CERTIFICATE và END CERTIFICATE vào clipboard của bạn.
 Trên client , hãy mở một file  có cùng tên trong folder  /etc/stunnel :
- sudo nano /etc/stunnel/redis-server.crt 
Dán nội dung bạn đã sao chép từ server Redis. Lưu file khi bạn hoàn tất.
Tạo file cấu hình tunnel ứng dụng client Redis
 Bây giờ client  đã có bản sao certificate  của  server ,  ta  có thể  cấu hình  phía client  của cấu hình đường stunnel .
 Mở file  có đuôi .conf trong folder  /etc/stunnel trên client .  Ta  sẽ gọi lại file  là redis.conf :
- sudo nano /etc/stunnel/redis.conf 
Bên trong, chỉ định một file PID nơi dịch vụ sẽ lưu trữ lại ID quy trình của nó:
pid = /run/stunnel-redis.pid Tiếp theo, thêm một phần để  cấu hình  tunnel  cho dữ liệu gửi đi. Bạn có thể đặt tên cho nó  bạn muốn  ( ta  sẽ gọi nó là redis-client ). Phần tách cấu hình này với bất kỳ tunnel  nào khác mà bạn có thể cần cấu hình trên máy này sau này.
  Ta  cần đánh dấu rõ ràng phần này là cấu hình client  bằng cách sử dụng lệnh client . Đặt chỉ thị accept để lắng nghe trên một cổng không sử dụng trên giao diện local  để xử lý các kết nối từ client  Redis local  của bạn ( ta  sẽ sử dụng cổng 8000 trong ví dụ này). Đặt chỉ thị connect thành địa chỉ IP công cộng của  server  Redis và cổng mà  ta  đã mở.
 Sau đó, sử dụng CAfile để trỏ đến bản sao certificate  của  server  Redis.  Ta  cũng phải đặt verify thành 4, điều này làm cho stunnel chỉ kiểm tra certificate  mà không liên quan đến chuỗi certificate  (vì  ta  đã tự ký certificate   của bạn ):
pid = /run/stunnel-redis.pid  [redis-client] client = yes accept = 127.0.0.1:8000 connect = remote_server_IP_address:6379 CAfile = /etc/stunnel/redis-server.crt verify = 4 Lưu file khi bạn hoàn tất.
Khởi động lại Dịch vụ Khách hàng và Kiểm tra Kết nối
 Khởi động lại dịch vụ đường stunnel trên client  để  áp dụng các thay đổi :
- sudo systemctl restart stunnel4.service 
Kiểm tra xem tunnel trên client đã được cài đặt đúng cách chưa:
- sudo netstat -plunt 
Redis client outputActive Internet connections (only servers) Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name tcp        0      0 127.0.0.1:8000          0.0.0.0:*               LISTEN      3809/stunnel4    tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1714/sshd        tcp6       0      0 :::22                   :::*                    LISTEN      1714/sshd  Như bạn thấy , stunnel đang lắng nghe các kết nối trên cổng local  8000.
Bây giờ, bạn có thể kết nối với version Redis từ xa bằng cách trỏ client của bạn đến cổng 8000 trên giao diện local của bạn:
- redis-cli -p 8000 ping 
Redis client outputPONG Truy vấn cho khóa kiểm tra mà ta đã đặt ở đầu hướng dẫn này:
- redis-cli -p 8000 get test 
Redis client output"success" Điều này xác nhận ta có thể truy cập thành công database từ xa.
Để xác nhận ta không thể giao tiếp với server Redis từ xa mà không sử dụng tunnel , ta có thể thử kết nối trực tiếp với cổng từ xa:
- redis-cli -h redis_server_public_IP -p 6379 ping 
Redis client outputError: Connection reset by peer Như bạn thấy , lưu lượng chỉ được chấp nhận trên cổng Redis từ xa nếu nó được mã hóa chính xác qua tunnel .
Mở rộng ví dụ trên cho giao tiếp đa client và server với server
Ví dụ ta đã nêu ở trên sử dụng một ví dụ đơn giản về một server Redis và một client duy nhất. Tuy nhiên, những phương pháp tương tự này có thể được áp dụng cho các tương tác phức tạp hơn.
Việc mở rộng ví dụ này để xử lý nhiều client rất đơn giản. Bạn cần thực hiện các hành động sau được nêu ở trên.
-  Cài đặt phần mềm client  Redis và gói đường stunneltrên client mới
-  Bật phần mềm đường stunnelđể bắt đầu khi server khởi động
-  Sao chép file  certificate  của  server  vào folder  /etc/stunnel
-  Sao chép file  cấu hình  ứng dụng client  stunnelsang client mới
-  Khởi động lại dịch vụ đường stunnel
Để cài đặt giao tiếp an toàn giữa server với server (ví dụ: để sao chép hoặc phân cụm), bạn cần cài đặt hai tunnel song song:
-  Trên  server  mới, cài đặt gói  server  Redis và đường stunnel
-  Bật phần mềm đường stunnelđể bắt đầu khi server khởi động
- Tạo certificate mới và file khóa cho server Redis mới (sử dụng tên duy nhất cho file )
-  Sao chép từng file  certificate  từ  server  này sang  server  khác vào folder  /etc/stunnel
-  Chỉnh sửa hoặc tạo file  cấu hình đường stunneltrên mỗi server (bao gồm cả các server hiện có) để nó chứa:- Phần server ánh xạ cổng bên ngoài tới Redis local
- Phần client ánh xạ một cổng local tới cổng tiếp xúc của server từ xa
 
- Mở cổng bên ngoài trong firewall trên server Redis mới
- Cấu hình từng cá thể Redis để kết nối với cổng được ánh xạ local để truy cập server từ xa bằng cách điều chỉnh file cấu hình Redis (các lệnh bắt buộc phụ thuộc vào mối quan hệ của các server . Xem tài liệu Redis để biết thêm chi tiết).
 Các file  cấu hình đường stunnel cho cả hai  server  sẽ trông giống như sau: 
pid = /run/stunnel-redis.pid  [redis-server] cert = /etc/stunnel/this_servers_certificate.crt key = /etc/stunnel/this_servers_key.key accept = this_servers_public_IP:6379 connect = 127.0.0.1:6379  [redis-client] client = yes accept = 127.0.0.1:arbitrary_local_port connect = remote_servers_public_IP:6379 CAfile = /etc/stunnel/remote_servers_certificate.crt verify = 4 Nếu cần, nhiều phần client  có thể được cấu hình trên mỗi máy để ánh xạ các cổng local  tới các  server  từ xa. Trong những trường hợp này, hãy đảm bảo chọn một cổng local  không sử dụng khác với chỉ thị accept cho mỗi  server  từ xa.
Kết luận
Redis là một công cụ mạnh mẽ và linh hoạt, vô giá cho nhiều triển khai. Tuy nhiên, việc vận hành Redis trong môi trường không an toàn là một trách nhiệm rất lớn khiến server và dữ liệu dễ bị tấn công hoặc đánh cắp. Điều cần thiết là phải đảm bảo lưu lượng truy cập thông qua các phương tiện khác nếu bạn không có một mạng bị cô lập chỉ do các bên tin cậy phổ biến. Phương pháp được nêu trong hướng dẫn này chỉ là một cách để bảo mật thông tin liên lạc giữa các bên Redis. Các tùy chọn khác bao gồm đào hầm bằng spiped hoặc cài đặt VPN .
Các tin liên quan
Cách mã hóa lưu lượng truy cập vào Redis với PeerVPN trên Ubuntu 16.042016-11-08
Cách cài đặt và cấu hình Redis trên Ubuntu 16.04
2016-05-11
Cách di chuyển dữ liệu Redis với Master-Slave Replication trên Ubuntu 14.04
2016-05-05
Cách tìm log Redis trên Ubuntu
2016-03-01
Cách bảo mật cài đặt Redis của bạn trên Ubuntu 14.04
2015-09-25
Cách backup và khôi phục dữ liệu Redis của bạn trên Ubuntu 14.04
2015-09-14
Cách thiết lập server Redis làm Trình xử lý phiên cho PHP trên Ubuntu 14.04
2015-08-21
Cách cấu hình một cụm Redis trên CentOS 7
2015-07-30
Cách cấu hình cụm Redis trên Ubuntu 14.04
2015-07-16
Cách cấu hình bộ đệm Redis để tăng tốc WordPress trên Ubuntu 14.04
2014-12-15
 

