Thứ ba, 08/11/2016 | 00:00 GMT+7

Cách mã hóa lưu lượng truy cập vào Redis với PeerVPN 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 định tuyến nó thông qua một chương trình VPN đơn giản được gọi là PeerVPN. Tất cả lưu lượng giữa các server có thể được định tuyến qua VPN một cách an toàn. Không giống như một số giải pháp, điều này cung cấp một giải pháp linh hoạt cho giao tiếp chung từ server đến server mà không bị ràng buộc với một cổng hoặc dịch vụ cụ thể. Tuy nhiên, với mục đích của hướng dẫn này, ta sẽ tập trung vào việc cấu hình PeerVPN đảm bảo lưu lượng Redis. 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.

PeerVPN là gì?

PeerVPN là một công nghệ VPN cực kỳ đơn giản cài đặt cấu trúc liên kết lưới. Điều này nghĩa là không có server trung tâm luôn phải sẵn sàng để phân xử giao tiếp giữa các node . Điều này lý tưởng cho các tình huống mà bạn muốn cài đặt một môi trường tin cậy giữa các bên mà không cần cấu hình lại bất kỳ thứ gì trên các server hiện có. Tất cả lưu lượng giữa các node có thể được mã hóa thông qua VPN và cả hai dịch vụ và firewall đều có thể được cấu hình để chỉ chấp nhận lưu lượng trên giao diện VPN.

Một số lợi thế của việc sử dụng PeerVPN là:

  • Cấu hình đơn giản và trực quan. Không giống như nhiều VPN, PeerVPN có thể được cài đặt với rất ít công việc và nó không yêu cầu server trung tâm.
  • Một giải pháp mục đích chung cho giao tiếp mạng được mã hóa. Không giống như một số tùy chọn tunnel , VPN cung cấp một mạng an toàn cho bất kỳ lưu lượng nào . Giao tiếp được mã hóa chỉ phải được cấu hình một lần và có thể sử dụng được bởi tất cả các dịch vụ.
  • Chỉ cần một kết nối duy nhất để giao tiếp giữa server với server . Không giống như các giải pháp tunnel , chỉ cần một cấu hình để hai server Redis có thể giao tiếp.

Một số nhược điểm là:

  • Ubuntu hiện không có gói cho PeerVPN trong repository lưu trữ mặc định.
  • 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 PeerVPN.

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

Tiếp theo, bạn cần cài đặt PeerVPN trên từng server và client . Như đã đề cập ở trên, Ubuntu hiện không bao gồm các gói PeerVPN trong repository của nó.

May mắn là trang web của dự án bao gồm một file binary được biên dịch cho Linux trong phần Download . Nhấp chuột phải và sao chép liên kết cho file binary Linux được liên kết tĩnh trên trang đó đảm bảo bạn có version mới nhất.

Trên mỗi máy của bạn, hãy chuyển vào /tmp và sau đó sử dụng curl để download liên kết bạn đã sao chép:

  • cd /tmp
  • curl -LO https://peervpn.net/files/peervpn-0-044-linux-x86.tar.gz

Extract tarball đã download bằng lệnh :

  • tar xzvf peervpn*

Sao chép file binary vào folder /usr/local/bin và file cấu hình ví dụ vào folder /etc :

  • sudo cp /tmp/peervpn*/peervpn /usr/local/bin
  • sudo cp /tmp/peervpn*/peervpn.conf /etc

PeerVPN hiện đã được cài đặt trên hệ thống và sẵn sàng sử dụng.

Cấu hình Mạng PeerVPN

Với file thực thi và file cấu hình ở đúng vị trí của chúng, ta có thể cấu hình PeerVPN trên mỗi máy của bạn .

Tạo khóa bí mật an toàn

PeerVPN sử dụng bí mật được chia sẻ lên đến 512 ký tự để xác thực các máy hợp lệ với mạng. Điều quan trọng là sử dụng các giá trị mạnh để bảo vệ tính toàn vẹn của lưu lượng mạng của bạn. Vì đây là bí mật được chia sẻ nên ta chỉ cần tạo ra một giá trị cho mạng của bạn ( ta sẽ sử dụng server Redis để thực hiện việc này, nhưng bạn chọn cái nào không quan trọng).

Một cách dễ dàng để tạo ra một bí mật mạnh mẽ về độ dài tối đa là với OpenSSL. Kiểm tra xem nó đang tạo ra kết quả bằng hoặc dưới 512 ký tự với wc (bạn có thể điều chỉnh 382 trong lệnh này để ảnh hưởng đến độ dài kết quả ):

  • openssl rand -base64 382 | tr -d '\n' | wc
Redis server output
0 1 512

Nếu độ dài là chính xác, hãy xóa wc để tạo ra một bí mật entropy cao. Ta sẽ thêm một echo vào cuối để đưa vào một dòng mới cuối cùng:

  • openssl rand -base64 382 | tr -d '\n' && echo

Bạn sẽ thấy thông tin như thế này (không sao chép giá trị bên dưới!) :

Redis server output
ajHpYYMJYtv+m0K6yZbYmk8npPujlcv9QDozQZ06ucV2gsHoMGqyfd50X8OnY6hicj5iFNjDN/9QVTB3nhMOV2ufU/kfWCbtskUuk1zHWYZsvy71KnLRhA8W8dnu+NEKdIh28H2qUsiay7On5kOZPcrONvv/pHHYbxmFI2G9TyYT+CZWIAxUV/vUWl41VycjASmZYaSI6lWgYONopncNfDF5Z6oznPH8ge6sQsszbe1ZjNqLRUrx/jgL3fy7SXSLCIrsSuifBv/pb36d9/y+YPZEbxsMInoK5QEWrpIf/xjbMFlndtGc20olhh05h66qz/GiimLMivrN8g+PibVaBRUmWav/pngUvKYsEEPSc0wrr5ZuvpvBGTTKqPdR+soCnd/iWPzmwRBW56vBGxed3GNbkgmjDpTSnvNEN+gKPt07drHSbGqfFbdMdsKbjE+IWiqiVO1aviJsNpMhBO/o9uIcKxPmuze6loZKTh7/qjJuY62E//SsgFzDHDhP2w==

Sao chép kết quả đã tạo của bạn để bạn có thể sử dụng nó trong cấu hình PeerVPN của bạn .

Xác cấu hình PeerVPN

Để cấu hình PeerVPN, hãy mở file /etc/peervpn.conf trên mỗi server :

  • sudo nano /etc/peervpn.conf

Bên trong, bạn sẽ tìm thấy các comment mô tả từng tùy chọn cấu hình. Vui lòng đọc những điều này để làm quen với các cài đặt có sẵn. Cấu hình của ta sẽ rất đơn giản. Bạn có thể thêm các dòng cấu hình vào đầu file hoặc tìm, bỏ ghi chú và xác định các dòng thích hợp trong các chú thích trong toàn bộ file .

Bắt đầu bằng cách đặt networknamepsk , cả hai phải giống nhau trên mỗi máy trong VPN của bạn. Tên mạng là mã định danh tùy ý cho mạng cụ thể này, trong khi psk là bí mật được chia sẻ trước đó:

/etc/peervpn.conf
networkname RedisNet psk your_generated_secret 

Tiếp theo, đặt rõ ràng port mà PeerVPN có thể sử dụng để kết nối với các đồng nghiệp để ta có thể điều chỉnh firewall của bạn một cách dễ dàng ( ta sẽ sử dụng 7000 trong hướng dẫn này). Đặt enabletunneling để máy này là một phần hoạt động của mạng. Đặt tên cho interface mạng sẽ hiển thị trong các công cụ như ipifconfig .

/etc/peervpn.conf
networkname RedisNet psk your_generated_secret  port 7000 enabletunneling yes interface peervpn0 

Bạn cần phải chọn kích thước mạng VPN và chỉ định một địa chỉ IP VPN duy nhất cho mỗi server bằng cách sử dụng lệnh ifconfig4 . Điều này được thực hiện bằng cách sử dụng ký hiệu CIDR . Ta sẽ định nghĩa mạng VPN là 10.8.0.0/24. Điều này sẽ cung cấp cho ta 254 địa chỉ tiềm năng (nhiều hơn những gì ta cần), tất cả đều bắt đầu bằng 10.8.0. Vì mỗi địa chỉ phải là duy nhất, ta sẽ sử dụng:

  • 10.8.0.1/24 cho server Redis của ta
  • 10.8.0.2/24 cho server khách hàng của ta

Cuối cùng, sử dụng initpeers để chỉ định các server khác sẽ nằm trong mạng. Vì PeerVPN không sử dụng server quản lý tập trung nên các server này sẽ được liên hệ trong quá trình khởi tạo để tham gia vào mạng VPN. Sau khi kết nối, server sẽ tự động nhận thông tin về bất kỳ đồng nghiệp bổ sung nào trên mạng.

Peer phải được chỉ định bằng cách sử dụng địa chỉ IP công cộng của họ ( không phải địa chỉ IP VPN được chỉ định trong cấu hình PeerVPN) và cổng lắng nghe PeerVPN. Các đồng nghiệp bổ sung có thể được chỉ định trên cùng một dòng, cũng được phân tách bằng dấu cách (xem các chú thích trong file để biết ví dụ):

/etc/peervpn.conf
networkname RedisNet<^> psk your_generated_secret  port 7000 enabletunneling yes interface peervpn0  # Increment the IP address below for each additional server # For example, the second node on the network could be 10.8.0.2/24 ifconfig4 10.8.0.1/24 initpeers other_server_public_IP 7000 

Lưu file khi bạn hoàn tất. Cả hai máy của bạn phải có các file cấu hình rất giống nhau, chỉ khác nhau về giá trị ifconfig4initpeers .

Tạo file đơn vị systemd cho PeerVPN

Để quản lý PeerVPN như một dịch vụ và khởi động mạng của ta khi khởi động, ta sẽ tạo một file đơn vị systemd. Mở một file đơn vị mới trong folder /etc/systemd/system trên mỗi máy để bắt đầu:

  • sudo nano /etc/systemd/system/peervpn.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/peervpn.service
[Unit] Description=PeerVPN network service 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. Ở đây, ta chỉ cần sử dụng ExecStart để gọi peervpn binary peervpn và trỏ nó vào file cấu hình mà ta đã tạo:

/etc/systemd/system/peervpn.service
[Unit] Description=PeerVPN network service Wants=network-online.target After=network-online.target  [Service] ExecStart=/usr/local/bin/peervpn /etc/peervpn.conf 

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/peervpn.service
[Unit] Description=PeerVPN network service Wants=network-online.target After=network-online.target  [Service] ExecStart=/usr/local/bin/peervpn /etc/peervpn.conf  [Install] WantedBy=multi-user.target 

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

Khởi động Dịch vụ PeerVPN và Điều chỉnh Tường lửa

Khởi động và kích hoạt đơn vị peervpn mới trên cả hai máy bằng lệnh :

  • sudo systemctl start peervpn.service
  • sudo systemctl enable peervpn.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 của bạn , bạn sẽ thấy PeerVPN đang lắng nghe trên cổng 7000 cho cả giao diện IPv4 và IPv6 (nếu có):

  • sudo netstat -plunt
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:6379 0.0.0.0:* LISTEN 2662/redis-server 1 tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1724/sshd tcp6 0 0 :::22 :::* LISTEN 1724/sshd udp 0 0 0.0.0.0:7000 0.0.0.0:* 4609/peervpn udp6 0 0 :::7000 :::* 4609/peervpn

Mặc dù PeerVPN đ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. Ta cần cho phép lưu lượng truy cập đến cổng 7000 nơi PeerVPN đang lắng nghe các kết nối, cũng như lưu lượng truy cập từ chính mạng 10.8.0.0/24:

  • sudo ufw allow 7000
  • sudo ufw allow from 10.8.0.0/24

Điều này sẽ mở ra quyền truy cập vào cổng 7000 trên giao diện công khai của bạn nơi PeerVPN đang lắng nghe. Nó cũng sẽ cho phép lưu lượng truy cập tự do từ VPN.

Kiểm tra xem bạn có thể truy cập server khác của bạn bằng địa chỉ IP VPN hay không. Ví dụ: từ server Redis của bạn, có thể chạy lệnh:

  • ping 10.8.0.2

Bạn có thể kết nối mà không gặp sự cố.

Điều chỉnh Cài đặt Server Redis

Bây giờ, VPN đã được cài đặt , ta cần điều chỉnh các giao diện mà Redis đang lắng nghe. Theo mặc định, Redis chỉ liên kết với giao diện local .

Mở file cấu hình Redis trên server Redis:

  • sudo nano /etc/redis/redis.conf

Bên trong, hãy tìm kiếm chỉ thị bind , hiện sẽ được đặt thành 127.0.0.1. Nối địa chỉ IP VPN của server Redis vào cuối:

/etc/redis/redis.conf
. . . bind 127.0.0.1 10.8.0.1 . . . 

Lưu file khi bạn hoàn tất.

Bây giờ, hãy khởi động lại dịch vụ Redis bằng lệnh :

  • sudo systemctl restart redis-server.service

Dịch vụ Redis bây giờ sẽ khả dụng cho các kết nối từ các đồng nghiệp VPN. Bạn có thể xác minh điều này bằng cách kiểm tra lại các cổng nghe:

  • 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 10.8.0.1:6379 0.0.0.0:* LISTEN 4767/redis-server 1 tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 4767/redis-server 1 tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1724/sshd tcp6 0 0 :::22 :::* LISTEN 1724/sshd udp 0 0 0.0.0.0:7000 0.0.0.0:* 4609/peervpn udp6 0 0 :::7000 :::* 4609/peervpn

Bạn có thể thấy ở dòng trên cùng trong ví dụ này Redis hiện đang lắng nghe giao diện VPN.

Kiểm tra kết nối từ Redis Client

Với việc VPN đang chạy và Redis lắng nghe trên mạng VPN, ta có thể kiểm tra đảm bảo rằng client Redis của ta có thể truy cập server Redis.

Để làm như vậy, hãy trỏ khách hàng của bạn đến địa chỉ IP VPN của server Redis bằng cách sử dụng tùy chọn -h :

  • redis-cli -h 10.8.0.1 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 -h 10.8.0.1 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.

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, điều này có thể dễ dàng mở rộng để phù hợp với các tương tác phức tạp hơn.

Vì PeerVPN sử dụng mạng lưới nên việc thêm client hoặc server bổ sung rất đơn giản. Đồng đẳng mới phải hoàn thành các bước sau:

  • Cài đặt PeerVPN bằng cách download tarball, sau đó extract và phân phối các file
  • Sao chép cấu hình PeerVPN từ các server khác và điều chỉnh các chỉ thị sau:

    • ifconfig4 phải được đặt thành địa chỉ IP không sử dụng trong mạng VPN
    • initpeers nên trỏ đến ít nhất một, nhưng tốt nhất là mọi đồng đẳng hiện có
  • Sao chép file đơn vị hệ thống PeerVPN sang client mới

  • Khởi động dịch vụ PeerVPN và cho phép nó khởi động khi server khởi động

  • Mở cổng bên ngoài và mạng VPN trong firewall

  • (Chỉ dành cho server Redis) Điều chỉnh cấu hình Redis để liên kết với giao diện VPN mớ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 cấu hình một tunnel được mã hóa với stunnel hoặc spiped .


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