Redis 是一款高性能的键值数据库,广泛应用于 Web 开发中的缓存服务、消息队列、会话存储等领域。然而,Redis 默认并未启用任何安全措施,如果直接将 Redis 服务暴露在公网上,极易受到各种攻击,例如暴力破解、代码注入、数据泄露等。本文将介绍 Redis 的常见安全风险和防范措施,帮助开发者保护 Redis 服务器的安全。
常见安全风险
- 未设置密码认证:Redis 默认没有开启任何身份验证机制,可以直接连接到 Redis 服务进行读写操作,容易受到暴力破解、恶意操作等攻击。
- 弱密码或明文密码存储:在设置密码认证后,如果密码过于简单或者明文存储在配置文件中,同样容易成为攻击者的攻击目标。
- 未限制客户端 IP:如果 Redis 服务器未设置 IP 过滤,任何 IP 地址都可以连接到 Redis 服务。
- 命令注入攻击:如果攻击者能够伪造 Redis 命令进行注入,就可以轻易地获取到敏感信息,例如用户的密码、Session ID 等。
安全措施
1. 启用密码认证
Redis 6.0 版本开始支持在配置文件中设置密码认证。开启方式如下:
修改 Redis 配置文件
/etc/redis/redis.conf
,找到如下行并修改为所需密码:# requirepass foobared requirepass mypassword
重新启动 Redis 服务。
启用密码认证后,必须使用密码才能连接到 Redis 服务器,否则会返回错误信息。在 Node.js 中连接 Redis 服务器时,可使用以下代码:
// javascriptcn.com 代码示例 const redis = require('redis'); const client = redis.createClient({ host: 'localhost', port: 6379, password: 'mypassword' // 设置密码 }); client.on('connect', function() { console.log('Redis connected'); }); client.on('error', function(err) { console.error(err); });
2. 使用 IP 过滤
Redis 6.0 版本开始支持在配置文件中设置 bind 地址,因此可以使用 iptables 对 Redis 服务进行 IP 过滤。添加规则如下:
# 允许 192.168.0.100 连接 Redis 服务 iptables -A INPUT -p tcp -s 192.168.0.100 --dport 6379 -j ACCEPT
这样,只有 192.168.0.100 这个 IP 地址才能连接到 Redis 服务器,其他 IP 地址则无法访问。如果需要允许多个 IP 地址,只需添加多个规则即可。同时,建议将 Redis 的绑定地址设置为本地回环地址 127.0.0.1
,避免 Redis 服务暴露在公网上。
3. 使用 SSL/TLS 加密
Redis 6.0 版本开始支持 SSL/TLS 加密方式,可以使用证书对 Redis 数据传输进行加密。具体配置方式如下:
生成证书和私钥:
openssl req -x509 -newkey rsa:2048 -keyout redis.key -out redis.crt -days 365 -nodes
将证书和私钥放置在 Redis 配置文件路径下,如
/etc/redis/ssl/redis.crt
和/etc/redis/ssl/redis.key
。修改 Redis 配置文件
/etc/redis/redis.conf
,找到如下行并取消注释:# ssl-cert-file /path/to/redis.crt # ssl-key-file /path/to/redis.key ssl-cert-file /etc/redis/ssl/redis.crt ssl-key-file /etc/redis/ssl/redis.key
重新启动 Redis 服务。
在 Node.js 中连接 Redis 服务器时,可使用以下代码:
// javascriptcn.com 代码示例 const redis = require('redis'); const fs = require('fs'); const client = redis.createClient({ host: 'localhost', port: 6379, tls: { ca: [fs.readFileSync('/etc/redis/ssl/redis.crt')], } }); client.on('connect', function() { console.log('Redis connected'); }); client.on('error', function(err) { console.error(err); });
4. 控制命令使用权限
Redis 6.0 版本开始支持设置命令使用权限,只有授权用户才能执行指定的 Redis 命令。具体操作步骤如下:
在 Redis 配置文件中添加
user
项,指定授权用户和密码:user myusername on <password>
其中,
myusername
是用户名,<password>
是该用户的密码。注意,在使用on <password>
时,需保证<password>
已被 Redis 加密,可通过 Redis 内置命令ACL GENPASS <password>
生成加密后的密码字符串。在 Redis 配置文件中添加
aclfile
项,指定 ACL 文件路径:aclfile /etc/redis/acl.conf
创建 ACL 文件
/etc/redis/acl.conf
,指定$default
规则:user $default on nopass all -@all +@myusername
其中,
$default
表示对所有用户使用默认规则;nopass
表示无需密码即可连接到 Redis 服务;all
表示允许连接的 IPs 和端口列表;-@all
表示禁止所有非白名单用户执行所有 Redis 命令;+@myusername
表示允许myusername
用户执行所有 Redis 命令。重新启动 Redis 服务。
在 Node.js 中连接 Redis 服务器时,可使用以下代码:
// javascriptcn.com 代码示例 const redis = require('redis'); const client = redis.createClient({ host: 'localhost', port: 6379, user: 'myusername', // 设置用户名 password: '<password>', // 设置密码 }); client.on('connect', function() { console.log('Redis connected'); }); client.on('error', function(err) { console.error(err); });
总结
在使用 Redis 时,开发者应该始终保持警惕,了解和防范常见的安全风险。为了保护 Redis 服务器的安全,建议开发者采用多种安全措施,例如设置密码认证、IP 过滤、使用 SSL/TLS 加密、限制命令使用权限等。在具体实践中,建议根据实际情况定制化安全措施,确保 Redis 服务安全可靠。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6531ec187d4982a6eb3f9812