Giới thiệu

Redis là kho lưu trữ khóa-giá trị trong bộ nhớ được biết đến với tính linh hoạt, hiệu suất và hỗ trợ ngôn ngữ rộng. Hướng dẫn này trình bày cách cài đặt, cấu hình và bảo mật Redis trên máy chủ Debian 9.

Điều kiện tiên quyết

Để hoàn tất hướng dẫn này, bạn sẽ cần quyền truy cập vào máy chủ Debian 9 có người dùng không phải root với sudo đặc quyền và cấu hình tường lửa cơ bản. Bạn có thể thiết lập điều này bằng cách làm theo Hướng dẫn cài đặt máy chủ ban đầu.

Khi bạn đã sẵn sàng bắt đầu, hãy đăng nhập vào máy chủ của bạn với tư cách là người dùng đã bật sudo và tiếp tục bên dưới.

Bước 1 - Cài đặt và định cấu hình Redis

Để có phiên bản Redis mới nhất, chúng tôi sẽ sử dụng apt để cài đặt nó từ kho Debian chính thức.

Cập nhật địa phương của bạn apt gói bộ nhớ cache và cài đặt Redis bằng cách gõ:

sudo apt update

sudo apt install redis-server

Điều này sẽ tải xuống và cài đặt Redis và các phụ thuộc của nó. Sau đó, có một thay đổi cấu hình quan trọng cần thực hiện trong tệp cấu hình Redis, được tạo tự động trong khi cài đặt.

Mở tệp này bằng trình soạn thảo văn bản ưa thích của bạn:

sudo nano /etc/redis/redis.conf

Bên trong tệp, tìm supervised chỉ thị. 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 quyền kiểm soát nhiều hơn hoạt động của nó. Các supervised chỉ thị được đặt thành no theo mặc định. Vì bạn đang chạy Debian, sử dụng hệ thống init hệ thống, hãy thay đổi 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 tệp 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. Sau đó, tải lại tệp dịch vụ Redis để phản ánh những thay đổi bạn đã thực hiện đối với tệp cấu hình:

sudo systemctl restart redis

Cùng với đó, bạn đã cài đặt và định cấu hình Redis và nó đang chạy trên máy của bạn. Trước khi bạn bắt đầu sử dụng nó, tuy nhiên, nó là khôn ngoan để kiểm tra đầu tiên cho dù Redis hoạt động chính xác.

Bước 2 - Thử nghiệm Redis

Như với bất kỳ phần mềm mới được cài đặt nào, đó là một ý tưởng tốt để đảm bảo rằng Redis hoạt động như mong đợi trước khi thực hiện thêm bất kỳ thay đổi nào đối với cấu hình của nó. Chúng tôi sẽ đi qua một số cách để kiểm tra xem Redis có hoạt động chính xác trong bước này hay không.

Bắt đầu bằng cách kiểm tra xem dịch vụ Redis có đang chạy hay không:

sudo systemctl status redis

Nếu nó đang chạy mà không có bất kỳ lỗi nào, lệnh này sẽ tạo ra kết quả tương tự như sau:

Output● redis-server.service - Advanced key-value store
   Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2018-09-05 20:19:44 UTC; 41s ago
     Docs: http://redis.io/documentation,
           man:redis-server(1)
  Process: 10829 ExecStopPost=/bin/run-parts --verbose /etc/redis/redis-server.post-down.d (code=exited, status=0/SUCCESS)
  Process: 10825 ExecStop=/bin/kill -s TERM $MAINPID (code=exited, status=0/SUCCESS)
  Process: 10823 ExecStop=/bin/run-parts --verbose /etc/redis/redis-server.pre-down.d (code=exited, status=0/SUCCESS)
  Process: 10842 ExecStartPost=/bin/run-parts --verbose /etc/redis/redis-server.post-up.d (code=exited, status=0/SUCCESS)
  Process: 10838 ExecStart=/usr/bin/redis-server /etc/redis/redis.conf (code=exited, status=0/SUCCESS)
  Process: 10834 ExecStartPre=/bin/run-parts --verbose /etc/redis/redis-server.pre-up.d (code=exited, status=0/SUCCESS)
 Main PID: 10841 (redis-server)
    Tasks: 3 (limit: 4915)
   CGroup: /system.slice/redis-server.service
           └─10841 /usr/bin/redis-server 127.0.0.1:6379
. . .

Ở đây, bạn có thể thấy rằng Redis đang chạy và đã được kích hoạt, có nghĩa là nó được thiết lập để khởi động mỗi khi máy chủ khởi động.

Chú thích: Thiết lập này là mong muốn đối với nhiều trường hợp sử dụng phổ biến của Redis. Tuy nhiên, nếu bạn muốn khởi động lại Redis theo cách thủ công mỗi khi máy chủ khởi động, bạn có thể cấu hình bằng lệnh sau đây:

sudo systemctl disable redis 

Để kiểm tra xem Redis có hoạt động chính xác không, hãy kết nối với máy chủ bằng ứng dụng dòng lệnh:

redis-cli

Trong lời nhắc sau, kiểm tra kết nối với ping chỉ huy:

ping

OutputPONG

Đầu ra này xác nhận rằng kết nối máy chủ vẫn còn hoạt động. Tiếp theo, hãy kiểm tra xem bạn có thể đặt khóa bằng cách chạy không:

set test "It's working!"

OutputOK

Lấy giá trị bằng cách gõ:

get test

Giả sử mọi thứ đang hoạt động, bạn sẽ có thể truy xuất giá trị bạn đã lưu trữ:

Output"It's working!"

Sau khi xác nhận rằng bạn có thể tìm nạp giá trị, thoát dấu nhắc Redis để quay trở lại shell:

exit

Như một thử nghiệm cuối cùng, chúng tôi sẽ kiểm tra xem liệu Redis có thể duy trì dữ liệu ngay cả sau khi nó đã bị ngừng hoặc khởi động lại hay không. Để thực hiện việc này, trước tiên hãy khởi động lại phiên bản Redis:

sudo systemctl restart redis

Sau đó, kết nối với máy khách dòng lệnh một lần nữa và xác nhận rằng giá trị thử nghiệm của bạn vẫn có sẵn:

redis-cli

get test

Giá trị của khóa của bạn vẫn có thể truy cập được:

Output"It's working!"

Thoát ra khỏi trình bao lần nữa khi bạn kết thúc:

exit

Cùng với đó, cài đặt Redis của bạn hoạt động đầy đủ và sẵn sàng để bạn sử dụng. Tuy nhiên, một số cài đặt cấu hình mặc định của nó không an toàn và cung cấp cho các tác nhân độc hại có cơ hội tấn công và truy cập vào máy chủ của bạn và dữ liệu của máy chủ. Các bước còn lại trong hướng dẫn này bao gồm các phương pháp để giảm thiểu các lỗ hổng này, theo quy định của trang web chính thức của Redis. Mặc dù các bước này là tùy chọn và Redis sẽ vẫn hoạt động nếu bạn chọn không theo dõi chúng, đó là mạnh mẽ khuyên bạn nên hoàn thành chúng để tăng cường bảo mật cho hệ thống của bạn.

Bước 3 - Liên kết với localhost

Theo mặc định, chỉ có thể truy cập Redis từ localhost. Tuy nhiên, nếu bạn đã cài đặt và định cấu hình Redis bằng cách làm theo hướng dẫn khác với hướng dẫn này, bạn có thể đã cập nhật tệp cấu hình để cho phép kết nối từ bất kỳ đâu. Điều này không an toàn như ràng buộc với localhost.

Để sửa lỗi này, hãy mở tệp cấu hình Redis để chỉnh sửa:

sudo nano /etc/redis/redis.conf

Xác định vị trí dòng này và chắc chắn rằng nó không được chú ý (loại bỏ # nếu nó tồn tại):

/etc/redis/redis.conf

bind 127.0.0.1

Lưu và đóng tệp khi hoàn tất (nhấn CTRL + X, Y, sau đó ENTER).

Sau đó, khởi động lại dịch vụ để đảm bảo rằng systemd đọc các thay đổi của bạn:

sudo systemctl restart redis

Để kiểm tra xem thay đổi này đã có hiệu lực hay chưa, hãy chạy như sau netstat chỉ huy:

sudo netstat -lnp | grep redis

Outputtcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      10959/redis-server

Đầu ra này cho thấy rằng redis-server chương trình nhất định localhost (127.0.0.1), phản ánh thay đổi bạn vừa thực hiện đối với tệp cấu hình. Nếu bạn thấy một địa chỉ IP khác trong cột đó (0.0.0.0, ví dụ), sau đó bạn nên kiểm tra kỹ xem bạn đã bỏ dòng chính xác chưa và khởi động lại dịch vụ Redis lần nữa.

Bây giờ cài đặt Redis của bạn chỉ lắng nghe localhost, các diễn viên độc hại sẽ khó thực hiện yêu cầu hoặc có quyền truy cập vào máy chủ của bạn hơn. Tuy nhiên, Redis hiện không được thiết lập để yêu cầu người dùng tự xác thực trước khi thực hiện thay đổi đối với cấu hình của nó hoặc dữ liệu mà nó nắm giữ. Để khắc phục điều này, Redis cho phép bạn yêu cầu người dùng xác thực bằng mật khẩu trước khi thực hiện thay đổi thông qua ứng dụng Redis (redis-cli).

Bước 4 - Cấu hình một mật khẩu Redis

Cấu hình mật khẩu Redis cho phép một trong hai tính năng bảo mật tích hợp của nó - auth lệnh, yêu cầu khách hàng xác thực để truy cập cơ sở dữ liệu. Mật khẩu được cấu hình trực tiếp trong tập tin cấu hình của Redis, /etc/redis/redis.conf, do đó hãy mở lại tệp đó bằng trình chỉnh sửa ưa thích của bạn:

sudo nano /etc/redis/redis.conf

Cuộn đến SECURITY và tìm một chỉ thị nhận xét đọc:

/etc/redis/redis.conf

# requirepass foobared

Bỏ ghi chú bằng cách xóa #và thay đổi foobared vào một mật khẩu an toàn.

Chú thích: Phía trên requirepass chỉ thị trong redis.conf tệp, có cảnh báo đã nhận xét:

# Warning: since Redis is pretty fast an outside user can try up to
# 150k passwords per second against a good box. This means that you should
# use a very strong password otherwise it will be very easy to break.
#

Do đó, điều quan trọng là bạn chỉ định một giá trị rất mạnh và rất dài làm mật khẩu của mình. Thay vì tự tạo mật khẩu, bạn có thể sử dụng openssl để tạo một lệnh ngẫu nhiên, như trong ví dụ sau. Bằng cách đường ống đầu ra của lệnh đầu tiên đến lệnh thứ hai openssl lệnh, như được hiển thị ở đây, nó sẽ loại bỏ bất kỳ ngắt dòng nào được tạo ra bởi lệnh đầu tiên đó:

openssl rand 60 | openssl base64 -A

Đầu ra của bạn sẽ trông giống như sau:

OutputRBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE

Sau khi sao chép và dán đầu ra của lệnh đó làm giá trị mới cho requirepass, cần đọc:

/etc/redis/redis.confrequirepass RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE 

Sau khi thiết lập mật khẩu, hãy lưu và đóng tệp, sau đó khởi động lại Redis:

sudo systemctl restart redis.service

Để kiểm tra xem mật khẩu có hoạt động hay không, hãy truy cập vào dòng lệnh Redis:

redis-cli

Sau đây cho thấy một chuỗi các lệnh được sử dụng để kiểm tra xem mật khẩu Redis có hoạt động hay không. Lệnh đầu tiên cố gắng đặt khóa cho giá trị trước khi xác thực:

set key1 10

Điều đó sẽ không hoạt động vì bạn không xác thực, vì vậy Redis trả về lỗi:

Output(error) NOAUTH Authentication required.

Lệnh tiếp theo xác thực bằng mật khẩu được chỉ định trong tệp cấu hình Redis:

auth your_redis_password

Redis thừa nhận:

OutputOK

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

set key1 10

OutputOK

get key1 truy vấn Redis cho giá trị của khóa mới.

get key1

Output"10"

Sau khi xác nhận rằng bạn có thể chạy các lệnh trong trình khách Redis sau khi xác thực, bạn có thể thoát khỏi redis-cli:

quit

Tiếp theo, chúng ta sẽ xem xét đổi tên các lệnh Redis, nếu được nhập nhầm hoặc bởi một diễn viên độc hại, có thể gây ra thiệt hại nghiêm trọng cho máy của bạn.

Bước 5 - Đổi tên lệnh nguy hiểm

Tính năng bảo mật khác được tích hợp trong Redis liên quan đến việc đổi tên hoặc vô hiệu hóa hoàn toàn các lệnh nhất định được coi là nguy hiểm.

Khi được chạy bởi người dùng trái phép, các lệnh như vậy có thể được sử dụng để cấu hình lại, phá hủy hoặc xóa dữ liệu của bạn. Giống như mật khẩu xác thực, việc đổi tên hoặc tắt các lệnh được cấu hình giống nhau SECURITY phần của /etc/redis/redis.conf tập tin.

Một số lệnh được coi là nguy hiểm bao gồm: FLUSHDB, FLUSHALL, KEYS, PEXPIRE, DEL, CONFIG, TẮT, BGREWRITEAOF, BGSAVE, TIẾT KIỆM, SPOP, SREM, ĐỔI TÊNDEBUG. Đây không phải là một danh sách toàn diện, nhưng đổi tên hoặc vô hiệu hóa tất cả các lệnh trong danh sách đó là một điểm khởi đầu tốt để tăng cường bảo mật máy chủ Redis của bạn.

Cho dù bạn nên vô hiệu hóa hoặc đổi tên một lệnh phụ thuộc vào nhu cầu cụ thể của bạn hoặc những người trong trang web 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 có thể đổi tên nó thành sở thích của mình.

Để bật hoặc tắt các lệnh Redis, hãy mở lại tệp cấu hình:

sudo nano  /etc/redis/redis.conf

Cảnh báo: Các bước sau đây cho thấy làm thế nào để vô hiệu hóa và đổi tên lệnh là ví dụ. Bạn chỉ nên chọn tắt hoặc đổi tên các lệnh hợp lý với bạn. Bạn có thể xem lại danh sách đầy đủ các lệnh cho chính mình và xác định cách chúng có thể bị lạm dụng tại redis.io/commands.

Để vô hiệu hóa một lệnh, chỉ cần đổi tên nó thành một chuỗi rỗng (được biểu thị bằng một cặp dấu ngoặc kép không có ký tự nào giữa chúng), như hình dưới đây:

/etc/redis/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, đặt tên cho nó như trong ví dụ dưới đây. Các lệnh được đổi tên sẽ khó cho người khác đoán, nhưng dễ nhớ cho bạn:

/etc/redis/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 khi đổi tên một lệnh, áp dụng thay đổi bằng cách khởi động lại Redis:

sudo systemctl restart redis

Để kiểm tra lệnh mới, hãy nhập dòng lệnh Redis:

redis-cli

Sau đó, xác thực:

auth your_redis_password

OutputOK

Giả sử bạn đổi tên CONFIG lệnh để ASC12_CONFIG, như trong ví dụ trên. Trước tiên, hãy thử sử dụng bản gốc CONFIG chỉ huy. Nó sẽ thất bại, bởi vì bạn đã đổi tên nó:

config get requirepass

Output(error) ERR unknown command 'config'

Tuy nhiên, việc gọi lệnh được đổi tên sẽ thành công. Nó 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

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

OutputNOAUTH Authentication required.

Về việc thực hành đổi tên lệnh, có một tuyên bố cảnh báo ở cuối SECURITY phần trong /etc/redis/redis.conf mà đọc:

Please note that changing the name of commands that are logged into the AOF file or transmitted to slaves may cause problems.

Chú thích: Dự án Redis chọn sử dụng các thuật ngữ â € œmasterâ € và â € œslaveâ € trong khi DigitalOcean thường thích các mô tả thay thế. Để tránh nhầm lẫn, chúng tôi đã chọn sử dụng các thuật ngữ được sử dụng trong tài liệu Redis tại đây.

Điều đó có nghĩa nếu lệnh được đổi tên không có trong tệp AOF, hoặc nếu nó là nhưng tệp AOF chưa được truyền đến nô lệ, thì sẽ không có vấn đề gì.

Vì vậy, hãy ghi nhớ điều đó khi bạn đang cố đổi tên các lệnh. Thời gian tốt nhất để đổi tên một lệnh là khi bạn không sử dụng AOF persistence, hoặc ngay sau khi cài đặt, nghĩa là, trước khi ứng dụng Redis-using 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 cân nhắc câu trả lời này từ trang GitHub của dự án. Sau đây là câu trả lời cho câu hỏi của tác giả:

Các lệnh được ghi vào AOF và được sao chép sang slave giống như cách chúng được gửi đi, vì vậy nếu bạn cố gắng phát lại AOF trên một cá thể không có cùng tên, bạn có thể gặp phải sự mâu thuẫn khi lệnh không thể thực hiện được ( tương tự cho nô lệ).

Vì vậy, cách tốt nhất để xử lý đổi tên trong các trường hợp như vậy là để đảm bảo rằng các lệnh đã đổi tên được áp dụng cho tất cả các cá thể trong các bản cài đặt chính-nô lệ.

Phần kết luận

Trong hướng dẫn này, bạn đã cài đặt và định cấu hình Redis, đã xác nhận rằng cài đặt Redis của bạn hoạt động chính xác và sử dụng các tính năng bảo mật được tích hợp sẵn để ít bị tấn công từ các tác nhân độc hại.

Hãy nhớ rằng khi ai đó đăng nhập vào máy chủ của bạn, rất dễ dàng để phá vỡ các tính năng bảo mật cụ thể của Redis mà chúng tôi đã đưa ra. Do đó, tính năng bảo mật quan trọng nhất trên máy chủ Redis của bạn là tường lửa (mà bạn đã định cấu hình nếu bạn tuân theo điều kiện tiên quyết Thiết lập máy chủ ban đầu hướng dẫn), vì điều này khiến các diễn viên độc hại vô cùng khó khăn để nhảy hàng rào đó.