Cách cài đặt và bảo mật Redis trên CentOS 8
Redis là một repository dữ liệu key-value trong bộ nhớ open-souce , vượt trội về khả năng lưu vào bộ nhớ đệm. Một database không quan hệ, Redis được biết đến với tính linh hoạt, hiệu suất, khả năng mở rộng và hỗ trợ ngôn ngữ rộng.Redis được thiết kế để sử dụng bởi các khách hàng tin cậy trong một môi trường tin cậy và không có các tính năng bảo mật mạnh mẽ của riêng nó. Tuy nhiên, Redis có một vài tính năng bảo mật như password cơ bản không được mã hóa cũng như đổi tên và tắt lệnh. Hướng dẫn này cung cấp hướng dẫn về cách cài đặt Redis và cấu hình các tính năng bảo mật này. Nó cũng bao gồm một số cài đặt khác có thể tăng cường bảo mật cho cài đặt Redis độc lập trên CentOS 8.
Lưu ý hướng dẫn này không giải quyết các tình huống trong đó server Redis và các ứng dụng client nằm trên các server khác nhau hoặc trong các trung tâm dữ liệu khác nhau. Các cài đặt trong đó lưu lượng Redis phải đi qua một mạng không an toàn hoặc không tin cậy sẽ yêu cầu một bộ cấu hình khác, chẳng hạn như cài đặt proxy SSL hoặc VPN giữa các máy Redis.
Yêu cầu
 Để hoàn thành hướng dẫn này, bạn  cần  một  server  chạy CentOS 8.  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 firewalld . Để  cài đặt  điều này, hãy làm theo hướng dẫn  Cài đặt   Server  Ban đầu cho CentOS 8 của  ta .
Bước 1 - Cài đặt và khởi động Redis
 Bạn có thể cài đặt Redis bằng trình quản lý gói DNF. Lệnh sau sẽ cài đặt Redis, các phụ thuộc của nó và nano , một editor  thân thiện với  user . Bạn không phải cài đặt nano , nhưng  ta  sẽ sử dụng nó trong các ví dụ xuyên suốt hướng dẫn này:
- sudo dnf install redis nano 
Lệnh này sẽ nhắc bạn  xác nhận  bạn muốn cài đặt các gói đã chọn. Nhấn y rồi nhấn ENTER  để thực hiện :
Output. . .  Total download size: 1.5 M Installed size: 5.4 M Is this ok [y/N]: y Sau đây, có một thay đổi cấu hình quan trọng cần thực hiện trong file cấu hình Redis, file này được tạo tự động trong quá trình cài đặt.
 Mở file  này bằng editor   bạn muốn . Ở đây  ta  sẽ sử dụng nano :
- sudo nano /etc/redis/redis.conf 
Bên trong file , tìm chỉ thị được supervised . Chỉ thị này cho phép bạn khai báo một hệ thống init để quản lý Redis như một dịch vụ, cung cấp cho bạn nhiều quyền kiểm soát hơn đối với hoạt động của nó. Chỉ thị được supervised được đặt thành no theo mặc định. Vì bạn đang chạy CentOS, sử dụng hệ thống systemd init, hãy thay đổi điều này thành systemd :
. . .  # If you run Redis from upstart or systemd, Redis can interact with your # supervision tree. Options: #   supervised no      - no supervision interaction #   supervised upstart - signal upstart by putting Redis into SIGSTOP mode #   supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET #   supervised auto    - detect upstart or systemd method based on #                        UPSTART_JOB or NOTIFY_SOCKET environment variables # Note: these supervision methods only signal "process is ready." #       They do not enable continuous liveness pings back to your supervisor. supervised systemd  . . . Đó là thay đổi duy nhất bạn cần thực hiện đối với file  cấu hình Redis tại thời điểm này, vì vậy hãy lưu và đóng nó khi bạn hoàn tất. 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 .
Sau khi chỉnh sửa file , hãy khởi động dịch vụ Redis:
- sudo systemctl start redis.service 
Nếu bạn muốn Redis  bắt đầu khi server khởi động , bạn có thể kích hoạt nó bằng lệnh enable :
- sudo systemctl enable redis 
 Lưu ý  lệnh này không bao gồm hậu tố .service sau tên file  đơn vị. Bạn thường có thể bỏ hậu tố này khỏi các lệnh systemctl , vì nó thường được ngụ ý khi tương tác với systemd.
Bạn có thể kiểm tra trạng thái của Redis bằng cách chạy như sau:
- sudo systemctl status redis 
Output● redis.service - Redis persistent key-value database    Loaded: loaded (/usr/lib/systemd/system/redis.service; enabled; vendor preset: disabled)   Drop-In: /etc/systemd/system/redis.service.d            └─limit.conf    Active: active (running) since Wed 2020-09-30 20:05:24 UTC; 13s ago  Main PID: 13734 (redis-server)     Tasks: 4 (limit: 11489)    Memory: 6.6M    CGroup: /system.slice/redis.service            └─13734 /usr/bin/redis-server 127.0.0.1:6379 Khi bạn đã xác nhận Redis thực sự đang chạy, bạn có thể kiểm tra chức năng của nó bằng lệnh này:
- redis-cli ping 
Điều này sẽ in PONG dưới dạng phản hồi:
OutputPONG Nếu đúng như vậy, điều đó nghĩa là bạn đã có Redis chạy trên server của bạn và bạn có thể bắt đầu cấu hình nó để tăng cường bảo mật.
Bước 2 - Cấu hình Redis và bảo mật nó bằng Tường lửa
Một cách hiệu quả để bảo vệ Redis là bảo vệ server mà nó đang chạy. Bạn có thể thực hiện việc này bằng cách đảm bảo Redis chỉ bị ràng buộc với localhost hoặc địa chỉ IP riêng và cả server có firewall đang hoạt động.
Tuy nhiên, nếu bạn chọn cài đặt Redis bằng một hướng dẫn khác, thì bạn có thể đã cập nhật file cấu hình để cho phép kết nối từ mọi nơi. Điều này không an toàn như ràng buộc với localhost hoặc IP riêng.
Để khắc phục điều này, hãy mở lại file cấu hình Redis bằng editor bạn muốn :
- sudo nano /etc/redis.conf 
Xác định vị trí dòng bắt đầu bằng bind và  đảm bảo  nó không có chú thích:
. . . bind 127.0.0.1 Nếu bạn cần liên kết Redis với một địa chỉ IP khác (như trong trường hợp bạn sẽ truy cập Redis từ một server riêng biệt), ta đặc biệt khuyến khích bạn liên kết nó với một địa chỉ IP riêng. Liên kết với một địa chỉ IP công cộng làm tăng khả năng hiển thị giao diện Redis của bạn với các bên bên ngoài:
. . . bind your_private_ip Sau khi  xác nhận  chỉ thị bind không được  comment , bạn có thể  lưu file  .
 Nếu bạn đã làm theo hướng dẫn  Cài đặt   server  ban đầu tiên quyết và cài đặt firewalld trên  server   của bạn  và bạn không có kế hoạch kết nối với Redis từ một  server  khác, thì bạn không cần thêm bất kỳ  luật  firewall  bổ sung nào cho Redis. Sau cùng, mọi lưu lượng truy cập đến sẽ bị loại bỏ theo mặc định trừ khi được các  luật  firewall  cho phép rõ ràng. Vì cài đặt độc lập mặc định của  server  Redis chỉ lắng nghe trên giao diện loopback ( 127.0.0.1 hoặc localhost), nên không cần quan tâm đến lưu lượng đến trên cổng mặc định của nó.
 Tuy nhiên, nếu bạn dự định truy cập Redis từ một  server  khác, bạn  cần  thực hiện một số thay đổi đối với cấu hình firewalld  của bạn  bằng lệnh firewall-cmd .   , bạn chỉ nên cho phép truy cập vào  server  Redis  của bạn  từ các  server  của bạn bằng cách sử dụng địa chỉ IP riêng của chúng để hạn chế số lượng  server  mà dịch vụ của bạn được tiếp xúc.
Để bắt đầu, hãy thêm một vùng Redis dành riêng vào policy firewalld của bạn:
- sudo firewall-cmd --permanent --new-zone=redis 
Sau đó chỉ định cổng nào bạn muốn mở. Redis sử dụng cổng 6397 theo mặc định:
- sudo firewall-cmd --permanent --zone=redis --add-port=6379/tcp 
Tiếp theo, chỉ định bất kỳ địa chỉ IP riêng nào được phép vượt qua firewall và truy cập Redis:
- sudo firewall-cmd --permanent --zone=redis --add-source=client_server_private_IP 
Sau khi chạy các lệnh đó, hãy cập nhật firewall để triển khai các luật mới:
- sudo firewall-cmd --reload 
Theo cấu hình này, khi firewall  gặp một gói từ địa chỉ IP của client  của bạn, nó sẽ áp dụng các  luật  trong vùng Redis dành riêng cho kết nối đó. Tất cả các kết nối khác sẽ được xử lý bởi vùng public mặc định. Các dịch vụ trong vùng mặc định áp dụng cho mọi kết nối, không chỉ những dịch vụ không khớp rõ ràng, vì vậy bạn không cần thêm các dịch vụ khác (ví dụ: SSH) vào vùng Redis vì các  luật  đó sẽ được áp dụng tự động cho kết nối đó.
  Lưu ý  sử dụng bất kỳ công cụ firewall  nào cũng sẽ hoạt động, cho dù bạn sử dụng firewalld , ufw hay iptables . Điều quan trọng là firewall  được  cài đặt  và chạy để các cá nhân không xác định không thể truy cập vào  server  của bạn. Trong bước tiếp theo, bạn sẽ cấu hình Redis để chỉ có thể truy cập bằng password  mạnh.
Bước 3 - Cấu hình password Redis
 Việc  cấu hình  password  Redis cho phép một trong những tính năng bảo mật tích hợp của nó - lệnh auth - yêu cầu khách hàng xác thực trước khi được phép truy cập vào database . Giống như cài đặt bind , password  được  cấu hình  trực tiếp trong file  cấu hình của Redis, /etc/redis.conf . Mở lại file  đó:
- sudo nano /etc/redis.conf 
Cuộn đến phần SECURITY và tìm chỉ thị được  comment  có nội dung:
. . . # requirepass foobared Bỏ ghi chú nó bằng cách loại bỏ các # , và thay đổi foobared đến một password  rất mạnh mẽ mà bạn chọn.
 Lưu ý : Thay vì tự tạo password , bạn có thể sử dụng một công cụ như apg hoặc pwgen để tạo password . Tuy nhiên, nếu bạn không muốn cài đặt một ứng dụng chỉ để tạo password , bạn có thể sử dụng lệnh bên dưới. Lệnh này lặp lại một giá trị chuỗi và chuyển nó vào lệnh sha256sum sau, lệnh này sẽ hiển thị tổng kiểm tra SHA256 của chuỗi.
Lưu ý việc nhập lệnh này như đã viết sẽ tạo ra cùng một password mọi lúc. Để tạo một password duy nhất, hãy thay đổi chuỗi trong dấu ngoặc kép thành bất kỳ từ hoặc cụm từ nào khác:
- echo "digital-ocean" | sha256sum 
Mặc dù password  đã tạo sẽ không thể phát âm được, nhưng nó sẽ rất mạnh và dài, đây chính xác là loại password  cần thiết cho Redis. Sau khi  copy paste   kết quả  của lệnh đó làm giá trị mới cho requirepass , nó sẽ đọc:
. . . requirepass password_copied_from_output Ngoài ra, nếu bạn thích một password ngắn hơn, thay vào đó, bạn có thể sử dụng kết quả của lệnh sau. , hãy thay đổi từ trong dấu ngoặc kép để nó không tạo ra password giống như lệnh này:
- echo "digital-ocean" | sha1sum 
Sau khi đặt password , hãy lưu file , sau đó khởi động lại Redis:
- sudo systemctl restart redis 
Để kiểm tra xem password có hoạt động hay không, hãy mở ứng dụng Redis:
- redis-cli 
Sau đây là một chuỗi các lệnh được sử dụng để kiểm tra xem password Redis có hoạt động hay không. Lệnh đầu tiên cố gắng đặt khóa thành một giá trị trước khi xác thực:
- set key1 10 
Điều đó sẽ không hoạt động vì bạn chưa xác thực, vì vậy Redis trả về lỗi:
Output(error) NOAUTH Authentication required. Lệnh sau xác thực bằng password được chỉ định trong file cấu hình Redis:
- auth your_redis_password 
Redis sẽ xác nhận bạn đã được xác thực:
OutputOK Sau đó, chạy lại lệnh trước đó sẽ thành công:
- set key1 10 
OutputOK Lệnh get key1 truy vấn Redis cho giá trị của khóa mới:
- get key1 
Output"10" Lệnh cuối cùng này thoát khỏi redis-cli . Bạn cũng có thể sử dụng exit :
- quit 
Hiện tại sẽ rất khó để user lạ truy cập vào cài đặt Redis của bạn. Xin lưu ý nếu bạn đã sử dụng ứng dụng Redis và sau đó khởi động lại Redis, bạn cần phải xác thực lại. Ngoài ra, xin lưu ý không có SSL hoặc VPN, password không được mã hóa sẽ vẫn hiển thị với các bên bên ngoài nếu bạn đang kết nối với Redis từ xa.
Tiếp theo, hướng dẫn này sẽ chuyển sang đổi tên các lệnh Redis để bảo vệ Redis khỏi các tác nhân độc hại.
Bước 4 - Đổi tên các lệnh nguy hiểm
Tính năng bảo mật khác được tích hợp trong Redis cho phép bạn đổi tên hoặc vô hiệu hóa hoàn toàn một số lệnh được coi là nguy hiểm. Khi được chạy bởi user lạ , các lệnh như vậy được dùng để cấu hình lại, phá hủy hoặc xóa sạch dữ liệu . Một số lệnh được coi là nguy hiểm bao gồm:
-  FLUSHDB
-  FLUSHALL
-  KEYS
-  PEXPIRE
-  DEL
-  CONFIG
-  SHUTDOWN
-  BGREWRITEAOF
-  BGSAVE
-  SAVE
-  SPOP
-  SREM
-  RENAME
-  DEBUG
Đây không phải là một danh sách đầy đủ, nhưng việc đổi tên hoặc tắt tất cả các lệnh trong danh sách này có thể giúp cải thiện bảo mật cho kho dữ liệu . Việc bạn nên tắt hoặc đổi tên một lệnh đã cho sẽ phụ thuộc vào nhu cầu cụ thể của bạn. Nếu bạn biết bạn sẽ không bao giờ sử dụng một lệnh có thể bị lạm dụng, thì bạn có thể vô hiệu hóa nó. Nếu không, bạn nên đổi tên nó để thay thế.
 Giống như password  xác thực, các lệnh đổi tên hoặc tắt được  cấu hình  trong phần SECURITY của file  /etc/redis.conf . Để bật hoặc tắt các lệnh Redis, hãy mở file  cấu hình để chỉnh sửa   :
- sudo nano /etc/redis.conf 
LƯU Ý : Đây là những ví dụ. Bạn nên chọn tắt hoặc đổi tên các lệnh phù hợp với bạn. Bạn có thể tìm hiểu thêm về các lệnh của Redis và xác định cách chúng có thể bị sử dụng sai tại redis.io/commands .
Để tắt hoặc hủy một lệnh, hãy đổi tên nó thành một chuỗi trống, như sau:
# It is also possible to completely kill a command by renaming it into # an empty string: # rename-command FLUSHDB "" rename-command FLUSHALL "" rename-command DEBUG "" Để đổi tên một lệnh, hãy đặt cho nó một tên khác như trong các ví dụ bên dưới. Các lệnh được đổi tên sẽ khó đoán đối với người khác, nhưng dễ nhớ đối với bạn:
# It is also possible to completely kill a command by renaming it into # an empty string: # rename-command FLUSHDB "" rename-command FLUSHALL "" rename-command DEBUG "" rename-command SHUTDOWN SHUTDOWN_MENOT rename-command CONFIG ASC12_CONFIG Lưu các thay đổi và đóng file. Sau đó, áp dụng các thay đổi bằng cách khởi động lại Redis:
- sudo systemctl restart redis.service 
Để kiểm tra các lệnh mới của bạn, hãy nhập dòng lệnh Redis:
- redis-cli 
Xác thực bản thân bằng password bạn đã xác định trước đó:
- auth your_redis_password 
OutputOK Giả sử rằng bạn đã đổi tên lệnh CONFIG thành ASC12_CONFIG , việc cố gắng sử dụng lệnh config sẽ không thành công:
- config get requirepass 
Output(error) ERR unknown command 'config' Thay vào đó, gọi lệnh được đổi tên sẽ thành công. Lưu ý các lệnh Redis không phân biệt chữ hoa chữ thường:
- asc12_config get requirepass 
Output1) "requirepass" 2) "your_redis_password" Cuối cùng, bạn có thể thoát khỏi redis-cli :
- exit 
Cảnh báo : Về các lệnh đổi tên, có một cảnh báo ở cuối phần SECURITY trong file  /etc/redis.conf , có nội dung:
. . .  # Please note that changing the name of commands that are logged into the # AOF file or transmitted to slaves may cause problems.  . . . Điều này nghĩa là nếu lệnh được đổi tên không có trong file AOF hoặc nếu có nhưng file AOF chưa được truyền đến các bản sao thì sẽ không có vấn đề gì. Hãy ghi nhớ điều đó khi bạn đổi tên các lệnh. Thời điểm tốt nhất để đổi tên lệnh là khi bạn không sử dụng AOF liên tục hoặc ngay sau khi cài đặt (nghĩa là trước khi ứng dụng sử dụng Redis của bạn được triển khai).
Khi bạn đang sử dụng AOF và xử lý sao chép Redis, hãy xem xét câu trả lời này từ trang vấn đề GitHub của dự án . Sau đây là phần trả lời câu hỏi của tác giả:
Các lệnh được ghi vào AOF và được sao chép tới slaver giống như cách chúng được gửi, vì vậy nếu bạn cố gắng phát lại AOF trên một version không có cùng cách đổi tên, bạn có thể gặp phải sự mâu thuẫn vì không thể thực hiện lệnh ( tương tự đối với slaver ).
 Cách tốt nhất để xử lý việc đổi tên trong những trường hợp như vậy là  đảm bảo  các lệnh đã đổi tên được áp dụng cho version  chính cũng như mọi version  phụ trong cài đặt Redis.
Bước 5 - Đặt quyền sở hữu folder dữ liệu và quyền file
Bước này sẽ thực hiện một số thay đổi về quyền sở hữu và quyền mà bạn có thể cần thực hiện để cải thiện cấu hình bảo mật của cài đặt Redis của bạn. Điều này liên quan đến việc đảm bảo chỉ user cần truy cập Redis mới có quyền đọc dữ liệu của nó. User đó, theo mặc định, là user redis .
 Bạn có thể xác minh điều này bằng cách grep -ing cho folder  dữ liệu Redis trong một danh sách dài folder  mẹ của nó. Lệnh này và  kết quả  của nó được đưa ra bên dưới:
- ls -l /var/lib | grep redis 
Outputdrwxr-x---. 2 redis          redis            22 Sep 30 20:15 redis Đầu ra này  cho biết  folder  dữ liệu Redis thuộc sở hữu của  user  redis , với quyền truy cập thứ cấp được cấp cho  group  redis . Cài đặt quyền sở hữu này được bảo mật cũng như các quyền của folder , sử dụng ký hiệu bát phân, được đặt thành 750 .
 Nếu folder  dữ liệu Redis của bạn có các quyền không an toàn (ví dụ: nó có thể đọc được trên toàn thế giới), bạn có thể  đảm bảo  chỉ  user  Redis và  group  mới có quyền truy cập vào folder  và nội dung của nó bằng cách chạy chmod . Ví dụ sau thay đổi cài đặt quyền của folder  này thành 770 :
- sudo chmod 770 /var/lib/redis 
Quyền khác mà bạn có thể cần thay đổi là của file  cấu hình Redis. Theo mặc định, nó có một phép  file  của 640 và được sở hữu bởi root, với quyền sở hữu thứ cấp bởi  group  root:
- ls -l /etc/redis.conf 
Output-rw-r-----. 1 redis root 62344 Sep 30 20:14 /etc/redis.conf Quyền đó ( 640 )  nghĩa là  file  cấu hình Redis chỉ có thể đọc được bởi  user  redis và  group  gốc . Vì file  cấu hình chứa password  chưa được mã hóa mà bạn đã  cấu hình  ở Bước 4, redis.conf phải thuộc sở hữu của  user  redis , với quyền sở hữu thứ cấp của  group  redis . Để đặt điều này, hãy chạy lệnh sau:
- sudo chown redis:redis /etc/redis.conf 
Sau đó, thay đổi các quyền để chỉ chủ sở hữu của file mới có thể đọc và ghi vào file đó:
- sudo chmod 600 /etc/redis.conf 
Bạn có thể xác minh quyền sở hữu và quyền mới bằng cách chạy lại các ls trước đó:
- ls -l /var/lib | grep redis 
Outputtotal 40 drwxrwx---. 2 redis          redis            22 Sep 30 20:15 redis - ls -l /etc/redis.conf 
Outputtotal 40 -rw-------. 1 redis redis 62344 Sep 30 20:14 /etc/redis.conf Cuối cùng, khởi động lại Redis để áp dụng thay đổi này:
- sudo systemctl restart redis 
Như vậy, cài đặt Redis của bạn đã được bảo mật.
Kết luận
Lưu ý một khi ai đó đã đăng nhập vào server của bạn, bạn rất dễ phá vỡ các tính năng bảo mật dành riêng cho Redis mà bạn đã áp dụng. Đây là lý do tại sao tính năng bảo mật quan trọng nhất được đề cập trong hướng dẫn này là firewall , vì điều đó ngăn user không xác định đăng nhập vào server của bạn ngay từ đầu.
Nếu bạn đang cố gắng bảo mật thông tin liên lạc của Redis trên một mạng không tin cậy , bạn sẽ phải sử dụng proxy SSL, theo khuyến nghị của các nhà phát triển Redis trong hướng dẫn bảo mật chính thức của Redis .
Các tin liên quan
Cách cài đặt và bảo mật Redis trên CentOS 72020-08-26
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
2020-08-12
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
 

