Thứ tư, 09/11/2016 | 00:00 GMT+7

Cách mã hóa lưu lượng truy cập vào Redis với Spiped 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 đường ống an toàn có tên là spiped . 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 chuyên dụng, tương tự như một tunnel SSH 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.

Spiped là gì?

Tiện ích spiped rất dễ cài đặt và cấu hình để giao tiếp an toàn giữa hai socket mạng (cổng mạng thông thường hoặc socket Unix). Nó được dùng để cấu hình giao tiếp được mã hóa giữa hai server từ xa. Máy khách kết nối với một cổng local và spiped bọc nó trong mã hóa trước khi chuyển tiếp nó đến server từ xa. Về phía server , spiped lắng nghe trên 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 spiped là:

  • Ubuntu duy trì các gói cho spiped trong repository lưu trữ mặc định của nó.
  • Dự án Redis hiện đang đề xuất sử dụng spiped để mã hóa lưu lượng.
  • Cấu hình đơn giản và trực quan.
  • Một đường ống 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).
  • Không có tập lệnh init đi kèm, vì vậy một tập lệnh phải được tạo để tự động tạo các kết nối cần thiết khi khởi động.

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

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 output
PONG

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 spiped .

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 spiped trên mỗi máy tính

Tiếp theo, bạn cần cài đặt spiped trên từng server và client . 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 install spiped

Bây giờ ta đã cài đặt phần mềm cần thiết, ta có thể tạo một khóa an toàn mà spiped có thể sử dụng để mã hóa lưu lượng giữa hai máy của ta .

Tạo khóa mã hóa trên server Redis

Tiếp theo, tạo folder cấu hình spiped trong /etc trên server Redis của bạn để lưu trữ khóa mà ta sẽ tạo để mã hóa:

  • sudo mkdir /etc/spiped

Tạo khóa an toàn bằng lệnh :

  • sudo dd if=/dev/urandom of=/etc/spiped/redis.key bs=32 count=1

Hạn chế quyền truy cập vào file khóa đã tạo bằng cách điều chỉnh các quyền:

  • sudo chmod 600 /etc/spiped/redis.key

Bây giờ ta có khóa có sẵn trên server Redis, ta có thể cài đặt spiped trên server bằng cách sử dụng file đơn vị systemd.

Tạo file đơn vị systemd cho server Redis

Tiện ích spiped rất đơn giản và nó không hỗ trợ đọc file cấu hình. Vì mỗi đường ống phải được cấu hình theo cách thủ công, gói Ubuntu không đi kèm với tập lệnh init để khởi động đường ống tự động khi khởi động.

Để giải quyết những vấn đề này, ta sẽ tạo một file đơn vị systemd đơn giản. Mở một file đơn vị mới trong folder /etc/systemd/system để bắt đầu:

  • sudo nano /etc/systemd/system/spiped-receive.service

Bên trong, hãy tạo phần [Unit] để mô tả thiết bị và cài đặt thứ tự để thiết bị này được khởi động sau khi có mạng:

/etc/systemd/system/spiped-receive.service
[Unit] Description=spiped receive for Redis Wants=network-online.target After=network-online.target 

Tiếp theo, mở phần [Service] để xác định lệnh thực sự để chạy. Ta sẽ sử dụng các tùy chọn sau với spiped :

  • -F : Chạy phía trước. Hệ thống systemd init được thiết kế để quản lý các dịch vụ đang chạy ở chế độ nền khi có thể. Chạy ở phía trước đơn giản hóa cấu hình yêu cầu.
  • -d : Giải mã lưu lượng từ socket nguồn. Điều này cho spiped biết hướng mã hóa để nó biết để giải mã lưu lượng từ nguồn và mã hóa lưu lượng từ đích.
  • -s : Điều này xác định socket nguồn. Địa chỉ IP phải nằm trong dấu ngoặc vuông sau dấu hai chấm rồi đến cổng. Đối với server Redis, điều này phải được đặt thành địa chỉ IP công cộng và cổng Redis.
  • -t : Ổ cắm đích. Đây là nơi lưu lượng truy cập sẽ được chuyển tiếp đến sau khi giải mã. Redis lắng nghe cổng 6379 trên server local theo mặc định, vì vậy đó là những gì ta phải sử dụng.
  • -k : Chỉ định file khóa để sử dụng. Điều này sẽ trỏ đến khóa mã hóa mà ta đã tạo trước đó.

Tất cả các tùy chọn này sẽ đi trong một chỉ thị ExecStart duy nhất, đây là mục duy nhất ta cần trong phần này:

/etc/systemd/system/spiped-receive.service
[Unit] Description=spiped receive for Redis Wants=network-online.target After=network-online.target  [Service] ExecStart=/usr/bin/spiped -F -d -s [redis_server_public_IP]:6379 -t [127.0.0.1]:6379 -k /etc/spiped/redis.key 

Cuối cùng, ta sẽ bao gồm một phần [Install] để cho systemd biết thời điểm tự động khởi động thiết bị nếu được bật:

/etc/systemd/system/spiped-receive.service
[Unit] Description=spiped receive for Redis Wants=network-online.target After=network-online.target  [Service] ExecStart=/usr/bin/spiped -F -d -s [redis_server_public_IP]:6379 -t [127.0.0.1]:6379 -k /etc/spiped/redis.key  [Install] WantedBy=multi-user.target 

Khi bạn hoàn tất, hãy lưu file .

Khởi động Dịch vụ spiped và Điều chỉnh Tường lửa trên Server Redis

Bắt đầu và kích hoạt đơn vị spiped mới bằng lệnh :

  • sudo systemctl start spiped-receive.service
  • sudo systemctl enable spiped-receive.service

Nếu bạn kiểm tra các dịch vụ đang lắng nghe các kết nối trên server Redis của bạn , bạn sẽ thấy tính spiped lắng nghe được spiped trên cổng 6379 trên giao diện công cộng. 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 output
Active 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/spiped 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ù spiped đ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 spiped đang nghe. Cổng spiped chỉ chấp nhận truy cập được mã hóa.

Chuyển khóa mã hóa cho client

Để chuyển khóa mã hóa cho client , ta cần cài đặt kết nối an toàn giữa hai server của bạn . Ta sẽ sử dụng ssh vì điều này cho phép ta tận dụng cấu hình hiện có của bạn .

Nếu bạn đang sử dụng xác thực dựa trên khóa, bạn cần chuyển tiếp SSH key của bạn đến server Redis để cài đặt kết nối. Điều này không cần thiết đối với các hệ thống dựa trên password .

Các bước bổ sung để xác thực dựa trên khóa

Ngắt kết nối khỏi server Redis của bạn:

  • exit

Bây giờ, trên máy local của bạn, hãy đảm bảo tác nhân SSH đang chạy và private key của bạn đã được thêm vào đó:

  • eval `ssh-agent`
  • ssh-add

Bây giờ, kết nối lại với server Redis của bạn và thêm cờ -A để chuyển tiếp khóa của bạn:

  • ssh -A sammy@redis_server_public_IP

Đến đây bạn có thể tiếp tục với các bước bên dưới.

Chuyển khóa

Ta sẽ kết nối từ server Redis đến client vì file khóa của ta yêu cầu quyền sudo local để truy cập. Bây giờ ta có thể chuyển file , đảm bảo bao gồm dấu hai chấm ở cuối lệnh bên dưới:

  • sudo -E scp /etc/spiped/redis.key sammy@redis_client_public_IP:

scp để ghi vào folder chính của user của bạn trên client .

Sau khi chuyển khóa, hãy tạo folder /etc/spiped trên client :

  • sudo mkdir /etc/spiped

Di chuyển khóa mã hóa vào folder mới:

  • sudo mv ~/redis.key /etc/spiped

Khóa các quyền để hạn chế quyền truy cập:

  • sudo chmod 600 /etc/spiped/redis.key

Bây giờ client đã có bản sao khóa mã hóa của server , ta có thể cấu hình phía client của cấu hình spiped .

Tạo file đơn vị systemd cho khách hàng Redis

Ta cần tạo một file đơn vị systemd cho spiped ở phía client giống như ta đã làm trên server Redis.

Mở file đơn vị systemd mới bằng lệnh :

  • sudo nano /etc/systemd/system/spiped-send.service

Bên trong, hãy mở phần [Unit] để mô tả dịch vụ và xác nhận dịch vụ phụ thuộc vào tính khả dụng của mạng:

/etc/systemd/system/spiped-send.service
[Unit] Description=spiped sending for Redis Wants=network-online.target After=network-online.target 

Tiếp theo, mở phần [Service] để thực hiện quá trình spiped . Các tùy chọn được sử dụng ở đây rất giống với các tùy chọn được sử dụng trên server Redis, với những điểm khác biệt sau:

  • -e : Chỉ định rằng lưu lượng truy cập vào socket nguồn cần được mã hóa. Điều này cài đặt mối quan hệ giữa nguồn và socket đích.
  • -s : Xác định socket nguồn, giống như trước đây. Tuy nhiên, trong trường hợp này, nguồn là một cổng khả dụng tùy ý trên giao diện local nơi ứng dụng client Redis local có thể kết nối với.
  • -t : Xác định socket đích, giống như trước đây. Đối với client , đây sẽ là địa chỉ IP công cộng của server Redis từ xa và cổng đã được mở.

Chúng sẽ được cài đặt lại bằng chỉ thị ExecStart :

/etc/systemd/system/spiped-send.service
[Unit] Description=spiped sending for Redis Wants=network-online.target After=network-online.target  [Service] ExecStart=/usr/bin/spiped -F -e -s [127.0.0.1]:8000 -t [redis_server_public_IP]:6379 -k /etc/spiped/redis.key 

Cuối cùng, bao gồm phần [Install] để xác định thời điểm thiết bị sẽ được khởi động nếu được bật:

/etc/systemd/system/spiped-send.service
[Unit] Description=spiped sending for Redis Wants=network-online.target After=network-online.target  [Service] ExecStart=/usr/bin/spiped -F -e -s [127.0.0.1]:8000 -t [redis_server_public_IP]:6379 -k /etc/spiped/redis.key  [Install] WantedBy=multi-user.target 

Khi bạn hoàn tất, hãy lưu file .

Khởi động Dịch vụ spiped trên Máy khách và Kiểm tra Kết nối

Bây giờ, ta có thể bắt đầu dịch vụ spiped của spiped trên client và cho phép nó tự động khởi động khi server khởi động :

  • sudo systemctl start spiped-send.service
  • sudo systemctl enable spiped-send.service

Kiểm tra xem tunnel trên client đã được cài đặt đúng cách chưa:

  • sudo netstat -plunt
Redis client output
Active 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 3264/spiped tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1705/sshd tcp6 0 0 :::22 :::* LISTEN 1705/sshd

Như bạn thấy , spiped đ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 output
PONG

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 output
Error: Protocol error, got "\xac" as reply type byte

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 spiped trên client mới
  • Chuyển khóa mã hóa cho client mới
  • Sao chép file đơn vị hệ thống spiped sang client mới
  • Khởi động dịch vụ spiped và cho phép nó khởi động khi server khởi động

Để 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à spiped
  • Tạo khóa mã hóa mới cho server Redis mới (sử dụng tên duy nhất cho file )
  • Sao chép khóa mã hóa từ server này sang server kia vào folder /etc/spiped
  • Tạo file đơn vị hệ thống spiped trên mỗi server (bao gồm cả các server hiện có) để mỗi server có một file phục vụ cho từng role :

    • Tệp đơn vị nhận ánh xạ một cổng bên ngoài tới Redis local
    • Một file đơn vị gửi ánh xạ một cổng local đến 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).

Nếu cần, nhiều file đơn vị khách 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 trong đặc tả socket nguồn trong file đơn vị gửi.

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 tunnel bằng tunnel hoặc cài đặt VPN .


Tags:

Các tin liên quan

Cách mã hóa lưu lượng truy cập vào Redis với Stunnel trên Ubuntu 16.04
2016-11-08
Cách mã hóa lưu lượng truy cập vào Redis với PeerVPN trên Ubuntu 16.04
2016-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