7.4 Redis 安全性


文档摘要

7.4 Redis 安全性 7.4.1 Redis 安全性的重要性 在深入细节之前,我们首先需要理解 Redis 安全性的重要性。Redis 默认情况下,为了追求性能,并没有启用很多安全特性。这意味着,如果你的 Redis 服务暴露在不受信任的网络环境中,或者配置不当,就可能面临以下安全风险: 未经授权访问: 攻击者可以连接到你的 Redis 实例,读取、修改甚至删除数据,导致数据泄露或业务中断。 命令滥用: 某些 Redis 命令(如 , , 等)具有潜在的危险性,如果被恶意利用,可能导致严重后果,例如清空所有数据、修改配置、执行恶意 Lua 脚本等。 拒绝服务 (DoS): 攻击者可以通过发送大量的请求或执行资源密集型操作,导致 Redis 服务过载,无法响应正常请求,造成服务不可用。

7.4 Redis 安全性

7.4.1 Redis 安全性的重要性

在深入细节之前,我们首先需要理解 Redis 安全性的重要性。Redis 默认情况下,为了追求性能,并没有启用很多安全特性。这意味着,如果你的 Redis 服务暴露在不受信任的网络环境中,或者配置不当,就可能面临以下安全风险:

  • 未经授权访问: 攻击者可以连接到你的 Redis 实例,读取、修改甚至删除数据,导致数据泄露或业务中断。

  • 命令滥用: 某些 Redis 命令(如 FLUSHALL, CONFIG SET, EVAL 等)具有潜在的危险性,如果被恶意利用,可能导致严重后果,例如清空所有数据、修改配置、执行恶意 Lua 脚本等。

  • 拒绝服务 (DoS): 攻击者可以通过发送大量的请求或执行资源密集型操作,导致 Redis 服务过载,无法响应正常请求,造成服务不可用。

  • 提权攻击: 在某些情况下,如果 Redis 运行在特权用户下,并且存在漏洞,攻击者可能利用漏洞提升权限,控制整个服务器。

因此,采取必要的安全措施来保护 Redis 服务至关重要。

7.4.2 Redis 安全加固的核心策略

Redis 安全加固是一个多层次的过程,涉及网络安全、身份验证、访问控制、命令限制、安全审计等多个方面。以下是 Redis 安全加固的核心策略:

  1. 网络隔离: 将 Redis 服务部署在受信任的网络环境中,例如内网或 VPC。避免将 Redis 直接暴露在公网上。如果必须对外提供服务,应使用防火墙或网络安全组进行访问控制,限制允许访问 Redis 的 IP 地址或网段。

  2. 身份验证 (Authentication): 启用 Redis 的密码认证功能,防止未经授权的客户端连接。Redis 提供了 requirepass 配置项来实现简单的密码认证。

  3. 访问控制列表 (ACLs): Redis 6 引入了强大的 ACLs (Access Control Lists) 功能,并在 Redis 7 中得到进一步增强。ACLs 可以实现更细粒度的权限控制,例如基于用户、命令、键、通道等进行权限管理。

  4. 命令重命名与禁用: 对于具有潜在危险的命令,可以通过 rename-command 配置项进行重命名,或者使用 disable-command 配置项完全禁用。

  5. TLS/SSL 加密: 对于需要通过不安全网络传输数据的场景,应启用 TLS/SSL 加密,保护数据在传输过程中的机密性和完整性。

  6. 安全审计与日志: 启用 Redis 的安全审计功能,记录关键的安全事件,例如认证失败、ACL 违规等。同时,配置合适的日志级别,记录 Redis 的运行状态,便于问题排查和安全分析。

  7. 操作系统安全: 确保 Redis 服务器的操作系统安全,及时更新补丁,配置防火墙,限制不必要的服务和端口。

  8. 最小权限原则: 运行 Redis 进程的用户应遵循最小权限原则,避免使用 root 用户运行 Redis 服务。

  9. 定期安全审查: 定期进行 Redis 安全审查,检查配置是否合理,是否存在安全漏洞,并及时修复。

7.4.3 代码实践与配置详解

接下来,我们将针对上述核心策略,结合 Redis 7 的特性,提供具体的代码实践和配置详解。

7.4.3.1 网络隔离与防火墙配置

网络隔离是 Redis 安全的第一道防线。最佳实践是将 Redis 部署在私有网络中,例如 VPC (Virtual Private Cloud)。如果需要对外提供服务,则需要配置防火墙或网络安全组,限制访问来源。

实践建议:

  • 监听地址绑定:redis.conf 配置文件中,使用 bind 指令绑定 Redis 监听的 IP 地址。建议绑定内网 IP 地址,避免绑定 0.0.0.0 或外网 IP 地址。例如:
bind 127.0.0.1 192.168.1.100

这将使 Redis 监听本地回环地址 127.0.0.1 和内网 IP 地址 192.168.1.100

  • 防火墙配置 (以 iptables 为例): 配置防火墙规则,只允许特定 IP 地址或网段访问 Redis 端口 (默认 6379)。例如,只允许 192.168.1.0/24 网段访问 Redis:
# 清空所有已有的 iptables 规则 (谨慎操作,生产环境请根据实际情况调整) iptables -F # 允许来自 192.168.1.0/24 网段的 IP 访问 Redis 端口 (假设 Redis 端口为 6379) iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 6379 -j ACCEPT # 拒绝所有其他来源的访问 iptables -A INPUT -p tcp --dport 6379 -j DROP # 保存 iptables 规则 (不同发行版保存方式可能不同,例如 CentOS 使用 service iptables save)

7.4.3.2 身份验证 (requirepass)

requirepass 是 Redis 最基本的身份验证机制。配置 requirepass 后,客户端连接 Redis 实例时,需要先使用 AUTH 命令提供密码才能进行后续操作。

配置方法:

  • 修改 redis.conf:redis.conf 文件中,找到 requirepass 配置项,并设置一个强密码。例如:
requirepass your_strong_password
  • 重启 Redis 服务: 修改配置文件后,需要重启 Redis 服务使配置生效。

  • 客户端连接验证: 客户端连接 Redis 时,需要先执行 AUTH 命令进行身份验证。例如,使用 redis-cli 连接:

redis-cli -h <redis_host> -p <redis_port> > AUTH your_strong_password OK > PING PONG

注意事项:

  • 选择强密码: 密码应足够复杂,包含大小写字母、数字和特殊字符,并定期更换。

  • 密码泄露风险: requirepass 密码是明文存储在配置文件中的,需要注意配置文件的安全,防止泄露。建议限制配置文件的访问权限,只有授权用户才能读取。

7.4.3.3 访问控制列表 (ACLs)

ACLs 是 Redis 6 及以上版本引入的更强大的访问控制机制。它可以实现更细粒度的权限管理,例如:

  • 用户管理: 可以创建多个用户,并为每个用户分配不同的权限。

  • 命令权限: 可以限制用户可以执行的 Redis 命令。

  • 键权限: 可以限制用户可以访问的键空间。

  • 通道权限: 可以限制用户可以订阅和发布的通道。

ACLs 相关命令:

  • ACL SETUSER <username> [PASS <password>|NOPASS] [USER <user ...>] [RESETPASS] [COMMAND +<command>|-<command>|allcommands|defaultcommands ... ] [CATEGORY +<category>|-<category>|allcategories|defaultcategories ... ] [KEYS +<pattern>|-<pattern>|allkeys|resetkeys ... ] [CHANNELS +<pattern>|-<pattern>|allchannels|resetchannels ... ] [PERM <permission> ... ] [SETNAME <clientname>] [CLIENTNAME <clientname>] [RENAMEUSER <newname>] [DELUSER <user ...>]: 用于创建、修改用户及其权限。

  • ACL GETUSER <username>: 获取用户的 ACL 规则。

  • ACL DELUSER <username> ...: 删除用户。

  • ACL LIST: 列出所有已定义的用户及其 ACL 规则。

  • ACL LOG [COUNT <count>] [RESET]: 查看 ACL 审计日志。

  • ACL WHOAMI: 查看当前连接的用户信息。

  • ACL GENPASS [<bits>]: 生成随机密码。

  • ACL CAT [categoryname]: 列出命令类别或特定类别的命令。

ACLs 代码实践:

1. 创建用户并设置密码:

redis-cli > ACL SETUSER myuser PASS mypassword OK

这将创建一个名为 myuser 的用户,并设置密码为 mypassword

2. 限制用户只能执行 GETSET 命令:

redis-cli > ACL SETUSER myuser COMMAND +get +set -@all OK

COMMAND +get +set 表示允许执行 GETSET 命令,-@all 表示拒绝所有其他命令类别(默认情况下,命令按类别组织,例如 @read, @write, @admin 等,@all 代表所有类别)。

3. 限制用户只能访问以 prefix: 开头的键:

redis-cli > ACL SETUSER myuser KEYS +prefix:* -@all OK

KEYS +prefix:* 表示允许访问以 prefix: 开头的键,-@all 再次拒绝所有其他命令类别。

4. 使用 ACL 用户进行连接:

redis-cli -u myuser -p mypassword > INFO # Server redis_version:7.0.0 ... > SET key value OK > GET key "value" > CONFIG GET requirepass # 尝试执行被禁止的命令 (error) NOPERM operation not permitted

5. 查看用户 ACL 规则:

redis-cli > ACL GETUSER myuser user myuser on # flags: no-auth passwords: 1 user-set # 1 password(s) accessflags: commands: +get +set keys: +prefix:* channels:

6. 查看 ACL 审计日志:

redis-cli > ACL LOG 1) 1) timestamp: 1678886400 2) client: addr=127.0.0.1:54321 fd=8 name=myuser age=1 idle=1 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=26 qbuf-free=32738 obl=0 oll=0 omem=0 tot-mem=29107 3) user: myuser 4) command: config 5) denied_command: config 6) res: -NOPERM

最佳实践:

  • 启用 ACLs: 强烈建议在生产环境中启用 ACLs,并根据实际业务需求进行细粒度的权限控制。

  • 最小权限原则: 为每个用户分配最小必要的权限,避免过度授权。

  • 定期审查 ACLs 配置: 随着业务发展,用户的权限需求可能会发生变化,需要定期审查和调整 ACLs 配置。

  • 使用 ACL 日志进行审计: 定期查看 ACL 日志,监控是否有异常的访问行为。

7.4.3.4 命令重命名与禁用 (rename-command, disable-command)

某些 Redis 命令具有潜在的危险性,例如 FLUSHALL, CONFIG SET, EVAL 等。可以通过 rename-command 配置项重命名这些命令,或者使用 disable-command 配置项完全禁用。

配置方法:

  • 修改 redis.conf:redis.conf 文件中,使用 rename-commanddisable-command 配置项。例如:
rename-command FLUSHALL "" # 将 FLUSHALL 命令重命名为空字符串,相当于禁用 rename-command CONFIG very_secret_config_command # 将 CONFIG 命令重命名为 very_secret_config_command disable-command EVAL # 完全禁用 EVAL 命令
  • 重启 Redis 服务: 修改配置文件后,需要重启 Redis 服务使配置生效。

实践示例:

  • 禁用 FLUSHALL 命令:
rename-command FLUSHALL ""

重启 Redis 后,客户端尝试执行 FLUSHALL 命令将会报错:

redis-cli > FLUSHALL (error) ERR unknown command `FLUSHALL`, did you mean `FLUSHDB`, `FUNCTION`, `FUNCTION LOAD`, `FUNCTION DELETE`, `FUNCTION DUMP`, `FUNCTION RESTORE`, `FUNCTION FLUSH`, `FUNCTION LIST`, `FUNCTION KILL`, `FUNCTION STATS`, `FUNCTION EXISTS`, `FUNCTION HELP`?
  • 重命名 CONFIG 命令:
rename-command CONFIG very_secret_config_command

重启 Redis 后,客户端需要使用重命名后的命令才能执行 CONFIG 操作:

redis-cli > CONFIG GET requirepass (error) ERR unknown command `CONFIG`, did you mean `CLIENT`, `CLUSTER`, `COMMAND`, `COPY`, `CLIENT KILL`, `CLIENT LIST`, `CLIENT GETNAME`, `CLIENT PAUSE`, `CLIENT REPLY`, `CLIENT SETNAME`, `CLIENT UNPAUSE`, `CONFIG GET`, `CONFIG RESETSTAT`, `CONFIG SET`, `CONFIG REWRITE`, `CONFIG HELP`? > very_secret_config_command GET requirepass 1) "requirepass" 2) "your_strong_password"

注意事项:

  • 谨慎禁用命令: 禁用某些命令可能会影响 Redis 的功能,需要谨慎评估并选择禁用哪些命令。

  • 重命名命令的安全性: 重命名命令只是增加了一点安全门槛,并不能完全阻止攻击者。如果攻击者能够猜到重命名后的命令,仍然可以执行危险操作。因此,命令重命名应该与其他安全措施结合使用。

7.4.3.5 TLS/SSL 加密

对于需要通过不安全网络传输数据的场景,例如公网,应启用 TLS/SSL 加密,保护数据在传输过程中的机密性和完整性。Redis 7 支持原生 TLS/SSL 加密。

配置方法:

  • 生成 TLS/SSL 证书和私钥: 可以使用 OpenSSL 等工具生成自签名证书或购买权威机构颁发的证书。
# 生成私钥 (server.key) openssl genrsa -out server.key 2048 # 生成自签名证书 (server.crt),有效期 365 天 openssl req -new -x509 -days 365 -key server.key -out server.crt

在生成证书时,需要填写一些信息,例如国家、省份、城市、组织名称、通用名称 (Common Name,通常是 Redis 服务器的域名或 IP 地址) 等。

  • 修改 redis.conf:redis.conf 文件中,配置 TLS/SSL 相关参数:
tls-port 6380 # 启用 TLS 监听端口 (默认 6380,可以自定义) port 0 # 关闭明文监听端口 (可选,如果只需要 TLS 连接) tls-cert-file /path/to/server.crt # 证书文件路径 tls-key-file /path/to/server.key # 私钥文件路径 # tls-ca-cert-file /path/to/ca.crt # CA 证书文件路径 (可选,用于客户端证书验证) # tls-auth-clients no # 是否需要客户端证书验证 (可选,默认 no)
  • 重启 Redis 服务: 修改配置文件后,需要重启 Redis 服务使配置生效。

  • 客户端连接 TLS/SSL Redis: 使用支持 TLS/SSL 的 Redis 客户端连接 Redis 的 TLS 端口 (默认 6380)。例如,使用 redis-cli 连接:

redis-cli -h <redis_host> -p 6380 --tls > PING PONG

注意事项:

  • 证书管理: 妥善保管证书和私钥,定期更换证书。

  • 性能影响: TLS/SSL 加密会带来一定的性能开销,需要根据实际业务需求进行评估。

  • 客户端支持: 确保客户端也支持 TLS/SSL 连接。

7.4.3.6 安全审计与日志 (SECURITY LOG)

Redis 7 引入了 SECURITY LOG 命令,用于查看安全审计日志。默认情况下,安全审计日志是禁用的,需要手动启用。

配置方法:

  • 修改 redis.conf:redis.conf 文件中,配置 security-enabled yes 启用安全审计日志:
security-enabled yes
  • 重启 Redis 服务: 修改配置文件后,需要重启 Redis 服务使配置生效。

  • 查看安全审计日志: 使用 SECURITY LOG 命令查看安全审计日志:

redis-cli > SECURITY LOG 1) 1) timestamp: 1678887000 2) event: acl-log-default-user 3) username: default 4) command: get 5) client: 127.0.0.1:54322

SECURITY LOG 命令可以接受 COUNT <count> 参数,用于指定返回日志条数,默认为 10 条。也可以使用 RESET 参数清空日志。

日志内容:

安全审计日志会记录以下类型的事件:

  • acl-log-default-user: 默认用户 (default) 尝试执行被拒绝的操作。

  • acl-log-user-error: 用户尝试执行被拒绝的操作。

  • acl-log-unknown-user: 未知用户尝试连接。

  • auth-failed: 认证失败事件。

最佳实践:

  • 启用安全审计日志: 建议在生产环境中启用安全审计日志,以便监控安全事件。

  • 定期分析日志: 定期分析安全审计日志,及时发现和处理安全风险。

  • 结合其他日志: 可以将安全审计日志与 Redis 的其他日志 (例如慢查询日志、错误日志) 结合起来进行分析,更全面地了解 Redis 的运行状态和安全状况。

7.4.4 其他安全建议

除了上述核心策略和代码实践,还有一些其他的安全建议可以增强 Redis 的安全性:

  • 操作系统安全加固: 对 Redis 服务器的操作系统进行安全加固,例如:

    • 及时更新操作系统补丁。

    • 配置防火墙,限制不必要的服务和端口。

    • 禁用不必要的系统服务。

    • 安装安全软件 (例如入侵检测系统 IDS)。

    • 限制 Redis 配置文件和日志文件的访问权限。

  • 使用非特权用户运行 Redis: 避免使用 root 用户运行 Redis 服务,创建一个专门的 Redis 用户,并赋予最小必要的权限。

  • 限制 Redis 进程资源使用: 可以使用操作系统的资源控制机制 (例如 cgroups) 限制 Redis 进程的 CPU、内存等资源使用,防止 DoS 攻击。

  • 监控 Redis 运行状态: 使用监控工具监控 Redis 的运行状态,例如 CPU 使用率、内存使用率、连接数、命令执行速度等,及时发现异常情况。

  • 定期安全漏洞扫描: 定期使用安全漏洞扫描工具扫描 Redis 服务,及时发现和修复安全漏洞。

  • 关注 Redis 安全公告: 关注 Redis 官方的安全公告,及时了解 Redis 的最新安全漏洞和修复方案。

7.4.5 总结

Redis 安全性是一个复杂而重要的课题,需要从多个层面进行加固。本文详细介绍了 Redis 7 环境下的安全加固策略和代码实践,包括网络隔离、身份验证、访问控制、命令限制、TLS/SSL 加密、安全审计等。通过合理配置和持续的安全维护,可以有效提升 Redis 服务的安全性,保护数据和业务安全。


发布者: 作者: 转发
评论区 (0)
U