介绍
Redis是一款开源的内存数据结构存储,擅长缓存。 非关系数据库Redis以其灵活性,性能,可扩展性和广泛的语言支持而闻名。
Redis专为可信赖环境中的可信客户使用而设计,并且没有自己的强大安全功能。 但是,Redis具有一些安全功能 ,包括基本的未加密密码和命令重命名和禁用。 本教程提供了有关如何配置这些安全功能的说明,还介绍了一些可以提高CentOS 7上独立Redis安装安全性的其他设置。
请注意,本指南不涉及Redis服务器和客户端应用程序位于不同主机或不同数据中心的情况。 Redis流量必须遍历不安全或不可信网络的安装需要一组不同的配置,例如在Redis机器之间设置SSL代理或VPN 。
先决条件
要按照本教程进行操作,您需要:
- 使用我们的初始服务器安装程序为CentOS 7配置一个CentOS 7 Droplet。
- Firewalld使用本指南进行安装和配置,直至并包括“打开防火墙”步骤。
有了这些先决条件,我们就可以安装Redis并执行一些初始配置任务。
第1步 - 安装Redis
在我们安装Redis之前,我们必须首先为Enterprise Linux(EPEL)存储库添加Extra Packages到服务器的软件包列表。 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
Output● 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,我们可以开始对其进行配置以增强其安全性。
第2步 - 绑定Redis并使用防火墙进行保护
保护Redis的有效方法是保护它运行的服务器。 您可以通过确保Redis仅绑定到本地主机或专用IP地址并且服务器启动并运行防火墙来实现此目的。
但是,如果您选择使用本教程设置Redis集群,那么您将更新配置文件以允许从任何地方进行连接,这不像绑定到本地主机或私有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防火墙规则。 通过查看我们的Iptables要领指南,您可以了解更多关于Iptables的信息。
请记住,使用任一防火墙工具都可以。 重要的是防火墙已启动并运行,以便未知个人无法访问您的服务器。 在下一步中,我们将配置Redis只能使用强密码进行访问。
第3步 - 配置Redis密码
如果您使用如何在CentOS 7教程中配置Redis集群来安装Redis,则应该为其配置密码。 根据您的决定,现在您可以按照本节的说明制作更安全的密码。 如果尚未设置密码,本节中的说明将介绍如何设置数据库服务器密码。
配置Redis密码可启用其内置安全功能之一 - auth
命令 - 它要求客户端在被允许访问数据库之前进行身份验证。 与bind
设置一样,密码直接在Redis的配置文件/etc/redis.conf
配置。 重新打开该文件:
sudo vi /etc/redis.conf
滚动到SECURITY
部分,并查找注释如下的指令:
# requirepass foobared
通过删除#
取消注释,并将其更改为您选择的非常强大的密码。 您可以使用像apg
或pwgen
这样的工具来生成密码,而不是自己pwgen
密码。 但是,如果您不想安装仅用于生成密码的应用程序,则可以使用下面的命令。
请注意,按照写入的方式输入此命令将会每次生成相同的密码。 要创建与其生成的密码不同的密码,请将引号中的单词改为任何其他单词或短语。
echo "digital-ocean" | sha256sum
虽然生成的密码不可发音,但它是一个非常强大和非常长的密码,这正是Redis所需的密码类型。 在复制并粘贴该命令的输出作为requirepass
的新值requirepass
,它应为:
requirepass password_copied_from_output
如果您喜欢较短的密码,请改为使用下面的命令输出。 再次,改变引号中的单词,使其不会生成与此相同的密码:
echo "digital-ocean" | sha1sum
设置密码后,保存并关闭文件,然后重新启动Redis:
sudo systemctl restart redis.service
要测试密码是否有效,请访问Redis命令行:
redis-cli
以下是用于测试Redis密码是否工作的一系列命令。 第一个命令尝试在认证之前将密钥设置为值。
set key1 10
由于我们还没有进行身份验证,因此这不起作用,所以Redis返回错误。
Output(error) NOAUTH Authentication required.
以下命令使用Redis配置文件中指定的密码进行身份验证。
auth your_redis_password
Redis将承认我们已通过身份验证:
OutputOK
之后,再次运行上一个命令应该是成功的:
set key1 10
OutputOK
get key1
命令向Redis查询新密钥的值。
get key1
Output"10"
最后一条命令退出redis-cli
。 你也可以使用exit
:
quit
现在,未经授权的用户很难访问您的Redis安装。 但请注意,如果没有SSL或VPN,如果您要远程连接到Redis,未加密的密码对外部用户仍然可见。
接下来,我们将重新命名Redis命令,以进一步保护Redis免受恶意行为人的侵害。
第4步 - 重命名危险命令
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中可能被滥用的方式 。
要禁用或终止命令,只需将其重命名为空字符串,如下所示:
# It is also possible to completely kill a command by renaming it into
# an empty string:
#
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
OutputOK
假定您将CONFIG命令重命名为ASC12_CONFIG ,尝试使用config
命令应该失败。
config get requirepass
Output(error) ERR unknown command 'config'
调用重命名的命令应该是成功的(它不区分大小写):
asc12_config get requirepass
Output1) "requirepass"
2) "your_redis_password"
最后,你可以退出redis-cli
:
exit
请注意,如果您已经在使用Redis命令行,然后重新启动Redis,则需要重新进行身份验证。 否则,如果你输入一个命令,你会得到这个错误:
OutputNOAUTH Authentication required.
关于重命名命令,在/etc/redis.conf
文件的SECURITY
部分末尾有一个警告声明,其内容如下:
Please note that changing the name of commands that are logged into the AOF file or transmitted to slaves may cause problems.
这意味着,如果重命名的命令不在AOF文件中,或者如果它是,但AOF文件没有传输到从机,那么应该没有问题。 请记住,您正在重命名命令。 重命名命令的最佳时机是在不使用AOF持久性时或在安装后(即在部署了Redis使用应用程序之前)。
当您使用AOF并处理主从安装时,请从项目的GitHub问题页面中考虑此答案。 以下是对作者问题的回复:
这些命令会记录到AOF并以与发送方式相同的方式复制到从机,所以如果尝试在不具有相同重命名的实例上重播AOF,则可能会遇到不一致情况,因为命令无法执行(同样的Minion)。
在这种情况下处理重命名的最佳方式是确保重命名的命令应用于主从安装的所有实例。
第5步 - 设置数据目录所有权和文件权限
在这一步中,我们将考虑您可以进行的一些所有权和权限更改,以改进Redis安装的安全配置文件。 这涉及确保只有需要访问Redis的用户才有权读取其数据。 该用户默认情况下是redis用户。
您可以在其父目录的长列表中通过grep
-ing验证Redis数据目录。 命令及其输出如下。
ls -l /var/lib | grep redis
Outputdrwxr-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用户 ,由root用户组拥有二级所有权:
ls -l /etc/redis.conf
Output-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
Outputtotal 40
-rw------- 1 redis redis 29716 Sep 22 18:32 /etc/redis.conf
最后,重新启动Redis:
sudo service redis-server restart
恭喜,您的Redis安装现在应该更安全!
结论
请记住,一旦有人登录到您的服务器,就很容易规避我们实施的Redis特有的安全功能。 这就是为什么本教程中最重要的安全功能是防火墙的原因,因为这样可以防止未知用户首先登录到服务器。
如果您尝试通过不可信网络保护Redis通信,则必须采用SSL代理,正如Redis 官方Redis安全指南中的Redis开发人员所建议的那样。