浅谈Redis安全策略
redis 提供了诸多安全策略,比如为了保证数据安全,提供了设置密码的功能。redis 密码设置主要有两种方式:一种是使用cinfig命令来设置密码;另外一种则是手动修改 redis 的配置文件。虽然看似前者更为简单,其实两种方式各有特点。本节将对它们进行介绍。
命令配置密码
通过执行以下命令查看是否设置了密码验证:
127.0.0.1:6379> config get requirepass 1) "requirepass" 2) ""
在默认情况下 requirepass 参数值为空的,表示无需通过密码验证就可以连接到 redis 服务。
下面执行以下命令设置密码。如下所示:
127.0.0.1:6379> config set requirepass "www.jb51.net" ok 127.0.0.1:6379> config get requirepass 1) "requirepass" 2) "www.jb51.net"
执行完上述操作后,客户端要连接到 redis 服务就需要密码验证,如果不验证就无法操作 redis 数据库。如下所示:
127.0.0.1:6379> set key name www.biancheng.net #报错无法操作 (error) noauth authentication required.
使用auth命令验证密码:
127.0.0.1:6379> auth www.jb51.net ok #执行命令成功 127.0.0.1:6379> set name www.jb51.net ok 127.0.0.1:6379> get name www.jb51.net
注意:通过命令行设置的密码并非永久有效,当您重启服务后密码就会失效,所以一般不采用这种方式。下面介绍一种永久有效的修改方式,也就是手动配置密码。
手动配置密码
手动修改配置密码也非常的简单,首先,您要在 redis 的安装目录中找到 redis.windows.conf 配置文件,然后打开该文件,并使用 ctrl+f 搜索 requirepass 关键字,找到配置项并配置密码,如下所示:
# requirepass foobared requirepass www.jb51.net //配置自己的密码
然后使用更改后的配置文件重启服务器,依次执行以下命令:
#首先停止服务: c:\users\administrator>redis-server.exe --service-stop #重启服务器 c:\users\administrator>redis-server.exe --service-start #重新登陆 c:\users\administrator>redis-cli.exe -h 127.0.0.1 -p 6379 -a www.jb51.net warning: using a password with '-a' or '-u' option on the command line interface may not be safe. #命令执行成功 127.0.0.1:6379>config get requirepass 1)"requirepass" 2)"www.jb51.net"
手动配置无须验证密码,只需要重新启动 redis 服务器。这种配置方式,密码永远有效。如果想取消密码设置,您需要将配置文件更改回原来的状态,然后再次重启服务器,即可取消。
除了需要为 redis 配置密码外,我们在使用 redis 时也需要注意一些常见的安全风险以及防范措施,从而避免数据泄露和丢失,以及人为操作失误等。
指令安全
redis 有一些非常危险的命令,这些命令会对 redis 的稳定以及数据安全造成非常严重的影响。比如 keys 指令会导致 redis 卡顿,而 flushdb 和 flushall 会让 redis 的所有数据全部清空。那么如何避免这些操作失误带来的灾难性后果呢?
redis 在配置文件中提供了 rename-command 指令用于将某些危险的指令修改成特别的名称,用来避免人为误操作。比如在配置文件的 security 模块增加以下内容:
rename-command keys 123keys123
如果您还想执行 keys 命令,那就需要在命令行输入123keys123。 当然也可以将指令 rename 成空字符串,这样就无法通过字符串来执行 keys 命令了。
rename-command flushall ""
端口安全
redis 默认监听*:6379,如果当前的服务器主机有外网地址,那么 redis 的服务将会直接暴露在公网上,别有用心的人使用适当的探测工具就可以对 ip 地址进行端口扫描,从而威胁您的系统安全。
如果 redis 的服务地址一旦可以被外网直接访问,其内部数据就彻底丧失了安全性。黑客们可以通过 redis 执行 lua 脚本拿到服务器权限,然后清空您的 redis 数据库。因此务必在 redis 的配置文件中绑定要监听的 ip 地址,避免类似的情况发生。如下所示:
bind 193.168.1.1 #绑定外网ip地址
不仅如此,还可以增加 redis 的密码访问限制,客户端必须使用 auth 命令传入正确的密码才可以访问 redis。
requirepass yourspassword
这样即使地址暴露出去了,普通黑客也无法对 redis 服务器进行任何指令操作。
密码配置也会影响到主从复制。要求从机必须配置与主服务相同的密码才可以进行主从复制。
masterauth yourspassword
ssh代理
redis 不支持 ssl 链接,这意味着客户端和服务器交互的数据不应该在公网上传输,否则会有被窃听的风险。如果必须要在公网上,可以考虑使用 ssl 代理。ssl 代理比较常见的有 ssh。redis 官方也推荐了一种代理工具,也就是 spiped (点击了解)。 其功能虽然单一,但使用起来比较简单,易于理解。
补充:
1. 开启redis密码认证,并设置高复杂度密码
redis在redis.conf配置文件中,设置配置项requirepass, 开户密码认证。
打开redis.conf,找到requirepass所在的地方,修改为指定的密码,密码应符合复杂性要求:
1、长度8位以上
2、包含以下四类字符中的三类字符:
英文大写字母(a 到 z)
英文小写字母(a 到 z)
10 个基本数字(0 到 9)
非字母字符(例如 !、$、#、%、@、^、&)
3、避免使用已公开的弱密码,如:abcd.1234 、admin@123等
再去掉前面的#号注释符,然后重启redis
2. 禁止监听在公网
redis监听在0.0.0.0,可能导致服务对外或内网横向移动渗透风险,极易被黑客利用入侵。
在redis的配置文件redis.conf中配置如下:
bind 127.0.0.1或者内网ip,然后重启redis
3. 禁止使用root用户启动
使用root权限去运行网络服务是比较有风险的(nginx和apache都是有独立的work用户,而redis没有)。redis crackit 漏洞就是利用root用户的权限来替换或者增加authorized_keys,来获取root登录权限的
使用root切换到redis用户启动服务: useradd -s /sbin/nolog -m redis sudo -u redis /<redis-server-path>/redis-server /<configpath>/redis.conf
4. 限制redis 配置文件访问权限
因为redis密码明文存储在配置文件中,禁止不相关的用户访问改配置文件是必要的,设置redis配置文件权限为600,
chmod 600 /<filepath>/redis.conf
5. 修改默认6379端口
避免使用熟知的端口,降低被初级扫描的风险
编辑文件redis的配置文件redis.conf,找到包含port的行,将默认的6379修改为自定义的端口号,然后重启redis
6. 禁用或者重命名危险命令
redis中线上使用keys *命令,也是非常危险的。因此线上的redis必须考虑禁用一些危险的命令,或者尽量避免谁都可以使用这些命令,redis没有完整的管理系统,但是也提供了一些方案。
修改 redis.conf 文件,添加 rename-command flushall "" rename-command flushdb "" rename-command config "" rename-command keys "" rename-command shutdown "" rename-command del "" rename-command eval "" 然后重启redis。 重命名为"" 代表禁用命令,如想保留命令,可以重命名为不可猜测的字符串,如: `rename-command flushall joyapnxrpmcarcr4zdgc`
7. 打开保护模式
redis默认开启保护模式。要是配置里没有指定bind和密码,开启该参数后,redis只能本地访问,拒绝外部访问。
redis.conf安全设置: # 打开保护模式 protected-mode yes
8. redis集群设置密码
1,如果是使用redis-trib.rb工具构建集群,集群构建完成前不要配置密码,集群构建完毕再通过config set + config rewrite命令逐个机器设置密码
2,如果对集群设置密码,那么requirepass和masterauth都需要设置,否则发生主从切换时,就会遇到授权问题,可以模拟并观察日志
3,各个节点的密码都必须一致,否则redirected就会失败
# redis-cli -c -p 7004 127.0.0.1:7004> config set masterauth frank ok 127.0.0.1:7004> config set requirepass frank ok 127.0.0.1:7004> config rewrite (error) noauth authentication required. 127.0.0.1:7004> auth frank ok 127.0.0.1:7004> config rewrite ok 127.0.0.1:7004> exit [root@izj6c7eeosj2t5vjw8rf4xz redis_cluster]# redis-cli -c -p 7004 -a frank
4,设置密码之后如果需要使用redis-trib.rb的各种命令报错问题
如:
# redis-trib.rb check 47.52.41.245:7003 [err] sorry, can't connect to node 47.52.41.245:7003
解决办法:
找到建立集群时执行gem install redis命令生成的client.rb文件,如果不知道该文件在哪可以通过下面命令查找
# find / -name client.rb -print /tmp/frank/ruby/ruby-2.2.8/lib/xmlrpc/client.rb /usr/local/lib/ruby/gems/2.2.0/gems/redis-4.0.0/lib/redis/client.rb /usr/local/lib/ruby/2.2.0/xmlrpc/client.rb
我这边的那个文件是/usr/local/lib/ruby/gems/2.2.0/gems/redis-4.0.0/lib/redis/client.rb
然后修改该文件
# vim /usr/local/lib/ruby/gems/2.2.0/gems/redis-4.0.0/lib/redis/client.rb
修改password对应的值然后保存,就可以了
require_relative "errors" require "socket" require "cgi" class redis class client defaults = { :url => lambda { env["redis_url"] }, :scheme => "redis", :host => "127.0.0.1", :port => 6379, :path => nil, :timeout => 5.0, :password => "frank", :db => 0, :driver => nil, :id => nil, :tcp_keepalive => 0, :reconnect_attempts => 1, :inherit_socket => false } attr_reader :options
重新运行redis-trib.rb命令
redis-trib.rb check 47.52.41.245:7003 >>> performing cluster check (using node 47.52.41.245:7003) s: cc86a24f3896ad7530e2687cf52582912f74b661 47.52.41.245:7003 slots: (0 slots) slave replicates 908430b2bf63669898e9eaef79dd6c1b33c8c57a m: 668397aba571ece85532b1eb1fccb42e4e33b1f2 116.196.65.198:7001
9. 使用redis5.0版本创建的集群设置密码
直接一步到位,在创建集群前,在配置文件中设置好密码(所有配置文件的密码保持一致),然后使用命令创建集群时在后面加上-a password参数。
这样一来,生成的集群进行访问时已经包含访问密码了,不用再事后设置了。
到此这篇关于浅谈redis安全策略的文章就介绍到这了,更多相关redis安全策略内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!