Hướng dẫn bảo mật Redis Server trên Linux: ACL, TLS và chặn truy cập trái phép

Security tutorial - IT technology blog
Security tutorial - IT technology blog

Bối cảnh: Tại sao Redis thường xuyên trở thành mục tiêu tấn công?

Trong hạ tầng production, Redis xử lý hàng chục nghìn request mỗi giây nhờ cơ chế in-memory. Tốc độ này có được vì Redis tối ưu hóa tối đa hiệu năng và lược bỏ phần lớn các lớp kiểm soát rườm rà. Triết lý thiết kế ban đầu của Redis giả định service luôn chạy trong mạng nội bộ cô lập và tin cậy tuyệt đối.

Thực tế vận hành lại khác. Thống kê trên Shodan thường xuyên ghi nhận hơn 30.000 máy chủ Redis phơi cổng 6379 trực tiếp ra ngoài Internet mà không có mật khẩu. Chỉ mất vài giây quét cổng, kẻ tấn công đã có thể kết nối vào instance của bạn.

Hậu quả không dừng lại ở việc lộ session người dùng hay token API. Điển hình như chiến dịch mã độc đào tiền ảo Kinsing: tin tặc lợi dụng quyền ghi của Redis, chạy lệnh CONFIG SET dir /var/spool/cron/crontabs hoặc /root/.ssh để chèn shell và chiếm quyền root máy chủ Linux. Do đó, bảo vệ Redis ngay từ khâu provision server là việc bắt buộc.

Chuẩn bị môi trường

Hướng dẫn này thực hiện trên Ubuntu 22.04 LTS. Các phiên bản Debian 11/12 hoặc Rocky Linux/RHEL 9 có cấu hình tương đương. Để sử dụng đầy đủ ACL và native TLS, hệ thống cần Redis từ phiên bản 6.0 trở lên.

Cài đặt Redis Server kèm gói OpenSSL để khởi tạo chứng chỉ:

sudo apt update
sudo apt install redis-server openssl -y

# Kiểm tra phiên bản (yêu cầu >= 6.0)
redis-server -v

Đảm bảo tiến trình systemd hoạt động bình thường:

sudo systemctl status redis-server

Các bước thiết lập bảo mật Redis

1. Giới hạn interface mạng và bật Protected Mode

Đa số sự cố bảo mật Redis bắt nguồn từ việc bind bừa bãi vào 0.0.0.0. Hãy chỉ định chính xác địa chỉ loopback hoặc IP private của server trong dải VPC (ví dụ 10.0.1.5).

Mở file cấu hình:

sudo nano /etc/redis/redis.conf

Tìm và cập nhật hai thông số sau:

bind 127.0.0.1 ::1
protected-mode yes

Nếu ứng dụng backend nằm cùng máy chủ với Redis, cấu hình trên là đủ. Khi protected-mode yes được bật, Redis sẽ tự động chặn mọi kết nối từ bên ngoài nếu chưa thiết lập mật khẩu xác thực.

2. Vô hiệu hóa hoặc đổi tên các lệnh nguy hiểm

Một số lệnh quản trị trong Redis có tính rủi ro cực cao. Lệnh FLUSHALL có thể xóa sạch vài triệu key cache chỉ trong một tích tắc. Bộ lệnh CONFIG cho phép ghi đè cấu hình runtime và can thiệp file hệ thống.

Thêm các chỉ thị sau vào /etc/redis/redis.conf:

rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""
rename-command CONFIG "SYS_ADMIN_CONFIG_8f9a2b"

Dấu nháy kép rỗng "" sẽ tắt hoàn toàn lệnh đó. Riêng CONFIG được đổi sang chuỗi ngẫu nhiên để chỉ sysadmin trực tiếp quản trị mới có thể tra cứu runtime.

3. Phân quyền chi tiết theo ứng dụng với ACL (Access Control Lists)

Trước Redis 6.0, biến requirepass cấp chung một mật khẩu cho mọi client. Mọi service từ web, worker cho đến cronjob đều dùng chung một quyền hạn cao nhất.

Cơ chế ACL giải quyết triệt để vấn đề này. Mỗi ứng dụng sẽ có user riêng, chỉ được phép đọc ghi trên đúng prefix key của mình.

Tạo file quản lý quyền riêng biệt:

sudo touch /etc/redis/users.acl
sudo chown redis:redis /etc/redis/users.acl
sudo chmod 600 /etc/redis/users.acl

Khai báo file này trong /etc/redis/redis.conf:

aclfile /etc/redis/users.acl

Mở file /etc/redis/users.acl để định nghĩa người dùng:

sudo nano /etc/redis/users.acl

Nội dung mẫu:

# Tắt user default không có mật khẩu
user default off

# User cho Web App: chỉ thao tác prefix app:cache:, chặn toàn bộ lệnh nguy hiểm
user web_app on >K9#mX2$pL9vQ!wZ ~app:cache:* +@read +@write -@dangerous

# User quản trị viên: toàn quyền thao tác
user sysadmin on >T7@vR5*bN1#cE8! ~* +@all

Cú pháp ACL gồm các thành phần:

  • user default off: Vô hiệu hóa tài khoản mặc định.
  • >MatKhau: Đặt mật khẩu dạng clear-text (Redis sẽ tự hash SHA-256 khi lưu vào bộ nhớ).
  • ~app:cache:*: Giới hạn namespace. Service web chỉ thao tác được với các key có tiền tố này, tránh đọc trộm session hoặc billing data của service khác.
  • +@read +@write -@dangerous: Cấp nhóm lệnh đọc/ghi thông thường, loại trừ toàn bộ lệnh gây treo server hoặc đổi cấu hình.

4. Mã hóa đường truyền liên máy chủ bằng TLS

Giao thức Redis truyền dữ liệu dạng plain-text. Nếu backend và Redis nằm ở hai server khác nhau trong mạng nội bộ, kẻ tấn công khi xâm nhập được switch hoặc dùng ARP spoofing vẫn có thể sniff toàn bộ session token chạy qua dây mạng.

Bật TLS sẽ thêm khoảng 5% đến 12% overhead CPU và tăng latency thêm 0.1ms – 0.3ms. Đổi lại, toàn bộ payload trên đường truyền được bảo vệ an toàn.

Tạo cặp khóa và chứng chỉ số (CA tự ký nội bộ):

sudo mkdir -p /etc/redis/tls
cd /etc/redis/tls

# Tạo CA nội bộ
sudo openssl genrsa -out ca.key 4096
sudo openssl req -x509 -new -nodes -sha256 -key ca.key -days 3650 -subj '/CN=Internal-Redis-CA' -out ca.crt

# Tạo private key và cert cho server Redis
sudo openssl genrsa -out redis.key 2048
sudo openssl req -new -sha256 -key redis.key -subj '/CN=redis-server' -out redis.csr
sudo openssl x509 -req -in redis.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out redis.crt -days 365

# Phân quyền tệp khóa bí mật
sudo chown -R redis:redis /etc/redis/tls
sudo chmod 600 /etc/redis/tls/*.key
sudo chmod 644 /etc/redis/tls/*.crt

Cập nhật file /etc/redis/redis.conf:

# Tắt port plaintext
port 0

# Bật port mã hóa TLS
tls-port 6379

tls-cert-file /etc/redis/tls/redis.crt
tls-key-file /etc/redis/tls/redis.key
tls-ca-cert-file /etc/redis/tls/ca.crt
tls-auth-clients no

Restart service để nạp toàn bộ cấu hình:

sudo systemctl restart redis-server

Kiểm thử và Audit bảo mật

1. Kiểm tra quyền hạn ACL qua redis-cli

Kết nối qua giao thức TLS với user web_app vừa tạo:

redis-cli --tls --cacert /etc/redis/tls/ca.crt -a 'K9#mX2$pL9vQ!wZ' --user web_app

Thực hiện các thao tác mẫu để kiểm chứng:

# 1. Thao tác đúng prefix -> Thành công
SET app:cache:session_user_99 "authenticated"
GET app:cache:session_user_99

# 2. Thao tác ngoài prefix -> Bị từ chối ngay lập tức
SET config:jwt_secret "my-secret-key"
# Output: (error) NOPERM this user has no permissions to access the 'config:jwt_secret' key

# 3. Chạy lệnh nằm trong blacklist -> Bị chặn
KEYS *
# Output: (error) NOPERM this user has no permissions to run the 'keys' command

2. Theo dõi vi phạm bảo mật theo thời gian thực

Redis cung cấp công cụ kiểm toán runtime rất hiệu quả là ACL LOG. Mỗi khi xuất hiện client nhập sai mật khẩu, gọi lệnh cấm hoặc truy cập sai key pattern, Redis đều lưu lại timestamp, client IP và câu lệnh vi phạm:

127.0.0.1:6379> ACL LOG 5

Nếu thấy log liên tục xuất hiện lỗi auth-error hoặc key-perm từ một IP bất thường, hệ thống của bạn nhiều khả năng đang bị rà quét hoặc một worker service đang bị cấu hình sai.

Đồng thời, hãy theo dõi file log dịch vụ để phát hiện lỗi nạp chứng chỉ hoặc reset kết nối:

sudo tail -f /var/log/redis/redis-server.log

Kết hợp 3 lớp phòng vệ: network isolation (bind/port), phân quyền tối thiểu (ACL) và mã hóa đường truyền (TLS) giúp instance Redis của bạn đứng vững trước cả nguy cơ tấn công mạng lẫn rủi ro lộ lọt dữ liệu nội bộ.

Share: