Redis是一个开源的内存数据结构存储,擅长缓存。Redis是一个非关系型数据库,以其灵活性,性能,可伸缩性和广泛的语言支持而闻名。
由于Redis没有自己的强大安全功能,Redis需要在受信任环境中的受信任客户端使用,但是,Redis有一些安全功能,包括基本的未加密密码和命令重命名和禁用。本教程提供了有关如何配置这些安全功能的说明,还介绍了一些其他可以提高CentOS 7上独立Redis安装安全性的设置。
请注意,本教程不涉及Redis服务器和客户端应用程序位于不同主机或不同数据中心的情况。Redis流量在不安全或不受信任的网络的安装将需要不同的配置,例如在Redis计算机之间设置SSL代理或V**。
要学习本教程,你需要:
sudo
命令的非root账号的CentOS服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后在购买服务器。满足这些条件,我们就可以安装Redis,然后进行一些简单配置。
在我们安装Redis之前,我们必须首先将Enterprise Linux(EPEL)额外软件包添加到服务器的软件包列表中。EPEL是一个包存储库,包含许多开源附加软件包,其中大部分都是由Fedora项目维护的。
我们可以使用yum
安装EPEL
sudo yum install epel-release
EPEL安装完成后,你可以再次使用yum
命令安装Redis :
sudo yum install redis -y
这可能需要几分钟才能完成。安装完成后,启动Redis服务:
sudo systemctl start redis.service
如果你希望Redis开机启动,可以使用enable
命令:
sudo systemctl enable redis
你可以通过运行以下命令来检查Redis的状态:
sudo systemctl status redis.service
● redis.service - Redis persistent key-value database
Loaded: loaded (/usr/lib/systemd/system/redis.service; disabled; vendor preset: disabled)
Drop-In: /etc/systemd/system/redis.service.d
└─limit.conf
Active: active (running) since Thu 2018-03-01 15:50:38 UTC; 7s ago
Main PID: 3962 (redis-server)
CGroup: /system.slice/redis.service
└─3962 /usr/bin/redis-server 127.0.0.1:6379
一旦确认Redis正在运行,请使用以下命令测试安装程序:
redis-cli ping
作为响应,这应该会输出PONG
。如果是这种情况,则意味着你现在已在服务器上运行Redis,我们可以开始对其进行配置以增强其安全性。
保护Redis的有效方法是保护正在运行的服务器。你可以通过确保Redis仅绑定到localhost或私有IP地址并且服务器并运行防火墙来实现。
但是,如果你选择使用本教程设置Redis群集,则你将更新配置文件以允许来自外网的连接,这不如绑定到localhost或私有IP那样安全。
要解决此问题,请打开Redis配置文件进行编辑:
sudo vi /etc/redis.conf
找到以bind
开头的行,并确保它已取消注释(删除#
,就是取消注释):
bind 127.0.0.1
如果你需要将Redis绑定到另一个IP地址(例如你将从单独的主机访问Redis),我们强烈建议你将其绑定到专用IP地址。绑定到公共IP地址会增加Redis界面对外部方的暴露程度。
bind your_private_ip
如果你已遵循先决条件并在服务器上安装了firewalld,并且你不打算从其他主机连接到Redis,则无需为Redis添加任何额外的防火墙规则。毕竟,除非防火墙规则明确允许,否则默认情况下将丢弃任何传入流量。由于Redis服务器的默认独立安装仅在环回接口(127.0.0.1
或localhost)上进行侦听,因此不应关注其默认端口上的传入流量。
但是,如果你计划从其他主机访问Redis,则需要使用该firewall-cmd
命令对firewalld进行一些更改。同样,你应该只允许使用其私有IP地址从主机访问Redis服务器,以限制你的服务的主机数量。
首先,在你的firewalld规则中添加专用的Redis区域:
sudo firewall-cmd --permanent --new-zone=redis
然后,指定你要打开的端口。Redis 默认使用6397
端口:
sudo firewall-cmd --permanent --zone=redis --add-port=6379/tcp
接下来,指定应允许通过防火墙并访问Redis的专用IP地址:
sudo firewall-cmd --permanent --zone=redis --add-source=client_server_private_IP
运行这些命令后,重新加载防火墙:
sudo firewall-cmd --reload
当防火墙从客户端的IP地址查看数据包时,它会将专用Redis的规则应用于该连接。所有其他连接将由默认public
区域处理。默认区域中的服务适用于每个连接,而不仅仅是那些未明确匹配的连接,因此你无需将其他服务(例如SSH)添加到Redis区域,因为这些规则将自动应用于该连接。
如果选择使用Iptables设置防火墙,利用需要授予利用的辅助主机访问Redis正在使用的端口的权限:
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -p tcp -s client_servers_private_IP/32 --dport 6397 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -P INPUT DROP
确保使用你的发行版提供的机制保存Iptables防火墙规则。请记住,使用任一防火墙工具都可以。重要的是防火墙已启动并运行。在下一步中,我们将配置Redis只能使用强密码进行访问。如果您使用的是腾讯云的CVM服务器,您可以直接在腾讯云控制台中的安全组进行设置。
在本节中将说明如何设置Redis数据库服务器密码。配置Redis密码可启用其内置安全功能之一 - auth
命令 - 要求客户端在允许访问数据库之前进行身份验证。与bind
设置一样,密码直接在Redis的配置文件中配置。重新打开/etc/redis.conf
文件:
sudo vi /etc/redis.conf
滚动到SECURITY
部分并查找注释指令:
# requirepass foobared
删除#
,取消注释,把foobared
替换成一个安全的密码。你可以使用类似apg
或pwgen
生成密码,而不是自己制作密码。但是,如果想用工具生成密码,则可以使用以下命令。
请注意,重复输入此命令。每次生成的都是相同的密码。要创建与此生成的密码不同的密码,请将引号中的单词换掉:
echo "Tencent-Cloud" | sha256sum
这将生成非常长的一个密码,这正是Redis所需的密码类型。复制并粘贴在requirepass
后,如下所示:
requirepass password_copied_from_output
如果你更喜欢较短的密码,请使用以下命令。
echo "Tencent-Cloud" | sha1sum
设置密码后,保存并关闭文件,然后重新启动Redis:
sudo systemctl restart redis.service
要测试密码是否有效,请访问Redis命令行:
redis-cli
以下是用于测试Redis密码是否有效的命令序列。我们设置一个key
,并且添加一个value
:
set key1 10
由于我们尚未经过身份验证,所以Redis会返回错误。
(error) NOAUTH Authentication required.
使用以下命令进行身份验证。
auth your_redis_password
验证通过:
OK
之后,再次运行上一个命令应该是成功的:
set key1 10
OK
get key1
命令查询key1
的值。
get key1
"10"
使用quit
,退出redis-cli
,也可以使用exit
:
quit
现在,未经授权的用户很难访问你的Redis安装。但请注意,如果你正在远程连接到Redis,如果没有SSL或V**,外部各方仍可以看到未加密的密码。
接下来,我们将重新命名Redis命令,以进一步保护Redis免受恶意攻击者的攻击。
Redis内置的另一个安全功能允许你重命名或完全禁用某些被视为危险的命令。当由未经授权的用户运行时,此类命令可用于重新配置,销毁或以其他方式擦除数据。一些已知危险的命令包括:
FLUSHDB
FLUSHALL
KEYS
PEXPIRE
DEL
CONFIG
SHUTDOWN
BGREWRITEAOF
BGSAVE
SAVE
SPOP
SREM
RENAME
DEBUG
这不是一个全面的列表,但是我们建议您重命名或禁用该列表中的所有命令。是否禁用或重命名命令是特定于站点的。如果你知道永远不会使用的命令,那么你可以禁用它。
与身份验证密码一样,重命名或禁用命令在/etc/redis.conf
文件的SECURITY
部分中配置。要启用或禁用Redis命令,请再次打开配置文件进行编辑:
sudo vi /etc/redis.conf
注意:这些是示例。你应该选择禁用或重命名对你有意义的命令。你可以自己检查命令,并确定如何在redis.io/commands中利用这些命令。要禁用或终止命令,只需将其重命名为空字符串,如下所示:
# 要使一个命令失效,那就把它命名成
# 一个空的字符串:
#
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""
接下来是重命名,如下例所示。重命名后的命令应该让其他人难以猜测,但你自己很容易记住:
rename-command CONFIG ""
rename-command SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG
保存并退出,然后重新Redis:
sudo service redis-server restart
测试一下效果,请进入Redis命令行:
redis-cli
先使用之前设定的密码验证一下:
auth your_redis_password
OK
假设你将CONFIG命令重命名为ASC12_CONFIG,使用config
命令应该会失败。
config get requirepass
(error) ERR unknown command 'config'
用重命名的命令应该是成功的(它不区分大小写):
asc12_config get requirepass
Output
1) "requirepass"
2) "your_redis_password"
退出redis-cli
:
exit
请注意,重新启动Redis,则需要重新进行身份验证。否则,则会出现此错误: NOAUTH Authentication required. 关于重命名命令,
/etc/redis.conf
文件中SECURITY
部分的末尾有一条警告声明,内容如下: 请注意,更改登录到AOF文件或传输到从服务器的命令的名称可能会导致问题。 这意味着如果重命名的命令不在AOF文件中,或者如果它是但AOF文件尚未传输给从属,则应该没有问题。在重命名命令时请记住这一点。重命名命令的最佳时间是在你不使用AOF持久性时或安装后(即在部署Redis-using应用程序之前)。 当你使用AOF并处理主从安装时,请从项目的GitHub问题页面中考虑此答案。以下是对作者问题的回复: 这些命令记录到AOF并以与发送方式相同的方式复制到从站,因此如果你尝试在没有相同重命名的实例上重放AOF,则可能会因为命令无法执行而面临不一致。 在这种情况下处理重命名的最佳方法是确保重命名的命令应用于所有主从安装实例。
在此步骤中,我们将告诉你更改哪些东西,来改进Redis安装的安全配置文件。这涉及确保只有需要访问Redis的用户才有权读取其数据。默认情况下,用户是redis用户。
运行以下命令,查到Redis的当前用户。
ls -l /var/lib | grep redis
drwxr-xr-x 2 redis redis 4096 Aug 6 09:32 redis
你可以看到,Redis数据目录属于Redis用户,并授予Redis组二次访问权。这个所有权设置是安全的,但是文件夹的权限(设置为755)是不安全的。要确保只有Redis用户有权访问文件夹及其内容,请将权限设置更改为770:
sudo chmod 770 /var/lib/redis
你应该更改的另一个权限是Redis配置文件的权限。默认情况下,它拥有644的文件权限,并由root拥有,由根组拥有二级所有权:
ls -l /etc/redis.conf
-rw-r--r-- 1 root root 30176 Jan 14 2014 /etc/redis.conf
该许可(644)是全局可读的。这会带来安全问题,因为配置文件包含你在步骤4中配置的未加密密码,这意味着我们需要更改配置文件的所有权和权限。理想情况下,它应由redis用户拥有,由redis组拥有次要所有权。为此,请运行以下命令:
sudo chown redis:redis /etc/redis.conf
然后更改权限,以便只有文件的所有者有读写权限:
sudo chmod 660 /etc/redis.conf
你可以使用以下方法验证新的所有权和权限:
ls -l /etc/redis.conf
total 40
-rw------- 1 redis redis 29716 Sep 22 18:32 /etc/redis.conf
最后,重启Redis:
sudo service redis-server restart
你的Redis安装现在应该更加安全!
请记住,一旦有人登录到你的服务器,就很容易绕过我们已经做的安全防护。这就是为什么本教程中涉及的最重要的安全功能是防火墙,因为它可以防止未知用户首先登录到你的服务器。如果你尝试通过不受信任的网络保护Redis通信,则必须使用Redis开发人员在Redis官方安全指南中推荐的SSL代理。如何设置此证书取决于你是否拥有可解析该服务器的域名。
更多Linux教程请前往腾讯云+社区学习更多知识。
参考文献:《How to Install and Secure Redis on Centos7》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。