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

Cách cài đặt và bảo mật Redis trên CentOS 7

Redis là một repository cấu trúc dữ liệu 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 bao gồm password không được mã hóa cơ bản và đổ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ấu hình các tính năng bảo mật này và 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 7.

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

Để làm theo hướng dẫn này, bạn cần :

Với những yêu cầu đó, ta đã sẵn sàng cài đặt Redis và thực hiện một số tác vụ cấu hình ban đầu.

Bước 1 - Cài đặt Redis

Trước khi có thể cài đặt Redis, trước tiên ta phải thêm kho lưu trữ Gói bổ sung cho Enterprise Linux (EPEL) vào danh sách gói của server . EPEL là một repository chứa một số gói phần mềm bổ trợ open-souce , hầu hết trong số đó được bảo trì bởi Dự án Fedora.

Ta có thể cài đặt EPEL bằng yum :

  • sudo yum install epel-release

Sau khi cài đặt EPEL hoàn tất, bạn có thể cài đặt Redis, bằng cách sử dụng yum :

  • sudo yum install redis -y

Quá trình này có thể mất vài phút để hoàn thành. Sau khi quá trình cài đặt kết thúc, 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

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.service
Output
● redis.service - Redis persistent key-value database Loaded: loaded (/usr/lib/systemd/system/redis.service; disabled; vendor preset: disabled) Drop-In: /etc/systemd/system/redis.service.d └─limit.conf Active: active (running) since Thu 2018-03-01 15:50:38 UTC; 7s ago Main PID: 3962 (redis-server) CGroup: /system.slice/redis.service └─3962 /usr/bin/redis-server 127.0.0.1:6379

Khi bạn đã xác nhận Redis thực sự đang chạy, hãy kiểm tra cài đặt bằng lệnh sau:

  • redis-cli ping

Điều này sẽ in PONG làm phản hồi. Nếu đúng như vậy, điều đó nghĩa là bạn hiện đã có Redis chạy trên server của bạn và ta có thể bắt đầu cấu hình nó để tăng cường bảo mật.

Bước 2 - Ràng buộc Redis và bảo mật nó bằng Firewall

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ể làm điều 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à server có firewall đang hoạt động.

Tuy nhiên, nếu bạn chọn cài đặt một cụm Redis bằng cách sử dụng hướng dẫn này , thì bạn sẽ 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ở file cấu hình Redis để chỉnh sửa:

  • sudo vi /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 

Nếu bạn đã tuân theo các yêu cầu và cài đặt firewalld trên server của bạn và bạn không định 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 nhìn thấy 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 đó.

Nếu bạn chọn cài đặt firewall bằng Iptables , bạn cần cấp cho server phụ của bạn quyền truy cập vào cổng mà Redis đang sử dụng bằng các lệnh sau:

  • sudo iptables -A INPUT -i lo -j ACCEPT
  • sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
  • sudo iptables -A INPUT -p tcp -s client_servers_private_IP/32 --dport 6397 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
  • sudo iptables -P INPUT DROP

Đảm bảo lưu các luật firewall Iptables của bạn bằng cơ chế do bản phân phối của bạn cung cấp. Bạn có thể tìm hiểu thêm về Iptables bằng cách xem qua hướng dẫn về Iptables của ta .

Lưu ý sử dụng một trong hai công cụ firewall sẽ hoạt động. Đ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, ta 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

Nếu bạn đã cài đặt Redis bằng cách sử dụng hướng dẫn Cách cấu hình Cụm Redis trên CentOS 7 , bạn nên cấu hình password cho nó. Theo quyết định của bạn, bạn có thể tạo password an toàn hơn ngay bây giờ theo phần này. Nếu bạn chưa cài đặt password , hướng dẫn trong phần này cho biết cách đặt password server database .

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 vi /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. 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ưu ý nhập lệnh này như đã viết sẽ tạo ra cùng một password mọi lúc. Để tạo password khác với password sẽ tạo, hãy thay đổi từ 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ó là một password rất mạnh và rất dài, 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 

Nếu bạn thích một password ngắn hơn, hãy sử dụng kết quả của lệnh bên dưới. , hãy thay đổi từ trong dấu ngoặc kép để nó không tạo ra cùng một password như sau:

  • echo "digital-ocean" | sha1sum

Sau khi đặt password , hãy lưu file , sau đó khởi động lại Redis:

  • sudo systemctl restart redis.service

Để kiểm tra xem password có hoạt động hay không, hãy truy cập vào dòng lệnh 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ì ta chưa được xác thực, vì vậy Redis trả về một 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 ta đã đượ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. Tuy nhiên, 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, ta sẽ xem xét việc đổi tên các lệnh Redis để bảo vệ Redis hơn nữa 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 biết 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 toàn diện, nhưng đổi tên hoặc tắt tất cả các lệnh trong danh sách đó là một điểm khởi đầu tốt.

Việc bạn tắt hay đổi tên một lệnh là tùy theo từng trang web. 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 vi /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ể kiểm tra các lệnh cho chính mình 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, chỉ cần đổi tên nó thành một chuỗi trống, như được hiển thị bên dưới:

/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
rename-command CONFIG "" rename-command SHUTDOWN SHUTDOWN_MENOT rename-command CONFIG ASC12_CONFIG 

Lưu các thay đổi và đóng file , sau đó áp dụng thay đổi bằng cách khởi động lại Redis:

  • sudo systemctl restart redis.service

Để kiểm tra lệnh mới, 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'

Việc gọi lệnh được đổi tên sẽ thành công (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

Lưu ý nếu bạn đang sử dụng dòng lệnh Redis và sau đó khởi động lại Redis, bạn cần phải xác thực lại. Nếu không, bạn sẽ gặp lỗi này nếu nhập lệnh:

Output
NOAUTH Authentication required.

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 đó 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 tới các slaver , 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ý cài đặt master-slave, 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 tất cả các trường hợp cài đặt master-slave.

Bước 5 - Đặt quyền sở hữu folder dữ liệu và quyền file

Trong bước này, ta sẽ xem xét một số thay đổi về quyền sở hữu và quyền mà bạn có thể thực hiện để cải thiện profile 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 và kết quả của nó được đưa ra bên dưới.

  • ls -l /var/lib | grep redis
Output
drwxr-xr-x 2 redis redis 4096 Aug 6 09:32 redis

Bạn có thể thấy rằng 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 là an toàn, nhưng quyền của folder (được đặt thành 755) thì không. Để đảm bảo chỉ user Redis mới có quyền truy cập vào folder và nội dung của nó, hãy thay đổi cài đặt quyền thành 770:

  • sudo chmod 770 /var/lib/redis

Quyền khác mà bạn nên thay đổi là quyền của file cấu hình Redis. Theo mặc định, nó có quyền đối với file là 644 và được sở hữu bởi root , với quyền sở hữu thứ cấp của group root :

  • ls -l /etc/redis.conf
Output
-rw-r--r-- 1 root root 30176 Jan 14 2014 /etc/redis.conf

Quyền đó (644) có thể đọc được trên toàn thế giới. Điều này gây ra vấn đề bảo mật 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, nghĩa là ta cần thay đổi quyền sở hữu và quyền của file cấu hình. Tốt nhất, nó nên thuộc sở hữu của user redis , với quyền sở hữu thứ cấp của group redis . Để làm điều đó, 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 file mới có thể đọc và / hoặc 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 sử dụng:

  • ls -l /etc/redis.conf
Output
total 40 -rw------- 1 redis redis 29716 Sep 22 18:32 /etc/redis.conf

Cuối cùng, khởi động lại Redis:

  • sudo systemctl restart redis.service

Xin chúc mừng, cài đặt Redis của bạn bây giờ sẽ an toàn hơn!

Kết luận

Lưu ý khi ai đó đã đăng nhập vào server của bạn, rất dễ dàng để phá vỡ các tính năng bảo mật dành riêng cho Redis mà ta đã á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 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
Cách quản lý bản sao và khách hàng trong Redis
2019-10-08