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-tools và stunnel4 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/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:
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ànhnotắ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ốsetuidthànhnobodysẽ 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ớisetuid, 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..pidfile.pidthườ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.pidfile 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ênstunnel.pidđược giữ trong một folder có tên làpidstrong folder chính của user Ubuntu. Ta sẽ tạo folder này và filestunnel.pidtrong thời gian ngắn. Khi bạn thêm dòng này, hãy đảm bảo thay đổisammythà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đến7. Trong ví dụ này, ta sẽ đặt nó thành7, 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ànhyes, 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ọnconnect. 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ànhyesyê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- 8000và 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  và 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.
Các tin liên quan
Cách kết nối với database Redis2020-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 quản lý các bộ được sắp xếp trong Redis
2019-11-22
Cách thêm Sidekiq và Redis vào ứng dụng Ruby on Rails
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
 

