通常情况redis服务器总是放在内网并只允许内部服务器访问的,所以redis生来就不怎么关注安全问题,默认的redis-server配置允许任何访问。但总会有某些情况下,我们需要将redis暴露给外网,这时候就需要给redis-server加上些安全措施,你总不会希望有其他人能访问你的redis-server吧。
1. 设置防火墙
在redis服务器的防火墙(或者iptables)上设置只允许受信任的主机访问redis端口。这是最基本的安全策略。
2. 绑定本地网卡
修改redis.conf文件,添加
bind 127.0.0.1
这样做使得redis-server只接受本地访问。即使有外部主机通过了防火墙,也无法访问redis-server。
注意,bind指令不能绑定除本地网卡ip外的其他ip。也就是说,不能通过bind外部主机的ip来允许外部主机的访问,这只能通过防火墙来实现。
3. 添加密码验证
修改redis.conf文件,添加
requirepass your-password
redis的执行效率非常快,外部设备每秒可以测试相当多数量的密码,所以密码要尽量长尽量复杂。
redis的密码是明文存储在redis.conf文件,因此不需要管理员记住。所以可以使用相当长的密码。
密码验证的目标是提供第二层的安全保障。这样当防火墙失效的话,外部主机在没有密码的情况下仍然不能访问redis。
4. 指令重命名
修改redis.conf文件,将一些高危的指令重命名为难以猜出的名字,或者直接重命名为空字符串””来禁用该指令。
# 重命名CONFIG指令 rename-command CONFIG XXX_CONFIG # 禁用FLUSHALL指令 rename-command FLUSHALL "" rename-command FLUSHDB "" # 禁用EVAL指令 rename-command EVAL ""
4.1 处理CONFIG命令改名后phpRedisAdmin无法使用的问题
由于我部署了一个phpRedisAdmin网站来管理redis。phpRedisAdmin需要用到redis的CONFIG命令,所以改名的话,phpRedisAdmin就无法识别了。这时需要修改phpRedisAdmin源码中的/vendor/src/Command/ServerConfig.php文件,让ServerConfig->getId()方法返回改名后的XXX_CONFIG即可。
5. 修改redis运行账户
给系统新建一个无登陆权限的redis用户
useradd -s /sbin/nologin redis
然后修改redis目录的所有者
最后使用sudo -u redis来执行redis命令
sudo -u redis /usr/local/bin/redis-server /etc/redis/redis.conf