Redis安全规范—-check list.
1.信任的内网运行,尽量避免有公网访问
1
2
|
在
/etc/redis/redis
.conf中配置如下:
bind 127.0.0.1
|
2.绑定redis监听的网络接口
如果服务器有多个IP,可限定redis server监听的IP,通过redis配置项bind,可同时绑定多个IP
3.设置防火墙
如果需要其他机器访问,或者设置了slave模式,那就记得加上相应的防火墙设置,命令如下:
1
|
iptables -A INPUT -s x.x.x.x -p tcp --dport 6379 -j ACCEPT
|
4.禁止root用户启动redis
设置一个单独的redis账户很有必要,redis crackit就利用到了root用户的特性来重置authorized_keys。首先创建一个redis账户,然后通过该账户启动。
1
|
setsid
sudo
-u redis
/usr/bin/redis-server
/etc/redis/redis
.conf
|
启动之后应该如下:
1
2
|
root@kali:~
# ps -elf|grep redis
1 S redis 14720 1 0 80 0 - 8979 - 08:40 ? 00:00:00
/usr/bin/redis-server
/etc/redis/redis
.conf` `
|
5.限制redis文件目录访问权限
设置redis的主目录权限为700,如果redis配置文件独立于redis主目录,权限修过为600,因为redis密码明文存储在配置文件中.
6.避免使用熟知的端口,降低被初级扫描的风险
1
|
在
/etc/redis/redis
.conf中配置如下
|
1
|
找到port 6379这行,把6379改为8888
|
7.开启redis密码认证,并设置高复杂度密码
redis在redis.conf配置文件中,设置配置项requirepass, 开户密码认证。
redis因查询效率高,auth这种命令每秒能处理10w次以上,简单的redis的密码极容易为攻击者暴破。
1
2
3
4
5
|
root@kali:~
# redis-cli -h 192.168.10.2
redis 192.168.10.2:6379> keys *
(error) ERR operation not permitted
redis 192.168.10.2:6379> auth @nsF0cus!@
#
OK
|
1
2
|
root@kali:~
# echo -e "xxlegend"|sha256sum
b59869cac63a67e7ee97e6923a75811ff58bd4936ed3be3480b46145d43ae335`
|
8.禁用或者重命名危险命令
这个漏洞就利用config/save两个命令完成攻击 。 因redis无用户权限限制,建议危险的命令,使用rename配置项进行禁用或重命名,这样外部不了解重命名规则攻击者,就不能执行这类命令。涉及到的命令:
1
|
FLUSHDB, FLUSHALL, KEYS, PEXPIRE, DEL, CONFIG, SHUTDOWN, BGREWRITEAOF, BGSAVE, SAVE, SPOP, SREM, RENAME, DEBUG, EVAL`
|
以下示例:redis.config文件禁用FLUSHDB、FLUSHALL两个命令;重命名CONFIG、SHUTDOWN命令,添加一个特殊的后缀。 这样redis启动后,只能运行CONFIG_b9fc8327c4dee7命令,不能执行CONFIG命令。
1
2
3
4
|
rename-
command
CONFIG CONFIG_b9fc8327c4dee7
rename-
command
SHUTDOWN SHUTDOWN_b9fc8327c4dee7
rename-
command
FLUSHDB “”
rename-
command
FLUSHALL “”
|
上述配置将config,flushdb,flushall设置为了空,即禁用该命令,我们也可以命名为一些攻击者难以猜测,我们自己却容易记住的的名字。保存之后,执行/etc/init.d/redis-server restart 重启生效。
9.禁止redis中存储敏感的明文数据
Redis设计旨在提供高性能的KV服务,至少目前在权限访问控制和数据持久化方面比较弱化。所以禁止在Redis中存储或缓存敏感的明文数据
10.安全监控
建立蜜罐网络,有攻击尝试时,可及时发现
监控redis安全状态,cmdstat_auth cmdstat_flushdb/flushall监控报警
题外话:
redis cluster不支持密码问题
redis 原生cluster模式最新3.2版本都不支持开启密码认证,导致内网使用只能无密码,只能通过前面其他安全设置来保证内网redis cluster的安全性
针对之前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关闭保护模式