Redis 生产环境命令管控规范

目录

  • [Redis 生产环境命令管控规范](#Redis 生产环境命令管控规范)
    • 文档说明
    • 一、禁用/限制的高危命令
      • [1.1 分类及风险说明](#1.1 分类及风险说明)
      • [1.2 管控方式](#1.2 管控方式)
        • [1.2.1 永久禁用/重命名(推荐,redis.conf 配置)](#1.2.1 永久禁用/重命名(推荐,redis.conf 配置))
        • [1.2.2 动态管控(临时生效,无需重启)](#1.2.2 动态管控(临时生效,无需重启))
        • [1.2.3 Redis 6.0+ ACL 精细化管控(最优方案)](#1.2.3 Redis 6.0+ ACL 精细化管控(最优方案))
    • 二、推荐使用的安全命令
      • [2.1 替代类命令(替换高危遍历命令)](#2.1 替代类命令(替换高危遍历命令))
      • [2.2 安全操作类推荐命令](#2.2 安全操作类推荐命令)
    • 三、配套安全管控措施
      • [3.1 基础环境管控](#3.1 基础环境管控)
      • [3.2 监控与审计](#3.2 监控与审计)
      • [3.3 业务开发规范](#3.3 业务开发规范)
    • 四、管控效果验证
      • [4.1 验证禁用命令](#4.1 验证禁用命令)
      • [4.2 验证 ACL 权限](#4.2 验证 ACL 权限)
      • [4.3 验证替代命令有效性](#4.3 验证替代命令有效性)
    • 五、总结
      • [5.1 核心管控要点](#5.1 核心管控要点)
      • [5.2 核心原则](#5.2 核心原则)

Redis 生产环境命令管控规范

文档说明

本文档旨在明确 Redis 生产环境中禁用/限制的高危命令推荐使用的安全命令,核心目标是保障 Redis 实例的稳定性、数据安全性和服务可用性,适用于 Redis 5.0+ 版本(Redis 6.0+ 新增 ACL 管控能力)。

一、禁用/限制的高危命令

1.1 分类及风险说明

命令分类 具体命令 风险等级 核心风险
全量遍历阻塞类 KEYS 极高 遍历所有键,时间复杂度 O(N),数据量大时阻塞主线程,导致所有请求超时
HKEYS 极高 遍历哈希所有字段,大哈希(字段数 10 万+)场景下阻塞主线程
HGETALL 极高 遍历哈希所有字段+值,阻塞风险同 HKEYS,且返回数据量更大
SMEMBERS 极高 遍历集合所有元素,大集合场景下阻塞主线程
LRANGE 0 -1 极高 全量遍历列表,大列表场景下阻塞主线程
数据清空类 FLUSHDB 极高 清空当前数据库,误执行直接丢失整库数据
FLUSHALL 极高 清空所有数据库,生产环境执行等同于"删库"
配置/调试类 CONFIG 可修改 Redis 配置(密码、持久化策略等),存在配置篡改/泄露风险
DEBUG 调试命令(如 DEBUG SEGFAULT)可导致 Redis 进程崩溃
MODULE 加载/卸载外部模块,存在代码注入风险
服务操作类 SHUTDOWN 直接关闭 Redis 实例,导致服务中断
SYNC/PSYNC 手动触发主从复制,可能导致主库压力陡增
持久化干扰类 BGREWRITEAOF/BGSAVE 手动触发持久化,高并发时加剧服务器 IO 压力
认证/握手类 HELLO(6.0+) 未管控时可被用于密码爆破、获取 Redis 版本/协议信息
批量删除类 DEL(批量) 如 DEL * 误执行会批量丢失数据(单键 DEL 可保留)

1.2 管控方式

1.2.1 永久禁用/重命名(推荐,redis.conf 配置)

编辑 Redis 配置文件(如 /etc/redis/redis.conf),通过 rename-command 禁用或重命名高危命令,修改后需重启 Redis 生效。

ini 复制代码
# 1. 直接禁用(设为空字符串,彻底禁止执行)
rename-command KEYS ""
rename-command HKEYS ""
rename-command HGETALL ""
rename-command SMEMBERS ""
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""
rename-command SHUTDOWN ""
rename-command MODULE ""

# 2. 重命名(仅运维人员知晓,用于紧急运维)
rename-command CONFIG "XXXX_CONFIG_2025"       # 自定义复杂名称
rename-command BGREWRITEAOF "XXXX_BGREWRITEAOF_2025"
rename-command HELLO "XXXX_HELLO_2025"        # Redis 6.0+ 需重命名
1.2.2 动态管控(临时生效,无需重启)

适用于无法重启 Redis 的场景,通过 CONFIG SET 实时修改,需执行 CONFIG REWRITE 保存到配置文件避免重启后失效。

redis 复制代码
# 禁用 HKEYS 命令
127.0.0.1:6379> CONFIG SET rename-command HKEYS ""
# 重命名 CONFIG 命令
127.0.0.1:6379> CONFIG SET rename-command CONFIG "XXXX_CONFIG_2025"
# 保存配置到磁盘
127.0.0.1:6379> CONFIG REWRITE
1.2.3 Redis 6.0+ ACL 精细化管控(最优方案)

通过 ACL 实现"按用户管控",运维用户保留权限、业务用户禁用高危命令,兼顾安全性和运维便利性。

redis 复制代码
# 1. 创建业务用户:仅允许基础读写,禁用所有高危命令
127.0.0.1:6379> ACL SETUSER appuser ON >AppPass@2025 ~* +@read +@write -@admin -KEYS -HKEYS -HGETALL -FLUSHDB -FLUSHALL -HELLO

# 2. 创建运维用户:保留所有命令权限
127.0.0.1:6379> ACL SETUSER admin ON >AdminPass@2025 ~* +@all

# 3. 保存 ACL 规则到文件(永久生效)
127.0.0.1:6379> ACL SAVE

二、推荐使用的安全命令

2.1 替代类命令(替换高危遍历命令)

禁用命令 推荐替代命令 核心优势 使用示例
KEYS SCAN 迭代遍历,非阻塞,分批返回 SCAN 0 MATCH user:* COUNT 10(遍历以 user: 开头的键,每次返回 10 条)
HKEYS HSCAN 迭代遍历哈希字段,非阻塞 HSCAN user:1001 0 COUNT 10(遍历哈希 user:1001 的字段,每次返回 10 条)
HGETALL HSCAN 迭代遍历哈希字段+值,非阻塞 HSCAN order:8888 0 COUNT 20(遍历订单哈希的所有字段和值)
SMEMBERS SSCAN 迭代遍历集合元素,非阻塞 SSCAN goods:hot 0 COUNT 15(遍历热门商品集合,每次返回 15 条)
LRANGE 0 -1 LRANGE start end 指定范围遍历,避免全量阻塞 LRANGE msg:1001 0 99(仅获取列表前 100 条数据)

2.2 安全操作类推荐命令

命令场景 推荐命令 安全说明
单键删除 DEL(单键)/UNLINK UNLINK 为异步删除,推荐用于大键删除,避免阻塞;禁止批量 DEL *
数据查询 GET/HGET/SMEMBERS(小集合) 仅允许查询小体量数据(集合元素 < 1000),大集合必须用 SSCAN
持久化 自动触发(配置) 禁用手动 BGSAVE/BGREWRITEAOF,通过 redis.conf 配置自动触发策略
配置查看 运维专用重命名 CONFIG 仅运维人员通过重命名后的 CONFIG 命令查看配置,业务侧禁止访问
认证 AUTH(6.0-)/HELLO(6.0+) HELLO 仅允许运维用户使用,业务侧通过 AUTH 完成基础认证

三、配套安全管控措施

3.1 基础环境管控

  1. 禁止外网访问 :修改 redis.confbind 127.0.0.1(仅允许本机访问),或通过防火墙(iptables/ufw)限制访问 IP。

  2. 设置强密码 :配置 requirepass 避免未授权访问,密码需包含大小写字母+数字+特殊字符:

    ini 复制代码
    requirepass Redis@Pass2025!
  3. 禁用保护模式例外:Redis 保护模式(protected-mode yes)仅允许本机访问,生产环境禁止关闭。

3.2 监控与审计

  1. 慢查询日志 :配置慢查询捕获阻塞命令,及时告警:

    ini 复制代码
    slowlog-log-slower-than 1000  # 记录执行时间 > 1ms 的命令
    slowlog-max-len 1000          # 保留 1000 条慢查询日志

    查看慢查询:SLOWLOG GET 10(查看最近 10 条)。

  2. 命令审计 :Redis 6.0+ 开启 ACL 日志,记录命令执行情况:

    ini 复制代码
    acllog-max-len 1000

    查看审计日志:ACLLOG LIST

3.3 业务开发规范

  1. 强制使用"迭代遍历命令"(SCAN/HSCAN/SSCAN)替代全量遍历命令;
  2. 限制单个数据结构大小:哈希字段数 ≤ 1 万、集合元素数 ≤ 1 万、列表长度 ≤ 10 万;
  3. 禁止业务代码中调用 CONFIG/DEBUG/SHUTDOWN 等运维命令。

四、管控效果验证

4.1 验证禁用命令

执行被禁用的命令,应返回错误提示:

redis 复制代码
127.0.0.1:6379> KEYS *
(error) ERR unknown command `KEYS`, with args beginning with:

4.2 验证 ACL 权限

业务用户执行高危命令应被拒绝:

redis 复制代码
127.0.0.1:6379> AUTH appuser AppPass@2025
OK
127.0.0.1:6379> HKEYS user:1001
(error) NOPERM this user has no permissions to run the 'HKEYS' command or its subcommand

4.3 验证替代命令有效性

redis 复制代码
127.0.0.1:6379> HSCAN user:1001 0 COUNT 5
1) "0"
2) 1) "name"
   2) "zhangsan"
   3) "age"
   4) "30"
   5) "email"
   6) "zhangsan@example.com"

五、总结

5.1 核心管控要点

  1. 必禁用命令 :KEYS、HKEYS、HGETALL、SMEMBERS、FLUSHDB、FLUSHALL,需通过 rename-command 彻底禁用;
  2. 推荐替代命令:SCAN/HSCAN/SSCAN 迭代遍历命令,是生产环境唯一允许的遍历方式;
  3. 精细化管控:Redis 6.0+ 优先使用 ACL 按用户管控命令权限,区分运维/业务用户。

5.2 核心原则

  • 所有可能导致 Redis 主线程阻塞的命令,必须禁用或限制使用;
  • 所有可能导致数据丢失/服务中断的命令,仅保留给运维人员(重命名后使用);
  • 业务侧仅开放"基础读写+安全遍历"命令,最小权限原则。
相关推荐
woshilys8 小时前
oracle 和sql server 查询数据时锁的区别
数据库·oracle
if时光重来8 小时前
kingbase数据库指定数据表自增id重置
数据库·python·sql
jingyucsdn8 小时前
将postgresql结构和数据备份成sql语句
数据库·sql·postgresql
我科绝伦(Huanhuan Zhou)8 小时前
Oracle等待事件:性能诊断与优化的核心指南
数据库·oracle
梦里不知身是客118 小时前
explain分析SQL语句分析sql语句的优劣
java·数据库·sql
程序员zgh8 小时前
SOLID软件设计原则 解析
数据库
TDengine (老段)8 小时前
开放生态破局工业大数据困局:TDengine 的迭代升级与全链路数据自由流动
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
一位代码8 小时前
一些常用的通用 mysql 命令详解及注意事项
数据库·mysql
曹牧9 小时前
Oracle:五笔码
数据库·oracle