Thứ tư, 12/08/2020 | 00:00 GMT+7

Cách kết nối với Phiên bản Redis được Quản lý qua TLS với Stunnel và redis-cli

Phiên bản Redis được quản lý có thể cung cấp các lợi ích như tính khả dụng cao và cập nhật tự động. Tuy nhiên, khi nào bạn thực hiện kết nối với server database từ xa, bạn đều có nguy cơ bị các phần tử độc hại đánh hơi thông tin nhạy cảm mà bạn gửi đến server đó.

redis-cli , giao diện dòng lệnh Redis, không hỗ trợ các kết nối qua TLS , một giao thức mật mã cho phép truyền thông an toàn qua mạng. Điều này nghĩa là nếu không có cấu hình thêm, redis-cli không phải là cách an toàn để kết nối với server Redis từ xa. Một cách để cài đặt kết nối an toàn tới cá thể Redis được quản lý là tạo một đường hầm sử dụng giao thức TLS.

Stunnel là một proxy nguồn mở được sử dụng để tạo các tunnel an toàn, cho phép bạn giao tiếp với các máy khác qua TLS. Trong hướng dẫn này, ta sẽ hướng dẫn cài đặt và cấu hình stunnel để bạn có thể kết nối với version Redis được quản lý qua TLS với redis-cli .

Yêu cầu

Để hoàn thành hướng dẫn này, bạn cần :

  • Truy cập vào server Ubuntu 18.04. Server này phải có user không phải root có quyền quản trị và firewall được cấu hình bằng ufw . Để cài đặt điều này, hãy làm theo hướng dẫn cài đặt server ban đầu của ta cho Ubuntu 18.04 .
  • Một version database Redis được quản lý. Các bước được nêu trong hướng dẫn này đã được thử nghiệm trên Database DigitalOcean Managed Redis, mặc dù chúng thường hoạt động đối với database được quản lý từ bất kỳ nhà cung cấp cloud nào. Để cung cấp Database DigitalOcean Managed Redis, hãy làm theo tài liệu sản phẩm Managed Redis của ta .

Bước 1 - Cài đặt Stunnel và redis-cli

Khi bạn cài đặt server Redis, nó thường được đóng gói với redis-cli . Tuy nhiên, bạn có thể cài đặt redis-cli mà không cần server Redis bằng cách cài đặt gói redis-tools từ repository mặc định của Ubuntu. Bạn cũng có thể cài đặt stunnel từ repository mặc định của Ubuntu bằng cách download gói stunnel4 .

Trước tiên, hãy cập nhật index gói của server của bạn nếu gần đây bạn chưa làm như vậy:

  • sudo apt update

Sau đó cài đặt các redis-toolsstunnel4 với APT:

  • sudo apt install redis-tools stunnel4

Khi được yêu cầu , hãy nhấn ENTER để xác nhận bạn muốn cài đặt các gói.

Bạn có thể kiểm tra xem stunnel đã được cài đặt đúng cách hay chưa và dịch vụ systemd của nó đang hoạt động bằng cách chạy lệnh sau:

  • sudo systemctl status stunnel4
Output
● stunnel4.service - LSB: Start or stop stunnel 4.x (TLS tunnel for network daemons) Loaded: loaded (/etc/init.d/stunnel4; generated) Active: active (exited) since Thu 2019-09-12 14:34:05 UTC; 8s ago Docs: man:systemd-sysv-generator(8) Tasks: 0 (limit: 2362) CGroup: /system.slice/stunnel4.service Sep 12 14:34:05 stunnel systemd[1]: Starting LSB: Start or stop stunnel 4.x (TLS tunnel for network daemons)... Sep 12 14:34:05 stunnel stunnel4[2034]: TLS tunnels disabled, see /etc/default/stunnel4 Sep 12 14:34:05 stunnel systemd[1]: Started LSB: Start or stop stunnel 4.x (TLS tunnel for network daemons).

Tại đây, bạn có thể thấy rằng dịch vụ tunnel đang hoạt động, mặc dù quá trình này đã thoát ngay lập tức. Điều này cho ta biết rằng tunnel đang chạy, nhưng nó không thể thực sự làm bất cứ điều gì vì ta chưa cấu hình nó.

Bước 2 - Cấu hình tunnel

Các hệ thống Linux hiện đại dựa trên systemd để khởi tạo và quản lý các dịch vụ và daemon. Tuy nhiên, stunnel sử dụng tập lệnh init kiểu SysV, dựa trên hệ thống init UNIX System V cũ hơn, để khởi động. Bạn cần sửa đổi file /etc/default/stunnel4 để kích hoạt tập lệnh init này.

Mở file này bằng editor bạn muốn . Ở đây, ta sẽ sử dụng nano :

  • sudo nano /etc/default/stunnel4

Tìm tùy chọn ENABLED ở gần đầu file . Nó sẽ được đặt thành 0 theo mặc định, nhưng hãy thay đổi điều này thành 1 để cho phép tunnel bắt đầu khi server khởi động :

/ etc / default / stunnel4
# /etc/default/stunnel # Julien LEMOINE <speedblue@debian.org> # September 2003  # Change to one to enable stunnel automatic startup ENABLED=1 . . . 

Lưu và đóng file . Nếu bạn đã sử dụng nano để chỉnh sửa file , hãy làm như vậy bằng cách nhấn CTRL+X , Y , sau đó ENTER .

Tiếp theo, bạn cần tạo một file cấu hình cho stunnel, file này sẽ cho chương trình biết nơi nó cần định tuyến lưu lượng.

Mở một file mới có tên stunnel.conf trong folder /etc/stunnel :

  • sudo nano /etc/stunnel/stunnel.conf

Thêm nội dung sau vào file này:

/etc/stunnel/stunnel.conf
fips = no setuid = nobody setgid = nogroup pid = /home/sammy/pids/stunnel.pid debug = 7 delay = yes [redis-cli]   client = yes   accept = 127.0.0.1:8000   connect = managed_redis_hostname_or_ip:managed_redis_port 

Năm dòng đầu tiên trong file là các tùy chọn chung , nghĩa là chúng sẽ áp dụng cho mọi dịch vụ bạn đưa vào file này:

  • fips : Bật hoặc tắt chế độ FIPS 140-2 của tunnel . Trong chế độ này, stunnel sẽ xác nhận kết nối đáp ứng Tiêu chuẩn xử lý thông tin liên bang . Đặt thành no tắt tính năng này. Lưu ý việc tắt tính năng này không phải là kém an toàn hơn, nhưng việc giữ nó được bật (theo mặc định) sẽ yêu cầu một số cấu hình bổ sung.
  • setuid : Xác định ID user Unix mà theo đó stunnel sẽ chạy. Theo mặc định, quy trình tunnel do user root sở hữu. Tuy nhiên, tài liệu về tunnel khuyên bạn nên bỏ các quyền quản trị khi tunnel bắt đầu, vì không làm như vậy sẽ gây ra rủi ro bảo mật. Đặt tham số setuid thành nobody sẽ khiến không ai , user không có quyền , có quyền sở hữu quá trình tunnel sau khi tunnel được cài đặt .
  • setgid : Xác định ID group Unix mà theo đó stunnel sẽ chạy. Như với setuid , cấu hình này chỉ định một group không có bất kỳ quyền đặc biệt nào - nogroup - để tránh mọi vấn đề bảo mật tiềm ẩn.
  • pid : Xác định vị trí file nơi stunnel sẽ tạo file .pid , một loại file chứa PID của quy trình. .pid file .pid thường được các chương trình khác sử dụng để tìm PID của một quá trình đang chạy. Theo mặc định, stunnel tạo ra một .pid file trong /var/run/stunnel4/ folder nhưng vì user không ai không có quyền truy cập folder đó, nó sẽ ngăn chặn các tunnel từ khi bắt đầu một cách chính xác. Thay vào đó, dòng này chỉ định một file có tên stunnel.pid được giữ trong một folder có tên là pids trong folder chính của user Ubuntu. Ta sẽ tạo folder này và file stunnel.pid trong thời gian ngắn. Khi bạn thêm dòng này, hãy đảm bảo thay đổi sammy thành tên của user hệ thống Ubuntu của bạn.
  • debug : Đặt mức gỡ lỗi của stunnel, có thể nằm trong repository ảng từ 0 đến 7 . Trong ví dụ này, ta sẽ đặt nó thành 7 , mức cao nhất hiện có, vì điều đó sẽ cung cấp thông tin chi tiết nhất nếu stunnel gặp sự cố nào . Bạn có thể đặt nó ở bất kỳ mức nào bạn thích, nhưng lưu ý cài đặt mặc định là 5 .
  • delay : Khi được đặt thành yes , tùy chọn này khiến stunnel trì hoãn việc tra cứu DNS cho địa chỉ được liệt kê trong tùy chọn connect . Nó cũng sẽ ngăn stunnel khỏi bộ nhớ đệm các địa chỉ IP. Cài đặt này sẽ giúp giữ cho tunnel mở ngay cả khi version Redis được quản lý offline , như có thể xảy ra khi mở rộng cụm của bạn.

Các dòng còn lại là các tùy chọn mức dịch vụ và chỉ áp dụng cho tunnel mà ta sẽ tạo cho redis-cli :

  • [redis-cli] : Đây là tên dịch vụ và chỉ định rằng các dòng sau đại diện cho một cấu hình dịch vụ riêng lẻ cho một client . Bạn có thể có nhiều dịch vụ trong file cấu hình kênh, mặc dù mỗi dịch vụ phải được liên kết với một ứng dụng client hiện có và bạn không thể có hai dịch vụ cho cùng một ứng dụng.
  • client : Đặt giá trị này thành yes yêu cầu stunnel chạy ở chế độ client , nghĩa là stunnel sẽ kết nối với server TLS (phiên bản Redis được quản lý) thay vì hoạt động như một server TLS.
  • accept : Xác định server và cổng mà trên đó stunnel sẽ chấp nhận các kết nối từ client . Ở đây, ta chỉ định địa chỉ IP 127.0.0.1 , là địa chỉ lặp lại IPv4 được sử dụng để đại diện cho localhost và cổng 8000 . Điều này nghĩa là stunnel sẽ lắng nghe các kết nối bắt nguồn từ server Ubuntu trên cổng 8000 và mã hóa chúng. Lưu ý bạn có thể đặt cổng thành bất kỳ số cổng nào bạn thích miễn là nó chưa được sử dụng.
  • connect : Xác định địa chỉ từ xa và cổng mà tunnel sẽ thực hiện kết nối. Đảm bảo thay đổi tham số này để phù hợp với cổng và tên server hoặc địa chỉ IP của database được quản lý của bạn.

Lưu ý: Tên server hoặc địa chỉ IP và cổng bạn nên chỉ định trong chỉ thị connect sẽ dành riêng cho database Redis được quản lý của bạn . Chúng thường có thể được tìm thấy trong giao diện user quản lý database của nhà cung cấp dịch vụ cloud của bạn, nơi bạn đã cấp phép version Redis của bạn .

Nếu bạn đang sử dụng Database DigitalOcean Managed Redis, bạn có thể tìm thấy thông tin này bằng cách đi tới Control panel và nhấp vào Database trong menu thanh bên bên trái. Sau đó, nhấp vào tên của version Redis bạn muốn kết nối và cuộn xuống phần Chi tiết kết nối . Ở đó, bạn sẽ tìm thấy các trường mô tả server cổng database của bạn.

Đây là một cấu hình khá tối thiểu để lại nhiều cài đặt mặc định của stunnel. Chương trình có sẵn nhiều tùy chọn để bạn tạo tunnel phù hợp với nhu cầu cụ thể của bạn . Xem tài liệu chính thức để biết thêm chi tiết.

Sau khi thêm nội dung này, hãy lưu file .

Tiếp theo, hãy đảm bảo bạn đang ở trong folder chính của user Ubuntu:

  • cd

Sau đó, tạo folder pids sẽ chứa file stunnel.pid :

  • mkdir pids

Quá trình stunnel sẽ tự động tạo file stunnel.pid , vì vậy bạn không cần phải tự tạo file . Tuy nhiên, bạn cần phải thay đổi quyền sở hữu folder pids thành không ai dùng và group nogroup :

  • sudo chown -R nobody:nogroup pids/

Sau đó, khởi động lại dịch vụ stunnel4 để stunnel sẽ đọc file cấu hình mới:

  • sudo systemctl restart stunnel4

Sau đó, bạn có thể kiểm tra xem stunnel đã tạo thành công một tunnel hay chưa bằng cách gọi netstat , một tiện ích dòng lệnh được sử dụng để hiển thị các kết nối mạng. Chạy lệnh sau, lệnh này chuyển kết quả netstat thành grep , lần lượt tìm kiếm nó cho mọi trường hợp của stunnel :

  • sudo netstat -plunt | grep stunnel
Output
tcp 0 0 127.0.0.1:8000 0.0.0.0:* LISTEN 17868/stunnel

Kết quả này cho thấy rằng stunnel đang lắng nghe các kết nối trên cổng local 8000 .

Bạn cũng có thể xác nhận không ai là user có quyền sở hữu quá trình stunnel bằng ps , một chương trình hiển thị tất cả các quy trình hiện đang chạy:

  • ps aux | grep stunnel
Output
nobody 15674 0.0 0.1 121912 3180 ? Ssl 19:28 0:00 /usr/bin/stunnel4 /etc/stunnel/stunnel.conf . . .

Ở đây, bạn có thể thấy rằng không ai thực sự tiếp quản quá trình tunnel .

Stunnel hiện đã được cấu hình đầy đủ và đang chạy trên hệ thống. Bạn đã sẵn sàng kết nối với version Redis được quản lý của bạn và kiểm tra xem tunnel có hoạt động như mong đợi hay không.

Bước 3 - Kết nối với database được quản lý của bạn qua TLS

Đến đây bạn đã cài đặt redis-cli và cấu hình stunnel trên server của bạn , bạn đã sẵn sàng kết nối với database được quản lý của bạn qua TLS.

Dựa trên cài đặt được xác định trong file cấu hình được tạo ở Bước 2, bạn sẽ kết nối với database được quản lý của bạn bằng lệnh sau:

  • redis-cli -h localhost -p 8000

Lệnh này bao gồm cờ -h , cho redis-cli biết rằng đối số tiếp theo sẽ là server để kết nối. Trong trường hợp này, đó là localhost vì ta đang kết nối với một tunnel được tạo local trên server . Sau đó là cờ -p , trước cổng của tunnel local mà ta đang kết nối, trong trường hợp này là cổng 8000 .

Sau khi chạy lệnh đó, bạn sẽ được kết nối với server Redis được quản lý của bạn . Dấu nhắc của bạn sẽ thay đổi để phản ánh rằng bạn đã kết nối và đang ở chế độ tương tác của redis-cli :

Lưu ý: Thông thường, database được quản lý được cấu hình để yêu cầu user xác thực bằng password khi họ kết nối. Nếu version Redis được quản lý của bạn yêu cầu password , bạn có thể đưa cờ -a vào lệnh redis-cli , sau đó là password của bạn:

  • redis-cli -h localhost -p 8000 -a password

Ngoài ra, bạn có thể xác thực bằng cách chạy lệnh auth theo sau là password của bạn sau khi cài đặt kết nối:

  • auth password

Nếu bạn đang sử dụng Dịch vụ database DigitalOcean, bạn có thể tìm thấy password của version Redis của bạn ở cùng nơi bạn đã tìm thấy tên server và cổng của nó. Trong Control panel của bạn, nhấp vào Database trong menu thanh bên bên trái. Sau đó, nhấp vào tên của version Redis mà bạn đã kết nối. Cuộn xuống phần Chi tiết kết nối và ở đó bạn sẽ tìm thấy một trường có nhãn mật khẩu . Nhấp vào nút hiển thị để hiển thị password , sau đó copy paste nó vào một trong các lệnh này - thay thế password - để xác thực.

Bạn có thể kiểm tra xem tunnel có hoạt động như mong đợi hay không bằng cách chạy lệnh ping từ chế độ tương tác của Redis:

  • ping

Nếu kết nối còn hoạt động, nó sẽ trả về PONG :

Output
PONG

Tuy nhiên, nếu stunnel không truyền lưu lượng truy cập từ server đến version Redis của bạn một cách chính xác, bạn có thể thấy thông báo lỗi như thế này trước khi bị ngắt kết nối khỏi Redis:

Output
Error: Server closed the connection

Nếu bạn nhận được lỗi này hoặc lỗi tương tự, hãy kiểm tra lại xem bạn đã nhập đúng tên server và cổng của version Redis vào file stunnel.conf của bạn chưa. Tương tự như vậy, hãy đảm bảo bạn đã nhập đúng số cổng trong lệnh redis-cli .

Bạn cũng có thể gặp lỗi này khi cá thể Redis được quản lý đặt lại các kết nối đang mở của nó, điều này có thể xảy ra khi bạn mở rộng cấu hình cụm của bạn . Trong những trường hợp như vậy, bạn có thể không bị ngắt kết nối khỏi Redis, mặc dù bạn cần xác thực lại.

Khi bạn đã xác nhận tunnel đang hoạt động, hãy tiếp tục và ngắt kết nối khỏi version Redis của bạn:

  • exit

Nếu bạn từng thay đổi cấu hình của stunnel, bạn cần reload hoặc khởi động lại dịch vụ stunnel4 để stunnel sẽ nhận thấy những thay đổi:

  • sudo systemctl reload stunnel4

Nếu tại bất kỳ thời điểm nào trong tương lai bạn muốn đóng tunnel TLS, bạn cũng có thể làm như vậy với systemctl :

  • sudo systemctl stop stunnel4

Sau khi tunnel đóng lại, bạn có thể mở lại tunnel bằng cách bắt đầu lại dịch vụ:

  • sudo systemctl start stunnel4

Đến đây bạn đã cấu hình thành công stunnel, bạn đã sẵn sàng để bắt đầu thêm dữ liệu vào version Redis được quản lý của bạn bằng redis-cli .

Kết luận

Stunnel là một công cụ tiện dụng để tạo tunnel TLS và cài đặt kết nối an toàn tới các server từ xa. Điều này đặc biệt hữu ích trong trường hợp việc vận chuyển an toàn thông tin giữa các máy là rất quan trọng, như với database từ xa.

Từ đây, bạn có thể bắt đầu khám phá Redis và tích hợp nó với ứng dụng tiếp theo của bạn . Nếu bạn mới làm việc với Redis, bạn có thể thấy loạt bài của ta về Cách quản lý database Redis hữu ích.


Tags:

Các tin liên quan

Cách kết nối với database Redis
2020-06-26
Cách cài đặt và bảo mật Redis trên Ubuntu 20.04
2020-05-01
Cách cài đặt và bảo mật Redis trên Ubuntu 20.04 [Quickstart]
2020-05-01
Cách cài đặt và bảo mật Redis trên Ubuntu 18.04
2020-04-30
Cách di chuyển dữ liệu Redis với sao chép trên Ubuntu 18.04
2019-12-04
Cách thêm Sidekiq và Redis vào ứng dụng Ruby on Rails
2019-11-22
Cách quản lý các bộ được sắp xếp trong Redis
2019-11-22
Cách hết hạn khóa trong Redis
2019-10-08
Cách quản lý bản sao và khách hàng trong Redis
2019-10-08
Cách thực hiện giao dịch trong Redis
2019-10-01