Jeff Notes

Redis的安全配置

前段时间,经常在群里看到有同学在讨论服务器被挖矿木马入侵的问题。研究了一下,发现许多木马利用了 Redis 的安全漏洞实现入侵,以下整理了一些 Redis 安全加固的配置,予以防范。
 

信任内网运行,尽量避免公网访问


Redis 自身只有一个密码控制访问,不能设置用户权限和 IP 限制。默认假设 Redis 运行在可以信任的网络环境中。

如果正常业务中 Redis 服务需要被其他服务器访问,可以通过 iptables 策略,仅允许指定的 IP 访问 Redis 服务。

$ iptables -A INPUT -s x.x.x.x -p tcp --dport 6379 -j ACCEPT

 

绑定 Redis 监听的网络接口


如果服务器有多个 IP,可限定 Redis server 监听的 IP;通过 Redis 配置项 bind,可同时绑定多个 IP。

bind 127.0.0.1 192.168.13.12
# 在 redis.conf 配置文件中绑定本机 IP

 

禁止 root 用户启动 Redis


使用普通用户启动,安全性往往高很多;业务程序永远别用 root 用户运行。

以较低权限账号运行 Redis 服务,并禁用该账号的登录权限。以下操作创建了一个无 home 目录权限,且无法登录的普通账号:

$ useradd -M -s /sbin/nologin [username]

 

限制 Redis 文件目录访问权限


设置 Redis 的主目录权限为 700;如果 Redis 配置文件独立于 Redis 主目录,权限修改为 600,因为 Redis 密码明文存储在配置文件中。

$ chmod 700 /var/lib/redis
$ chmod 600 /etc/redis/redis.conf

 

避免使用熟知端口


程序运行尽量避免使用熟知端口,降低被初级扫描的风险。

port 6666
# 在 redis.conf 配置文件中修改监听端口

 

开启 Redis 密码认证,并设置高复杂度密码


Redis 在 redis.conf 配置文件中,设置配置项requirepass,开启密码认证。

$ vim /etc/redis/redis.conf
requirepass ed4c39b015b0e46f074dbfd0a9a4ab278f63340a6d640999f25c68a932fef815

Redis 因查询效率高,auth 这种命令每秒能处理 10w 次以上,简单的 Redis 密码极容易为攻击者暴破。

requirepass长度至少 20位 以上,为方便可使用特殊串命令sha256sum生成 64位 的无特殊字符串。

$ echo "dfasdERQEWRQEW31341dfadsfadsf" | sha256sum
af970b3691a0774b2a5adae1375e14cd9e5db3591564f0eb789c2324cc02362f  -

 

禁用或重命名危险命令


Redis 无权限分离,其管理员账号和普通账号无明显区分。攻击者登录后可执行任意操作,因此需要隐藏以下重要命令:FLUSHDB FLUSHALL KEYS PEXPIRE DEL CONFIG SHUTDOWN BGREWRITEAOF BGSAVE SAVE SPOP SREM RENAME DEBUG EVAL

另外,在 Redis 2.8.1 及 Redis 3.x (低于 3.0.2) 版本下存在 EVAL 沙箱逃逸漏洞,攻击者可通过该漏洞执行任意 Lua 代码。

下述配置将config flushdb flushall设置为空,即禁用该命令;也可设置为一些复杂的、难以猜测的名字。

rename-command CONFIG ""
rename-command flushall ""
rename-command flushdb ""
rename-command shutdown shotdown_test

保存后,执行/etc/init.d/redis-server restart重启生效。
 

其它


  1. 监控 Redis 安全状态,cmdstat_auth cmdstat_flushdb/flushall监控报警。
  2. Redis 设计旨在提供高性能的 K/V 服务,至少目前在权限访问控制和数据持久化方面比较弱化。所以禁止在 Redis 中存储或缓存敏感的明文数据。

  3. 针对之前 Redis 版本,默认无 bind 和密码设置存在很大安全风险;Redis 3.2 版本提供了新特性 protected mode(保护模式)。
    如果 Redis 在启动时,未开启 bind 密码设置功能,只能通过回环地址本地访问,如果尝试远程访问 Redis,会提示以下错误:

    DENIED Redis is running protected mode because protected mode is enabled,
    no bind address was specified, no authentication password is requested to clients.
    In this mode connections are only accepted from the loopback interface.

  当然也可以直接执行CONFIG SET protected-mode no,关闭保护模式。

  1. Redis Cluster 不支持密码。

 
 

参考:
https://dwz.cn/kcNSJyTj
https://dwz.cn/utvFx0Na
https://dwz.cn/B5KcYfBI