Thứ tư, 30/09/2020 | 00:00 GMT+7

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 :

/etc/redis/redis.conf
. . .  # 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:

Output
PONG

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:

/etc/redis.conf
. . . 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:

/etc/redis.conf
. . . 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:

/etc/redis.conf
. . . # 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:

/etc/redis.conf
. . . 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:

Output
OK

Sau đó, chạy lại lệnh trước đó sẽ thành công:

  • set key1 10
Output
OK

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:

/etc/redis.conf
# 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:

/etc/redis.conf
# 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
Output
OK

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
Output
1) "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:

/etc/redis.conf
. . .  # 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
Output
drwxr-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
Output
total 40 drwxrwx---. 2 redis redis 22 Sep 30 20:15 redis
  • ls -l /etc/redis.conf
Output
total 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 .


Tags:

Các tin liên quan

Cách cài đặt và bảo mật Redis trên CentOS 7
2020-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