Redis Security, Backup va Production Deployment

2 phút đọc

Bai nay huong dan ve Bao mat, Backup va Deploy Redis trong production. Bai cuoi cung cua series Redis Production.

3. Security — Bảo mật Redis

Redis mặc định không có bảo mật. Trong production, đây là lỗ hổng nghiêm trọng cần được khắc phục ngay lập tức.

3.1. AUTH — Xác thực mật khẩu

# redis.conf — Đặt mật khẩu mạnh
requirepass "R3d1s_Secure_2024_StrongPass"

# Kết nối với mật khẩu
redis-cli -a "R3d1s_Secure_2024_StrongPass"

# Hoặc xác thực sau khi kết nối
redis-cli
127.0.0.1:6379> AUTH R3d1s_Secure_2024_StrongPass
OK

3.2. rename-command — Ẩn lệnh nguy hiểm

# redis.conf — Vô hiệu hóa hoặc đổi tên lệnh nguy hiểm
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""
rename-command CONFIG "PROD_CONFIG_a8f3e2d1"
rename-command SHUTDOWN "PROD_SHUTDOWN_b7c4f1e9"

# Đặt tên thành chuỗi ngẫu nhiên để chỉ admin biết

3.3. ACL — Access Control Lists (Redis 6+)

ACL cho phép tạo nhiều user với quyền hạn khác nhau:

# Tạo user chỉ đọc
ACL SETUSER readonly on >readonly_pass ~* +@read -@dangerous

# Tạo user ứng dụng với quyền hạn cụ thể
ACL SETUSER app_user on >app_pass ~app:* +@read +@write +@string +@hash +@list -FLUSHDB -FLUSHALL -CONFIG -DEBUG

# Tạo user monitoring
ACL SETUSER monitor_user on >monitor_pass ~* +@read +INFO +SLOWLOG +CONFIG|GET

# Xem danh sách user
ACL LIST

# Xem chi tiết user hiện tại
ACL WHOAMI
ACL GETUSER app_user

3.4. Các biện pháp bảo mật khác

# redis.conf

# 1. Bind vào IP cụ thể (không bind 0.0.0.0)
bind 127.0.0.1 10.0.0.5

# 2. Thay đổi port mặc định
port 6380

# 3. Bảo vệ mode (chặn truy cập từ bên ngoài khi chưa đặt mật khẩu)
protected-mode yes

# 4. Disable các command nguy hiểm
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG ""

# 5. Sử dụng TLS/SSL (Redis 6+)
# tls-port 6379
# tls-cert-file /path/to/redis.crt
# tls-key-file /path/to/redis.key
# tls-ca-cert-file /path/to/ca.crt

# 6. Giới hạn kết nối
maxclients 10000

# 7. Timeout cho client idle
timeout 300  # Ngắt kết nối sau 5 phút không hoạt động

5. Backup & Recovery — Sao lưu và khôi phục

5.1. RDB Snapshots

# redis.conf — Cấu hình RDB
save 900 1       # Lưu snapshot nếu có >= 1 write trong 900 giây
save 300 10      # Lưu snapshot nếu có >= 10 writes trong 300 giây
save 60 10000    # Lưu snapshot nếu có >= 10000 writes trong 60 giây

dbfilename dump.rdb
dir /var/lib/redis/

# Tạo snapshot thủ công
redis-cli BGSAVE

# Kiểm tra trạng thái snapshot
redis-cli LASTSAVE
redis-cli INFO persistence | grep rdb_last_bgsave_status

5.2. AOF (Append Only File)

# redis.conf — Cấu hình AOF
appendonly yes
appendfilename "appendonly.aof"

# Chính sách fsync
appendfsync everysec   # Khuyến nghị: đồng bộ mỗi giây
# appendfsync always   # An toàn nhất nhưng chậm
# appendfsync no       # Nhanh nhất nhưng rủi ro

# AOF rewrite để giảm kích thước file
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

# Kích hoạt cả RDB và AOF cho an toàn tối đa
aof-use-rdb-preamble yes  # Redis 5+: Kết hợp RDB + AOF

5.3. Backup strategy production

#!/bin/bash
# backup_redis.sh — Script backup tự động

BACKUP_DIR="/backup/redis"
DATE=$(date +%Y%m%d_%H%M%S)
REDIS_HOST="localhost"
REDIS_PORT="6379"
REDIS_PASS="your_password"

mkdir -p $BACKUP_DIR

# 1. Tạo RDB snapshot
redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASS BGSAVE
sleep 5

# 2. Copy file dump.rdb
cp /var/lib/redis/dump.rdb $BACKUP_DIR/dump_${DATE}.rdb

# 3. Copy AOF file (nếu có)
cp /var/lib/redis/appendonly.aof $BACKUP_DIR/appendonly_${DATE}.aof 2>/dev/null

# 4. Nén backup
tar -czf $BACKUP_DIR/redis_backup_${DATE}.tar.gz -C $BACKUP_DIR dump_${DATE}.rdb appendonly_${DATE}.aof

# 5. Xóa backup cũ hơn 30 ngày
find $BACKUP_DIR -name "*.tar.gz" -mtime +30 -delete

echo "Backup completed: redis_backup_${DATE}.tar.gz"

6. Docker & Docker Compose — Production Setup

Chạy Redis trong Docker production đòi hỏi cấu hình đặc biệt để đảm bảo persistence và hiệu năng:

# docker-compose.yml — Redis Production Setup
version: '3.8'

services:
  redis:
    image: redis:7-alpine
    container_name: redis-production
    restart: always
    ports:
      - "6379:6379"
    volumes:
      - redis_data:/data
      - ./redis.conf:/usr/local/etc/redis/redis.conf:ro
    command: redis-server /usr/local/etc/redis/redis.conf
    sysctls:
      - net.core.somaxconn=1024
    ulimits:
      nofile:
        soft: 65536
        hard: 65536
    deploy:
      resources:
        limits:
          memory: 2G
        reservations:
          memory: 1G
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 3
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

  redis-commander:
    image: rediscommander/redis-commander:latest
    container_name: redis-commander
    restart: always
    ports:
      - "8081:8081"
    environment:
      - REDIS_HOSTS=local:redis:6379:0:your_password
    depends_on:
      - redis

volumes:
  redis_data:
    driver: local
# redis.conf — Tối ưu cho Docker

# Memory
maxmemory 1536mb
maxmemory-policy allkeys-lru

# Persistence
appendonly yes
appendfsync everysec
save 900 1
save 300 10
save 60 10000

# Security
requirepass "Docker_Redis_Prod_2024"
rename-command FLUSHALL ""
rename-command FLUSHDB ""

# Performance
tcp-backlog 511
timeout 300
tcp-keepalive 60
maxclients 10000

# Disable THP (Transparent Huge Pages)
# Chạy trên host: echo never > /sys/kernel/mm/transparent_hugepage/enabled
# Deploy và quản lý
docker-compose up -d

# Kiểm tra logs
docker-compose logs -f redis

# Kết nối vào container
docker exec -it redis-production redis-cli -a your_password

# Kiểm tra health
docker exec -it redis-production redis-cli ping

Xem thêm: Tất cả bài viết về Redis · Persistence RDB vs AOF · Redis Monitoring · Replication & High Availability

← Bài trướcRedis Monitoring: Giam sat va Alerting