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

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐