8.2.6 安全加固与访问控制

本节聚焦 Redis 的安全加固与访问控制,提供可执行的加固流程、配置示例、验证命令与排错方法,适用于内网多租户与生产环境。

安全加固目标与原则#

  • 默认不暴露:不对公网开放 Redis 端口,采用内网访问或专用网络。
  • 最小权限:限制可执行命令范围与访问来源。
  • 强认证:启用强口令与 ACL 用户体系。
  • 可审计:启用日志、慢查询与安全事件记录。

原理草图:访问控制与审计链路#

文章图片

网络访问控制(示例:内网绑定+防火墙)#

1)配置 bind 与 protected-mode

# /etc/redis/redis.conf
bind 127.0.0.1 10.0.0.10
protected-mode yes
port 6379

2)防火墙白名单

# 仅允许 10.0.0.0/24 访问 6379
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" \
source address="10.0.0.0/24" port protocol="tcp" port="6379" accept'
firewall-cmd --permanent --add-port=6379/tcp --zone=drop
firewall-cmd --reload

# 验证规则
firewall-cmd --list-all

3)验证

# 在白名单主机上
redis-cli -h 10.0.0.10 -p 6379 ping
# 预期:PONG

# 在非白名单主机上
redis-cli -h 10.0.0.10 -p 6379 ping
# 预期:连接超时或拒绝

认证与授权(Redis 6+ ACL)#

1)设置管理员与只读用户

# /etc/redis/redis.conf
requirepass "Admin#StrongPass2024"
user admin on >Admin#StrongPass2024 allcommands allkeys
user app_ro on >ReadOnly#2024 ~cache:* +get +mget +exists +pttl +ttl +scan

2)重命名或禁用高危命令

# /etc/redis/redis.conf
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG ""
rename-command DEBUG ""
rename-command MODULE ""

3)验证 ACL 与命令限制

# 管理员登录
redis-cli -h 10.0.0.10 -a "Admin#StrongPass2024" ACL LIST

# 只读用户测试
redis-cli -h 10.0.0.10 -u redis://app_ro:ReadOnly#2024@10.0.0.10:6379
> GET cache:key
> SET cache:key 1
# 预期:SET 被拒绝,GET 允许

TLS 传输安全(示例:自签证书快速启用)#

1)生成证书

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

# 生成 CA
openssl genrsa -out ca.key 4096
openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 \
  -subj "/CN=redis-ca" -out ca.crt

# 生成服务端证书
openssl genrsa -out redis.key 2048
openssl req -new -key redis.key -subj "/CN=redis-server" -out redis.csr
openssl x509 -req -in redis.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
  -out redis.crt -days 365 -sha256

2)开启 TLS 端口并禁用明文端口

# /etc/redis/redis.conf
tls-port 6379
port 0
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

3)TLS 连接验证

redis-cli --tls --cacert /etc/redis/tls/ca.crt \
  -h 10.0.0.10 -p 6379 -a "Admin#StrongPass2024" ping
# 预期:PONG

系统与进程安全(示例:非 root 运行与目录权限)#

# 创建专用用户
useradd -r -s /sbin/nologin redis

# 目录权限
mkdir -p /var/lib/redis /var/log/redis /etc/redis
chown -R redis:redis /var/lib/redis /var/log/redis /etc/redis
chmod 750 /var/lib/redis /var/log/redis

systemd 服务检查

systemctl cat redis
# 确认 User=redis, Group=redis

配置安全基线(可直接落地的配置片段)#

# /etc/redis/redis.conf
bind 127.0.0.1 10.0.0.10
protected-mode yes
requirepass "Admin#StrongPass2024"
maxclients 10000
timeout 300
logfile /var/log/redis/redis.log
slowlog-log-slower-than 10000
slowlog-max-len 256

审计与告警(日志与慢查询)#

# 查看慢查询
redis-cli -a "Admin#StrongPass2024" SLOWLOG GET 10

# 查看登录失败(示例:grep 认证失败)
grep -i "NOAUTH" /var/log/redis/redis.log

排错指南(常见问题与定位)#

  • 无法连接
  • 检查端口监听:ss -lntp | grep 6379
  • 检查 bind 与防火墙:grep ^bind /etc/redis/redis.conf
  • 验证安全组/防火墙:firewall-cmd --list-all
  • TLS 连接失败
  • 证书路径错误:确认 tls-*-file 绝对路径
  • 客户端未指定 CA:redis-cli --tls --cacert /etc/redis/tls/ca.crt
  • ACL 权限不足
  • 查看用户权限:ACL GETUSER app_ro
  • 确认键前缀匹配:~cache:* 是否覆盖实际键名

练习与实操#

  1. 最小权限用户
    - 创建 app_rw 用户,仅允许 cache:* 前缀的读写命令。
    - 验证 DEL other:* 被拒绝。
  2. TLS 强制化
    - 关闭明文端口 port 0,仅允许 TLS 连接。
    - 使用 redis-cli --tls 验证成功,明文连接失败。
  3. 高危命令禁用
    - 禁用 CONFIGFLUSHALL,验证管理员也无法执行。
  4. 审计检索
    - 触发一个慢查询(如 SORT 大键),查看 SLOWLOG GET 输出并记录耗时。