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

Tác giả Network Engineer, T.Mười 25, 2021, 12:26:26 SÁNG

« Chủ đề trước - Chủ đề tiếp »

0 Thành viên và 1 Khách đang xem chủ đề.

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


Redis là một 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 rãi. 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ủ Ubuntu 20.04.

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

1. Cài đặt và cấu hình Redis.

Mình sẽ sử dụng trình quản lý gói APT để cài đặt redis từ kho lưu trữ chính thức của Ubuntu. Phiên bản có sẵn trong kho lưu trữ mặc định là 5.0.7.

Bắt đầu bằng cách cập nhật hệ thống của bạn qua apt

Mã nguồn [Chọn]
$ sudo apt update
Sau đó cài đặt Redis bằng cách gõ:

Mã nguồn [Chọn]
$ sudo apt install redis-server
Thao tác này sẽ tải xuống và cài đặt Redis và các phụ thuộc của nó.

Sau đây, có một thay đổi cấu hình quan trọng cần thực hiện trong tập tin cấu hình Redis, tập tin này được tạo tự động trong quá trình cài đặt.

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

Mã nguồn [Chọn]
$ sudo nano /etc/redis/redis.conf
Bên trong tập tin, tìm thẻ supervised. 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ó. Thẻ supervised được thiết lập no theo mặc định. Vì bạn đang chạy Ubuntu, sử dụng hệ thống systemd init, hãy thay đổi điều này thành systemd.

Mã nguồn [Chọn]
. . .

# 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 tin 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 các tập tin, làm như vậy bằng cách nhấn CTRL + X, Y rồi ENTER.

Sau đó, khởi động lại dịch vụ Redis để áp dụng những thay đổi bạn đã thực hiện đối với tập tin cấu hình.

Mã nguồn [Chọn]
$ sudo systemctl restart redis.service
Với điều đó, bạn đã cài đặt và cấu hình Redis và nó đang chạy trên máy của bạn. Tuy nhiên, trước khi bắt đầu sử dụng, trước tiên bạn nên kiểm tra xem Redis có hoạt động chính xác hay không.

2. Kiểm tra Redis.

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

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

Mã nguồn [Chọn]
$ 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:

Mã nguồn [Chọn]
● redis-server.service - Advanced key-value store
     Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2020-04-30 23:26:54 UTC; 4s ago
       Docs: http://redis.io/documentation,
             man:redis-server(1)
    Process: 36552 ExecStart=/usr/bin/redis-server /etc/redis/redis.conf (code=exited, status=0/SUCCESS)
   Main PID: 36561 (redis-server)
      Tasks: 4 (limit: 2345)
     Memory: 1.8M
     CGroup: /system.slice/redis-server.service
             └─36561 /usr/bin/redis-server 127.0.0.1:6379


Tại đâ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.

Lưu ý: Cài đặt này phù hợp 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 Redis theo cách thủ công mỗi khi máy chủ của bạn khởi động, bạn có thể cấu hình điều này bằng lệnh sau.

Mã nguồn [Chọn]
$ sudo systemctl disable redis
Để kiểm tra xem Redis có hoạt động chính xác hay không, hãy kết nối với máy chủ bằng ứng dụng dòng lệnh redis-cli của Redis.

Mã nguồn [Chọn]
$ redis-cli
Trong dấu nhắc sau đó, hãy kiểm tra kết nối bằng lệnh ping.

Mã nguồn [Chọn]
$ ping

PONG

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

Mã nguồn [Chọn]
$ set test "It's working!"

OK

Lấy giá trị mà chúng ta vừa đặt bằng cách gõ lệnh sau.

Mã nguồn [Chọn]
$ get test
Giả sử mọi thứ đang hoạt động, bạn sẽ có thể truy xuất giá trị mà bạn đã lưu trữ.

Mã nguồn [Chọn]
"It's working!"
Sau khi xác nhận rằng bạn có thể tìm nạp giá trị, hãy thoát khỏi lời nhắc Redis để quay lại trình cửa sổ dòng lệnh SSH:

Mã nguồn [Chọn]
$ exit
Là bài kiểm tra cuối cùng, mình sẽ kiểm tra xem Redis có thể duy trì dữ liệu ngay cả sau khi nó bị dừng lại 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 dịch vụ Redis.

Mã nguồn [Chọn]
$ sudo systemctl restart redis
Sau đó kết nối lại với cửa sổ dòng lệnh redis-cli của Redis.

Mã nguồn [Chọn]
$ redis-cli
Và xác nhận rằng giá trị thử nghiệm đặt lúc nãy của bạn vẫn có sẵn.

Mã nguồn [Chọn]
$ get test
Nếu giá trị của khóa của bạn vẫn có thể truy cập được thì sẽ có kết quả như sau.
 
Mã nguồn [Chọn]
"It's working!"
Thoát ra khỏi cửa sổ dòng lệnh redis-cli của Redis một lần nữa khi bạn hoàn thành.

Mã nguồn [Chọn]
$ exit
3. Liên kết với localhost.

Theo mặc định, Redis chỉ có thể truy cập được từ localhost. Tuy nhiên, nếu bạn đã cài đặt và 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 tin cấu hình để cho phép kết nối từ mọi nơi. Điều này là không an toàn như chỉ có phép truy cập từ localhost.

Để sửa lỗi này, hãy mở tập tin cấu hình Redis để chỉnh sửa như sau.

Mã nguồn [Chọn]
$ sudo nano /etc/redis/redis.conf
Xác định vị trí dòng này và đảm bảo rằng nó không bị tắt bắng cách bỏ đi dấu # nếu nó tồn tại.

Mã nguồn [Chọn]
bind 127.0.0.1 ::1
Lưu và đóng tập tin khi hoàn tất bằng cách nhấn CTRL + X, Y rồi ENTER. Sau đó, khởi động lại dịch vụ Redis để đảm bảo rằng systemd đọc các thay đổi của bạn.

Mã nguồn [Chọn]
$ sudo systemctl restart redis
Để kiểm tra xem thay đổi này đã có hiệu lực chưa, hãy chạy lệnh netstat như sau.

Mã nguồn [Chọn]
$ sudo netstat -lnp | grep redis

tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      14222/redis-server 
tcp6       0      0 ::1:6379                :::*                    LISTEN      14222/redis-server 


Lưu ý: Lệnh netstat này có thể không có sẵn trên hệ thống của bạn theo mặc định. Nếu đúng như vậy, bạn có thể cài đặt nó cùng với một số công cụ mạng tiện dụng khác bằng lệnh sau.

Mã nguồn [Chọn]
$ sudo apt install net-tools
Kết quả này cho thấy dịch vụ Redis được liên kết với localhost (127.0.0.1), phản ánh sự thay đổi bạn vừa thực hiện đối với tập tinh cấu hình. Nếu bạn thấy một địa chỉ IP khác trong cột đó (ví dụ 0.0.0.0), thì bạn nên kiểm tra lại xem bạn đã bỏ ghi chú đúng dòng chính xác chưa và khởi động lại dịch vụ Redis.

Bây giờ cài đặt Redis của bạn chỉ đang lắng nghe trên localhost, sẽ khó khăn hơn cho các tác nhân độc hại đưa ra yêu cầu hoặc giành quyền truy cập vào máy chủ của bạn.

Tuy nhiên, Redis hiện không được thiết lập để yêu cầu người dùng xác thực bản thân trước khi thực hiện các 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 cửa sổ dòng lệnh redis-cli của Redis.

4. Cấu hình 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ó là lệnh auth, 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, vì vậy hãy mở lại tập tin đó bằng trình chỉnh sửa ưa thích của bạn.

Mã nguồn [Chọn]
$ sudo nano /etc/redis/redis.conf
Cuộn đến phần SECURITY và tìm kiếm một thẻ đang bị tắt có nội dung như sau.

Mã nguồn [Chọn]
# requirepass foobared
Bỏ ghi chú bằng cách xóa dấu # và thay đổi foobared bằng một mật khẩu an toàn.

Lưu ý: Phía trên thẻ requirepass trong tập tin redis.conf có một cảnh báo đã bị tắt.

Mã nguồn [Chọn]
# 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.
#

Vì vậy, điều quan trọng là bạn phải 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 thủ công, bạn có thể sử dụng lệnh openssl để tạo một mật khẩu ngẫu nhiên, như trong ví dụ sau.

Bằng cách nối đầu ra của lệnh đầu tiên với lệnh thứ hai openssl, 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 đó.

Mã nguồn [Chọn]
$ openssl rand 60 | openssl base64 -A
Đầu ra của bạn sẽ giống như sau.
       
Mã nguồn [Chọn]
RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE
Sau khi sao chép và dán đầu ra của lệnh đó làm giá trị mới của requirepass, nó sẽ như sau.
 
Mã nguồn [Chọn]
requirepass RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE
Sau khi đặt mật khẩu, hãy lưu và đóng tập tin, sau đó khởi động lại dịch vụ Redis.

Mã nguồn [Chọn]
$ sudo systemctl restart redis.service
Để kiểm tra xem mật khẩu mà bạn vừa thiết lập có hoạt động hay không, hãy mở cửa sổ dòng lệnh redis-cli của Redis.

Mã nguồn [Chọn]
$ redis-cli
Sau đây là 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 thành một giá trị nào đó trước khi xác thực.

Mã nguồn [Chọn]
$ 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.

Mã nguồn [Chọn]
(error) NOAUTH Authentication required
Lệnh tiếp theo xác thực bằng mật khẩu được thiết lập trong tập tin cấu hình của Redis.

Mã nguồn [Chọn]
$ auth your_redis_password

OK

Kết quả OK nghĩa là Redis chấp nhận cho đăng nhập. Sau đó, chạy lại lệnh trước đó sẽ thành công.

Mã nguồn [Chọn]
$ set key1 10

OK

Sử dụng lệnh get key1 để truy vấn Redis cho giá trị của khóa mới.

Mã nguồn [Chọn]
$ get key1
 
"10"

Sau khi xác nhận rằng bạn có thể chạy các lệnh trong cửa sổ dòng lệnh redis-cli của Redis sau khi xác thực, bạn có thể thoát khỏi cửa sổ dòng lệnh redis-cli của Redis.

Mã nguồn [Chọn]
$ exit
Tiếp theo, chúng ta sẽ xem xét việc đổi tên các lệnh mặc định của Redis, nếu nhập nhầm hoặc do tác nhân độc hại, có thể gây ra thiệt hại nghiêm trọng cho máy chủ của bạn.

5. Đổi tên các lệnh nguy hiểm của Redis.

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 một số lệ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 sạch dữ liệu của bạn.

Giống như mật khẩu xác thực, các lệnh đổi tên hoặc tắt được cấu hình trong cùng một phần SECURITY của tập tin /etc/redis/redis.conf.

Một số các lệnh được coi là nguy hiểm bao gồm: FLUSHDB, FLUSHALL, KEYS, PEXPIRE, DEL, CONFIG, SHUTDOWN, BGREWRITEAOF, BGSAVE, SAVE, SPOP, SREM, RENAMEDEBUG. Đây không phải là 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 để tăng cường bảo mật cho máy chủ Redis của bạn.

Việc bạn nên tắt hay đổi tên lệnh tùy thuộc vào nhu cầu cụ thể của bạn hoặc nhu cầu của trang web của bạn. Nếu bạn biết rằng bạn sẽ không bao giờ sử dụng một trong các 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ó.

Để đổi tên hoặc tắt các lệnh mặc định của Redis, hãy mở tập tin cấu hình của Redis một lần nữa.

Mã nguồn [Chọn]
$ sudo nano /etc/redis/redis.conf
Cảnh báo: Các bước sau đây chỉ ra cách tắt 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 phù hợp 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ị sử dụng sai tại   Đăng nhập để xem liên kết.

Để vô hiệu hóa một lệnh, chỉ cần đổi tên nó thành một chuỗi trố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ư được hiển thị bên dưới.

Mã nguồn [Chọ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 ""


Để đổi tên một lệnh, hãy đặt cho nó một tên khác như thể hiện 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.

Mã nguồn [Chọn]
# rename-command CONFIG ""
rename-command SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG

Lưu các thay đổi và đóng tập tin lại.

Sau khi đổi tên một lệnh, hãy áp dụng thay đổi bằng cách khởi động lại dịch vụ Redis.

Mã nguồn [Chọn]
$ sudo systemctl restart redis.service
Để kiểm tra các lệnh mới, hãy mở cửa sổ dòng lệnh redis-cli của Redis.

Mã nguồn [Chọn]
$ redis-cli
Sau đó, xác thực bằng mật khẩu mà chúng ta đã thiết lập trước đó.

Mã nguồn [Chọn]
$ auth your_redis_password
     
OK

Giả sử rằng bạn đã đổi tên lệnh CONFIG thành ASC12_CONFIG như trong ví dụ trên đây. Trước tiên, hãy thử sử dụng lệnh gốc của nó là CONFIG. Nó sẽ không thành công, bởi vì bạn đã đổi tên nó.

Mã nguồn [Chọn]
$ config get requirepass
Kết quả trả về lỗi như sau.
     
Mã nguồn [Chọn]
(error) ERR unknown command `config`, with args beginning with:
Tuy nhiên, việc gọi lệnh mới mà chúng ta đã đổi tên sẽ thành công. Nó không phân biệt chữ hoa và chữ thường.

Mã nguồn [Chọn]
$ asc12_config get requirepass

1) "requirepass"
2) "your_redis_password"

Cuối cùng, bạn có thể thoát ra khỏi cửa sổ dòng lệnh redis-cli của Redis.

Mã nguồn [Chọn]
$ exit
Lưu ý rằng nếu bạn đang sử dụng dòng lệnh của Redis và sau đó khởi động lại dịch vụ Redis thì bạn sẽ cần xác thực với mật khẩu lại. Nếu không, bạn sẽ gặp lỗi này nếu nhập lệnh.

Mã nguồn [Chọn]
NOAUTH Authentication required.
Về thực hành đổi tên các lệnh, có một tuyên bố cảnh báo ở cuối phần SECURITY trong tập tin /etc/redis/redis.conf đó có nội dung:

Mã nguồn [Chọn]
# Please note that changing the name of commands that are logged into the
# AOF file or transmitted to replicas may cause problems.

Lưu ý: Dự án Redis chọn sử dụng các thuật ngữ "master" và "slave".  Điều đó có nghĩa là nếu lệnh được đổi tên không có trong tập tin AOF hoặc nếu có nhưng tập tin AOF chưa được truyền tới các slave thì sẽ không có vấn đề gì.

Vì vậy, hãy ghi nhớ điều đó khi bạn đang cố gắng đổ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, tức 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à 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 tới slave 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 phiên bản không có cùng cách đổi tênthì 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 slave.

Do đó, 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 rằng các lệnh đã đổi tên được áp dụng cho tất cả các trường hợp trong cài đặt master-slave.

Trong hướng dẫn này, bạn đã cài đặt và cấu hình dịch vụ Redis, xác thực rằng cài đặt Redis của bạn đang hoạt động chính xác và sử dụng các tính năng bảo mật tích hợp của nó để làm cho nó ít bị tấn công hơn 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 dành riêng cho dịch vụ Redis mà chúng ta đã áp dụng. 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 đã cấu hình nếu bạn làm theo hướng dẫn thiết lập máy chủ Ubuntu từ ban đầu, vì điều này sẽ khiến các tác nhân độc hại cực kỳ khó có thể nhảy qua tường lửa đó.