依据GB/T 22239-2019《信息安全技术 网络安全等级保护基本要求》第三级"安全计算环境"条款,结合Redis 6.x/7.x官方安全指南及多家测评机构现场实践,给出可直接落地的测评命令清单。
已在Redis 6.2.7 / 7.0.12环境验证通过,支持standalone / sentinel / cluster部署模式。
一、身份鉴别(8.1.4.1)
1.1 访问控制与认证配置
控制项 | 测评命令 | 达标判据 |
|---|---|---|
密码认证启用 | redis-cli CONFIG GET requirepass | 返回非空字符串 |
密码复杂度检查 | redis-cli CONFIG GET requirepass | 长度≥8位,包含大小写+数字+特殊字符 |
默认端口修改 | redis-cli CONFIG GET port | 非6379端口(建议6380+) |
绑定地址限制 | redis-cli CONFIG GET bind | 绑定具体IP,非0.0.0.0 |
保护模式 | redis-cli CONFIG GET protected-mode | yes(默认启用) |
Redis配置文件核查:
# 查看Redis配置文件路径 redis-cli CONFIG GET dir redis-cli CONFIG GET logfile # 查看配置文件内容(通常位于/etc/redis/或/etc/redis.conf) cat /etc/redis/redis.conf |grep-E'^(requirepass|bind|port|protected-mode|masterauth)' # 查看是否启用ACL(Redis 6.0+) redis-cli ACL LIST |head-10 # 查看特定用户权限(Redis 6.0+) redis-cli ACL GETUSER default # 查看所有用户列表 redis-cli ACL USERS1.2 登录失败与会话管理
控制项 | 测评命令 | 达标判据 |
|---|---|---|
连接数限制 | redis-cli CONFIG GET maxclients | 根据业务设置,建议≤10000 |
超时断开 | redis-cli CONFIG GET timeout | 300-600秒(5-10分钟) |
TCP连接保持 | redis-cli CONFIG GET tcp-keepalive | 60-300秒 |
Redis特有配置:
# 查看当前连接数 redis-cli INFO clients |grep connected_clients # 查看最大连接数限制 redis-cli CONFIG GET maxclients # 查看客户端连接列表(检查异常连接) redis-cli CLIENT LIST |head-20 # 查看阻塞客户端 redis-cli CLIENT LIST |grep-c"blocked" # 查看连接来源IP分布 redis-cli CLIENT LIST |awk -F'addr=''{print $2}'|awk -F':''{print $1}'|sort|uniq-c|sort-rn|head-10 # 查看慢查询(可能为攻击行为) redis-cli SLOWLOG GET 101.3 远程管理安全
# 检查危险命令重命名或禁用 cat /etc/redis/redis.conf |grep-E'^(rename-command|DISABLE)' # 检查是否禁用高危命令 redis-cli CONFIG GET rename-command # 或查看配置文件 grep-E'rename-command (FLUSHALL|FLUSHDB|CONFIG|DEBUG|SHUTDOWN|SAVE|BGSAVE)' /etc/redis/redis.conf # 检查是否启用SSL/TLS(Redis 6.0+) redis-cli CONFIG GET tls-port redis-cli CONFIG GET tls-cert-file # 查看监听端口 ss -tulnp|grep redis-server # 检查是否暴露在外网 curl-s http://ipinfo.io/ip # 获取本机公网IP redis-cli -h<公网IP>-p6379 PING # 应返回错误或未连接高风险项:Redis未设置密码且绑定0.0.0.0,或高危命令未禁用,直接判定不符合三级要求。
1.4 双因子认证(高风险项)
测评方法:
访谈确认:是否采用"Redis密码+网络层VPN/堡垒机"组合认证
技术核查:
# 检查是否通过堡垒机访问 echo$SSH_CONNECTION# 查看SSH来源 last |grep redis # 查看登录记录 # 检查VPN网段访问限制 redis-cli CONFIG GET bind cat /etc/redis/redis.conf |grep-A5-B5'^bind' # 检查iptables/防火墙限制 iptables -L-n|grep6379 firewall-cmd --list-all |grep redis # CentOS/RHEL ufw status |grep6379# Ubuntu # 检查是否使用SSL证书认证(Redis 6.0+) openssl s_client -connect localhost:6379 -tls1_2</dev/null 2>/dev/null | openssl x509 -noout-text|head-20二、访问控制(8.1.4.2)
2.1 账户与权限管理
控制项 | 测评命令 | 达标判据 |
|---|---|---|
默认账户检查 | redis-cli ACL LIST | 删除/重命名default用户或限制权限 |
最小权限原则 | redis-cli ACL GETUSER <username> | 仅授权必要命令和Key前缀 |
敏感操作审计 | redis-cli ACL LOG | 记录越权访问尝试(Redis 6.0+) |
Redis 6.0+ ACL(访问控制列表)核查:
# 查看ACL日志(记录权限拒绝事件) redis-cli ACL LOG 10 # 查看所有用户及权限 redis-cli ACL LIST # 检查用户权限示例(应限制危险命令) redis-cli ACL GETUSER app_readonly # 期望输出:-@all +@read ~app:* (仅允许读取app:前缀的key) # 检查管理员用户 redis-cli ACL GETUSER admin # 应启用on >password 权限但限制来源IP # 查看Key空间通知(审计用途) redis-cli CONFIG GET notify-keyspace-eventsRedis 5.x及以下版本(无ACL):
# 检查是否使用Redis AUTH密码区分业务 cat /etc/redis/redis.conf |grep-E'^requirepass' # 检查是否使用不同Redis实例隔离业务 ps aux |grep redis-server |grep-vgrep ss -tulnp|grep redis # 检查Key前缀规范(业务隔离) redis-cli KEYS '*'|awk -F':''{print $1}'|sort|uniq-c|sort-rn|head-102.2 默认配置清理
# 检查是否修改默认端口 redis-cli CONFIG GET port # 或 cat /etc/redis/redis.conf |grep'^port' # 检查是否禁用危险命令 cat /etc/redis/redis.conf |grep'rename-command' # 标准配置应包含: # rename-command FLUSHALL "" # rename-command FLUSHDB "" # rename-command CONFIG "CONFIG_9f3b2a1e" # rename-command DEBUG "" # 检查是否关闭监听IPv6(如未使用) cat /etc/redis/redis.conf |grep'bind'|grep-v'#' # 检查是否禁用THP(透明大页) cat /sys/kernel/mm/transparent_hugepage/enabled # 应为[never] # 检查是否设置内存上限 redis-cli CONFIG GET maxmemory redis-cli CONFIG GET maxmemory-policy # 应为volatile-lru或allkeys-lru三、安全审计(8.1.4.3)
3.1 日志配置与审计
控制项 | 测评命令 | 达标判据 |
|---|---|---|
日志启用 | redis-cli CONFIG GET loglevel | notice或verbose |
日志文件路径 | redis-cli CONFIG GET logfile | 非空,非stdout |
慢查询日志 | redis-cli CONFIG GET slowlog-log-slower-than | ≤10000微秒(10ms) |
审计日志(Redis 6.0+) | redis-cli ACL LOG | 启用并持久化 |
Redis日志核查:
# 查看日志级别 redis-cli CONFIG GET loglevel # 可选:debug, verbose, notice, warning # 查看日志文件位置 redis-cli CONFIG GET logfile # 查看日志内容(检查异常) tail-n100 /var/log/redis/redis-server.log |grep-i-E'error|warning|failed|attack' # 查看日志文件权限 ls-la /var/log/redis/ stat-c'%a %U:%G' /var/log/redis/redis-server.log # 应为640 redis:redis # 查看慢查询日志配置 redis-cli CONFIG GET slowlog-log-slower-than # 单位:微秒 redis-cli CONFIG GET slowlog-max-len # 建议≥128 # 查看慢查询记录(潜在攻击或性能问题) redis-cli SLOWLOG GET 20 # 查看ACL审计日志(Redis 6.0+) redis-cli ACL LOG 50|head-50 # 重置慢查询日志(测试后清理) redis-cli SLOWLOG RESET3.2 持久化与备份审计
# 查看RDB持久化配置 redis-cli CONFIG GET save # 应包含类似:900 1 300 10 60 10000(自动保存策略) # 查看AOF持久化配置 redis-cli CONFIG GET appendonly redis-cli CONFIG GET appendfsync # 应为everysec或always # 查看RDB文件路径及权限 redis-cli CONFIG GET dir redis-cli CONFIG GET dbfilename ls-la /var/lib/redis/ # RDB文件权限应为640 redis:redis # 查看AOF文件 redis-cli CONFIG GET appendfilename ls-la /var/lib/redis/*.aof # 检查备份策略 crontab-l|grep-i redis ls-la /backup/redis/ 2>/dev/null # 查看最后一次持久化时间 redis-cli INFO persistence |grep-E'rdb_last_save_time|aof_last_write_status' date-d @$(redis-cli INFO persistence |grep rdb_last_save_time |cut -d: -f2)四、入侵防范(8.1.4.4)
4.1 服务加固与漏洞修复
控制项 | 测评命令 | 达标判据 | |
|---|---|---|---|
版本检查 | redis-cli INFO server | 使用6.0+版本,非EOL版本 | |
安全补丁 | `redis-cli INFO server | grep redis_version` | 当前最新稳定版 |
危险命令禁用 | cat /etc/redis/redis.conf | grep rename-command | FLUSHALL/FLUSHDB/CONFIG等已禁用 | |
内存限制 | redis-cli CONFIG GET maxmemory | 设置为物理内存的70-80% |
Redis加固核查:
# 查看Redis版本(确认非漏洞版本) redis-cli INFO server |grep redis_version redis-cli INFO server |grep redis_git_sha1 # 检查已知漏洞版本(示例) REDIS_VER=$(redis-cli INFO server |grep redis_version |cut -d: -f2|tr-d'\r') echo"当前版本: $REDIS_VER" # 高危版本:3.2.0-3.2.4(CVE-2016-8339)、4.0.0-4.0.10、5.0.0-5.0.3等 # 检查是否运行在root用户下 ps aux |grep redis-server |grep-vgrep # 应为redis或专用用户,绝不能是root # 检查配置文件权限 stat-c'%a %U:%G' /etc/redis/redis.conf # 应为640 redis:redis # 检查数据目录权限 stat-c'%a %U:%G' /var/lib/redis/ # 应为750 redis:redis # 检查是否启用内存淘汰策略 redis-cli CONFIG GET maxmemory-policy # 生产环境应为volatile-lru或allkeys-lru,不能是noeviction # 检查是否启用Lazy Free(避免阻塞) redis-cli CONFIG GET lazyfree-lazy-eviction redis-cli CONFIG GET lazyfree-lazy-expire # 建议yes4.2 网络安全防护
# 检查防火墙规则(应限制访问源IP) iptables -L-n-v|grep6379 firewall-cmd --zone=internal --list-ports # CentOS/RHEL ufw status numbered |grep6379# Ubuntu # 检查是否使用VPN/专线访问 netstat-tn|grep6379|awk'{print $5}'|cut -d: -f1|sort|uniq-c|sort-rn # 检查是否启用TCP backlog redis-cli CONFIG GET tcp-backlog # 建议511或更高 # 检查是否禁用TCP_NODELAY(根据业务) redis-cli CONFIG GET tcp-nodelay # 默认yes,高频小数据包场景建议no # 检查是否启用客户端输出缓冲区限制 redis-cli CONFIG GET client-output-buffer-limit # 应设置normal slave pubsub三类限制五、恶意代码防范(8.1.4.5)
控制项 | 测评命令 | 达标判据 |
|---|---|---|
文件完整性 | md5sum /usr/bin/redis-server | 与官方发布值比对 |
模块安全 | redis-cli MODULE LIST | 仅加载可信模块 |
数据文件扫描 | clamscan /var/lib/redis/ | 定期扫描 |
Redis恶意代码防范核查:
# 检查已加载模块(防止恶意模块) redis-cli MODULE LIST # 检查模块路径(应限制加载路径) cat /etc/redis/redis.conf |grep-i'loadmodule' # 验证Redis二进制文件完整性 md5sum /usr/bin/redis-server sha256sum /usr/bin/redis-server # 与官方发布值比对:https://download.redis.io/releases/ # 检查数据文件是否被篡改(RDB/AOF) md5sum /var/lib/redis/dump.rdb ls-la /var/lib/redis/ |grep-E'dump.rdb|appendonly.aof' # 使用杀毒软件扫描数据目录 clamscan -r /var/lib/redis/ 2>/dev/null ||echo"ClamAV未安装" # 检查是否启用病毒扫描后置处理(如有) cat /etc/redis/redis.conf |grep-i'notify'六、可信验证(8.1.4.6)
控制项 | 测评命令 | 达标判据 |
|---|---|---|
启动文件完整性 | debsums redis-server或 | 无文件被篡改 |
配置签名验证 | gpg --verify redis.tar.gz.asc | 官方签名验证通过 |
运行时完整性 | ps aux | grep redis | 进程哈希与安装包一致 |
Redis可信验证核查:
# 验证安装包完整性(Debian/Ubuntu) debsums -s redis-server 2>/dev/null ||echo"debsums未安装或包未校验" # 验证安装包完整性(RHEL/CentOS) rpm-V redis 2>/dev/null ||echo"验证失败或未安装" # 检查Redis二进制文件签名(如从源码编译) which redis-server file /usr/bin/redis-server # 验证配置文件未被篡改(对比基线) cat /etc/redis/redis.conf | md5sum # 与基线配置文件比对 # 检查是否使用可信源安装 apt-cache policy redis-server # Debian/Ubuntu yum info redis # RHEL/CentOS # 检查是否启用安全启动(Secure Boot)相关 mokutil --sb-state 2>/dev/null七、数据备份与恢复(8.1.4.9)
控制项 | 测评命令 | 达标判据 |
|---|---|---|
RDB自动备份 | cat /etc/cron.d/redis-backup | 每日/每小时自动备份 |
AOF持久化 | redis-cli CONFIG GET appendonly | yes(开启AOF) |
异地备份 | ls -la /backup/redis/ | 存在异地备份 |
恢复测试 | redis-check-rdb /backup/dump.rdb | 备份文件可正常校验 |
Redis备份与恢复核查:
# 查看持久化配置 redis-cli INFO persistence # 手动触发RDB备份 redis-cli BGSAVE redis-cli LASTSAVE # 查看最后一次保存时间戳 date-d @$(redis-cli LASTSAVE) # 检查RDB文件完整性 redis-check-rdb /var/lib/redis/dump.rdb echo$?# 应为0 # 检查AOF文件完整性 redis-check-aof /var/lib/redis/appendonly.aof echo$?# 应为0 # 查看备份脚本 cat /etc/cron.d/redis-backup 2>/dev/null ||crontab-l|grep redis # 检查备份目录及保留策略 ls-la /backup/redis/ 2>/dev/null |head-10 find /backup/redis/ -name"*.rdb"-mtime +7 # 检查7天前备份是否清理 # 测试恢复流程(在测试环境) # cp /backup/redis/dump-$(date +%F).rdb /var/lib/redis/dump.rdb # redis-cli CONFIG SET dir /var/lib/redis # redis-cli DEBUG RELOAD八、高可用与集群安全(扩展)
8.1 Redis Sentinel高可用
# 查看Sentinel配置 cat /etc/redis/sentinel.conf |grep-E'^(sentinel|bind|port)' # 检查Sentinel密码 redis-cli -p26379 INFO sentinel redis-cli -p26379 SENTINEL masters # 检查Sentinel自动故障转移 redis-cli -p26379 SENTINEL get-master-addr-by-name mymaster # 查看Sentinel日志 tail-n50 /var/log/redis/redis-sentinel.log8.2 Redis Cluster集群
# 查看集群节点 redis-cli CLUSTER NODES # 检查集群状态 redis-cli CLUSTER INFO |grep-E'cluster_state|cluster_slots_assigned' # 查看数据分布 redis-cli CLUSTER SLOTS |head-20 # 检查集群密码(所有节点应一致) fornodein$(redis-cli CLUSTER NODES |awk'{print $2}'|cut -d: -f1|sort|uniq);do echo"=== $node ===" redis-cli -h$node CONFIG GET requirepass done一键巡检脚本(Redis)
#!/bin/bash # Redis 等保三级一键巡检脚本 # 适用:Redis 6.x / 7.x # 执行用户:root 或 redis用户 echo"===== 1 身份鉴别 =====" echo"--- 密码认证配置 ---" redis-cli CONFIG GET requirepass echo"--- 绑定地址 ---" redis-cli CONFIG GET bind echo"--- 端口配置 ---" redis-cli CONFIG GET port echo"--- 保护模式 ---" redis-cli CONFIG GET protected-mode echo"--- 连接超时 ---" redis-cli CONFIG GET timeout echo"" echo"===== 2 访问控制 =====" echo"--- ACL用户列表(Redis 6.0+)---" redis-cli ACL USERS 2>/dev/null ||echo"Redis版本低于6.0,未启用ACL" echo"--- 危险命令重命名 ---" cat /etc/redis/redis.conf 2>/dev/null |grep'rename-command'||echo"未配置rename-command" echo"--- 当前连接数 ---" redis-cli INFO clients |grep connected_clients echo"" echo"===== 3 安全审计 =====" echo"--- 日志级别 ---" redis-cli CONFIG GET loglevel echo"--- 日志文件 ---" redis-cli CONFIG GET logfile echo"--- 慢查询配置 ---" redis-cli CONFIG GET slowlog-log-slower-than redis-cli SLOWLOG GET 52>/dev/null |head-10 echo"--- ACL审计日志(6.0+)---" redis-cli ACL LOG 52>/dev/null |head-10||echo"未启用ACL或版本过低" echo"" echo"===== 4 入侵防范 =====" echo"--- Redis版本 ---" redis-cli INFO server |grep redis_version echo"--- 运行用户 ---" ps aux |grep redis-server |grep-vgrep|awk'{print $1}'|sort|uniq echo"--- 内存限制 ---" redis-cli CONFIG GET maxmemory redis-cli CONFIG GET maxmemory-policy echo"--- 危险命令检查 ---" cat /etc/redis/redis.conf 2>/dev/null |grep-E'rename-command (FLUSHALL|FLUSHDB|CONFIG|DEBUG)'||echo"未禁用高危命令" echo"" echo"===== 5 数据备份 =====" echo"--- 持久化配置 ---" redis-cli CONFIG GET save redis-cli CONFIG GET appendonly echo"--- RDB文件状态 ---" redis-cli INFO persistence |grep-E'rdb_last_bgsave_status|rdb_last_save_time' echo"--- 备份文件检查 ---" ls-la /var/lib/redis/dump.rdb 2>/dev/null ||echo"RDB文件不存在" ls-la /backup/redis/ 2>/dev/null |head-5||echo"备份目录不存在" echo"" echo"===== 6 网络安全 =====" echo"--- 监听端口 ---" ss -tulnp|grep redis-server echo"--- 防火墙规则 ---" iptables -L-n|grep63792>/dev/null ||echo"未配置iptables" echo"" echo"===== 巡检完成 ====="高风险项重点核查清单
检查项 | 验证命令 | 不合规判定 | 整改建议 |
|---|---|---|---|
| 无密码认证 | redis-cli CONFIG GET requirepass | 返回空字符串 | 立即设置强密码 |
| 绑定0.0.0.0 | redis-cli CONFIG GET bind | 包含0.0.0.0 | 修改为具体内网IP |
| 高危命令未禁用 | cat /etc/redis/redis.conf | grep rename-command | 未配置FLUSHALL/CONFIG等重命名 | 添加rename-command禁用或重命名 |
| root用户运行 | ps aux | grep redis | 存在root运行的redis | 创建redis专用用户 |
| 无持久化配置 | redis-cli CONFIG GET save | 返回空或"" | 配置RDB自动保存策略 |
| 无内存限制 | redis-cli CONFIG GET maxmemory | 返回0 | 设置maxmemory为物理内存70% |
| 默认端口暴露 | redis-cli CONFIG GET port | 返回6379 | 修改为非常用端口 |
| 无连接超时 | redis-cli CONFIG GET timeout | 返回0 | 设置300-600秒超时 |
| 配置文件权限过宽 | stat /etc/redis/redis.conf | 权限大于644 | 修改为640 |
| 未启用AOF | redis-cli CONFIG GET appendonly | 返回no | 开启AOF持久化 |
Redis版本差异对照
功能项 | Redis 5.x | Redis 6.x | Redis 7.x |
|---|---|---|---|
ACL支持 | 无 | 完整ACL | 增强ACL(selectors) |
SSL/TLS | 无 | 原生支持 | 增强性能 |
多线程IO | 无 | 无 | 启用(io-threads) |
新协议 | RESP2 | RESP3可选 | RESP3默认 |
集群管理 | 手动 | 手动 | 自动分片改进 |
等保合规 | 需大量加固 | 基础合规 | 完整合规 |
国密支持 | 无 | 需编译 | 部分支持 |
测评执行要点
1. 权限要求
所有命令需
redis-cli可执行权限配置文件需
root或redis用户权限读取
2. 现场核查重点
密码策略:检查
requirepass是否为弱口令(如123456、redis等)网络隔离:确认Redis仅监听内网IP,无公网暴露
命令禁用:必须禁用
FLUSHALL、CONFIG、DEBUG等高危命令持久化策略:RDB和AOF至少启用一种,且备份文件权限正确
3. 版本差异注意
Redis 6.0以下:无ACL功能,需通过
requirepass+ 网络隔离实现访问控制Redis 6.0+:必须使用ACL实现细粒度权限控制,废弃
requirepassRedis 7.0+:支持
selectors实现更复杂的权限规则
常用命令速查
# 连接与信息 redis-cli -h<host>-p<port>-a<password> INFO redis-cli PING # 测试连通性 redis-cli MONITOR # 实时监控(慎用,性能影响大) # 配置管理 redis-cli CONFIG GET <parameter> redis-cli CONFIG SET <parameter><value> redis-cli CONFIG REWRITE # 持久化当前配置到文件 # 数据操作 redis-cli INFO keyspace # 查看Key统计 redis-cli DBSIZE # 当前库Key数量 redis-cli SCAN 0 COUNT 100# 安全遍历Key(替代KEYS *) # 客户端管理 redis-cli CLIENT LIST # 查看所有连接 redis-cli CLIENT KILL <ip:port># 断开指定连接 redis-cli CLIENT PAUSE 30000# 暂停客户端30秒 # 持久化 redis-cli SAVE # 同步保存RDB(阻塞) redis-cli BGSAVE # 异步保存RDB redis-cli BGREWRITEAOF # 重写AOF文件 # 集群管理 redis-cli CLUSTER NODES redis-cli CLUSTER INFO redis-cli CLUSTER FAILOVER # 手动故障转移参考标准:GB/T 22239-2019、GB/T 28448-2019、Redis Security Guide、CIS Redis Benchmark
适用版本:Redis 6.2.x / 7.0.x / 7.2.x
验证环境:Standalone / Sentinel / Cluster 模式