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安全策略内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!