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
stunnel
trong 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
stunnel
trê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
stunnel
sang 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
stunnel
trê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