Redis là một kho lưu trữ khóa-giá trị trong bộ nhớ (in-memory key-value) đượ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 22.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 22.04 có người dùng không phải root
có đặc quyền sudo
và tường lửa được định cấu hình bằng ufw
.
Nội dung chính
Hướng dẫn cài đặt Redis cho Ubuntu 22.04
Bước 1 – Cài đặt và định cấu hình Redis
Chúng tôi 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. Trong bài viêt này, phiên bản có sẵn trong kho lưu trữ mặc định là 6.0.16.
Xem thêm: Redis vs Memcached WordPress: Chọn cái nào đây?
Bắt đầu bằng cách cập nhật bộ đệm ẩn gói apt
cục bộ của bạn:
1 |
sudo apt update |
Sau đó cài đặt Redis bằng cách gõ:
1 |
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 cấu hình Redis, tệp này được tạo tự động trong quá trình 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:
1 |
sudo nano /etc/redis/redis.conf |
Bên trong tệp, tìm chỉ thị được giám sát. 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 giám sát được đặt thành không 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
. . . # 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 tệp đó khi bạn hoàn tất. Nếu bạn đã sử dụng nano
để chỉnh sửa tệp, hãy làm như vậy bằng cách nhấn CTRL+X
, Y
, sau đó ENTER
.
Sau đó, khởi động lại 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:
1 |
sudo systemctl restart redis.service |
Sau đó, 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. 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ó đang hoạt động chính xác hay không.
Bước 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:
1 |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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 2022-04-20 20:40:52 UTC; 4s ago Docs: http://redis.io/documentation, man:redis-server(1) Main PID: 2899 (redis-server) Status: "Ready to accept connections" Tasks: 5 (limit: 2327) Memory: 2.5M CPU: 65ms CGroup: /system.slice/redis-server.service └─2899 "/usr/bin/redis-server 127.0.0.1:6379 . . . |
Đầu ra này cho biết 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
1 |
exit |
1 |
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 redis-cli
, ứng dụng khách dòng lệnh của Redis:
1 |
redis-cli |
Trong lời nhắc sau đó, hãy kiểm tra kết nối bằng lệnh ping:
1 |
ping |
1 2 |
Output PONG |
Đầu ra này xác nhận rằng kết nối máy chủ vẫn còn tồn tại. Tiếp theo, hãy kiểm tra xem bạn có thể đặt khóa bằng cách chạy:
1 2 3 4 5 |
set test "It's working!" -------------------------------- Output OK |
Lấy giá trị bằng cách gõ:
1 |
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ữ:
1 2 |
Output "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 bao:
1 |
exit |
Là bài kiểm tra cuối cùng, chúng tôi sẽ kiểm tra xem Redis có thể duy trì dữ liệu ngay cả khi nó đã bị dừ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:
1 |
sudo systemctl restart redis |
Sau đó kết nối lại với máy khách dòng lệnh:
1 |
redis-cli |
Và xác nhận rằng giá trị thử nghiệm của bạn vẫn có sẵn
1 |
get test |
Giá trị của khóa của bạn vẫn có thể truy cập được:
1 2 |
Output "It's working!" |
Thoát ra khỏi shell một lần nữa khi bạn hoàn thành:
1 |
exit |
Cùng với đó, cài đặt Redis của bạn đã hoạt động hoàn toàn 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à tạo cơ hội cho các tác nhân độc hại tấn công và giành quyền truy cập vào máy chủ của bạn và dữ liệu của nó. 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 bảo mật 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 làm theo chúng, nhưng bạn nên hoàn thành chúng để tăng cường bảo mật cho hệ thống của mình.
Bước 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à đị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ừ mọi nơi. Đ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:
1 |
sudo nano /etc/redis/redis.conf |
Xác định vị trí dòng này và đảm bảo nó không có chú thích (xóa #
nếu nó tồn tại):
1 2 3 |
. . . bind 127.0.0.1 ::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:
1 |
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
sau:
1 |
sudo netstat -lnp | grep redis |
Kết quả được trả về như sau:
1 2 3 |
Output 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 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:
1 |
sudo apt install net-tools |
Kết quả này cho thấy rằng chương trình redis-server
được liên kết với 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 có 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ú 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ỉ 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 ứng dụng khách Redis (redis-cli
).
Bước 4 – Định cấu hình mật khẩu Redis
Định 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ệ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 định cấu hình trực tiếp trong tệp cấu hình của Redis, /etc/redis/redis.conf
, vì vậy hãy mở lại tệp đó bằng trình chỉnh sửa ưa thích của bạn:
1 |
sudo nano /etc/redis/redis.conf |
Cuộn đến phần SECURITY
và tìm một chỉ thị được nhận xét có nội dung:
1 2 3 |
. . . # requirepass foobared . . . |
#
và thay đổi mật khẩu thành mật khẩu an toàn.Lưu ý: Phía trên chỉ thị requestpass trong tệp redis.conf, có một cảnh báo đã nhận xét:
1 2 3 4 5 6 |
. . . # 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. # . . . |
1 |
openssl rand 60 | openssl base64 -A |
1 2 |
Output RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE |
1 2 |
/etc/redis/redis.conf requirepass RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE |
Sau khi đặt mật khẩu, hãy lưu và đóng tệp. Sau đó khởi động lại Redis:
1 |
sudo systemctl restart redis.service |
Để kiểm tra xem mật khẩu có hoạt động hay không, hãy mở ứng dụng Redis:
1 |
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ị trước khi xác thực:
1 |
set key1 10 |
Điều đó sẽ không hiệu quả vì bạn không xác thực, vì vậy Redis trả về lỗi:
1 2 |
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:
1 |
auth <strong>your_redis_password</strong> |
Redis acknowledges:
1 2 |
Output OK |
Sau đó, chạy lại lệnh trước đó sẽ thành công:
1 2 3 4 5 6 |
set key1 10 ------------- Kết quả trả về như sau: Output OK |
get key1
truy vấn Redis cho giá trị của khóa mới.
1 2 3 |
get key1 Output "10" |
Sau khi xác nhận rằng bạn có thể chạy các lệnh trong ứng dụng Redis sau khi xác thực, bạn có thể thoát redis-cli
:
1 |
quit |
Tiếp theo, chúng ta sẽ xem xét đổi tên các lệnh Redis, nếu nhập nhầm hoặc do tác nhân độc hại nhập vào, có thể gây ảnh hưởng nghiêm trọng đến dữ liệu của bạn.
Bước 5 – Đổ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 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 điều hành 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 định cấu hình trong cùng một phần SECURITY
của tệp /etc/redis/redis.conf
.
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
và DEBUG
. Đâ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 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 Redis, hãy mở tệp cấu hình một lần nữa:
1 |
sudo nano /etc/redis/redis.conf |
Để tắt một lệnh, hãy đổ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:
1 2 3 4 5 6 7 8 |
. . . # 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:
1 2 3 4 5 |
. . . # 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, hãy áp dụng thay đổi bằng cách khởi động lại Redis:
1 |
sudo systemctl restart redis.service |
Để kiểm tra lệnh mới, hãy nhập dòng lệnh Redis:
1 |
redis-cli |
Sau đó, xác thực:
1 2 3 4 5 |
auth your_redis_password --------- kết quả trả về như: Output OK |
Giả sử rằng bạn đã đổi tên lệnh CONFIG
thành ASC12_CONFIG
, như trong ví dụ trước. Đầu tiên, hãy thử sử dụng lệnh CONFIG
ban đầu. Nó sẽ không thành công, vì bạn đã đổi tên nó:
1 2 3 4 |
config get requirepass kết quả trẻ về như sau: Output (error) ERR unknown command `config`, with args beginning with: |
Tuy nhiên, việc gọi lệnh đã đổi tên sẽ thành công. Nó không phân biệt chữ hoa chữ thường:
1 2 3 4 5 6 |
asc12_config get requirepass --------------- Kết quả trả về nhu sau: Output 1) "requirepass" 2) "your_redis_password" |
Cuối cùng, bạn có thể thoát khỏi redis-cli
:
1 |
exit |
Lưu ý rằng nếu bạn đang sử dụng dòng lệnh Redis và sau đó khởi động lại Redis, bạn sẽ cần 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:
1 2 |
Output NOAUTH Authentication required. |
Cảnh báo: Về cách đổi tên lệnh, có một cảnh báo ở cuối phần SECURITY
trong /etc/redis/redis.conf
có nội dung:
1 2 3 4 |
. . . # Please note that changing the name of commands that are logged into the # AOF file or transmitted to replicas may cause problems. . . . |
Xem thêm Cách xóa bộ nhớ cache của Redis
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 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, bạn rất dễ dàng vượt qua các tính năng bảo mật dành riêng cho Redis mà chúng tôi đã á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 (bạn đã định cấu hình tường lửa nếu bạn làm theo hướng dẫn Thiết lập máy chủ ban đầu tiên quyết), vì điều này khiến các tác nhân độc hại cực kỳ khó có thể nhảy qua hàng rào đó.
Link bài gốc: digitalocean
Add Comment