介绍
Redis是一个开源的内存数据结构存储,擅长缓存,一个非关系数据库,Redis以其灵活性,性能,可扩展性和广泛的语言支持而闻名。
Redis 被设计用于可信客户在受信任的环境中使用,并且没有强大的安全功能。 然而,Redis 拥有 一些安全功能,其中包括基本的未加密密码和命令重命名和禁用。
请注意,本指南不涉及 Redis 服务器和客户端应用程序在不同的主机或不同数据中心的情况。 安装中 Redis 流量必须穿过不安全或不受信任的网络将需要不同的配置,例如在 Redis 机器之间设置 SSL 代理或 VPN。
前提条件
要跟随这个教程,你需要:
- One CentOS 7 Droplet 使用我们的 CentOS 7 初始服务器设置配置。
- 使用 本指南安装和配置的防火墙,包括
打开防火墙
步骤
有了这些先决条件,我们已经准备好安装Redis并执行一些初始配置任务。
步骤 1 - 安装 Redis
在我们安装 Redis 之前,我们必须首先将 Extra Packages for Enterprise Linux (EPEL) 存储库添加到服务器的包列表中。
我们可以使用yum
来安装EPEL:
1sudo yum install epel-release
一旦EPEL安装完成,您可以安装Redis,再次使用yum
:
1sudo yum install redis -y
安装完成后,请启动 Redis 服务:
1sudo systemctl start redis.service
如果你想让 Redis 启动,你可以使用启用
命令启用它:
1sudo systemctl enable redis
您可以通过运行以下操作来检查 Redis 的状态:
1sudo systemctl status redis.service
1[secondary_label Output]
2● redis.service - Redis persistent key-value database
3 Loaded: loaded (/usr/lib/systemd/system/redis.service; disabled; vendor preset: disabled)
4 Drop-In: /etc/systemd/system/redis.service.d
5 └─limit.conf
6 Active: active (running) since Thu 2018-03-01 15:50:38 UTC; 7s ago
7 Main PID: 3962 (redis-server)
8 CGroup: /system.slice/redis.service
9 └─3962 /usr/bin/redis-server 127.0.0.1:6379
一旦您确认 Redis 确实在运行,请使用此命令测试设置:
1redis-cli ping
如果是这样的话,这意味着您现在在您的服务器上运行了 Redis,我们可以开始配置它以提高其安全性。
步骤 2 – 绑定 Redis 并使用防火墙保护它
一个有效的方式来保护 Redis 是保护它正在运行的服务器,您可以通过确保 Redis 仅连接到 localhost 或私人 IP 地址,并且服务器有一个防火墙。
但是,如果您选择使用 本教程设置 Redis 集群,那么您将更新配置文件以允许从任何地方连接,这并不像绑定到 localhost 或私人 IP 那样安全。
若要修复此问题,请打开 Redis 配置文件以编辑:
1sudo vi /etc/redis.conf
查找从绑定
开始的行,并确保它没有评论:
1[label /etc/redis.conf]
2bind 127.0.0.1
如果您需要将 Redis 绑定到另一个 IP 地址(例如在您将从单独的主机访问 Redis 的情况下),我们强烈鼓励您将其绑定到私人 IP 地址。
1[label /etc/redis.conf]
2bind your_private_ip
如果你已经遵循了前提条件,并在你的服务器上安装了防火墙,而你没有计划从另一个主机连接到Redis,那么你不需要为Redis添加任何额外的防火墙规则。 毕竟,如果防火墙规则明确允许,任何流量将默认下降。
然而,如果您计划从另一个主机访问 Redis,则需要使用防火墙-cmd
命令对您的防火墙配置做出一些更改。
首先,在您的防火墙策略中添加一个专用的 Redis 区域:
1sudo firewall-cmd --permanent --new-zone=redis
然后,指定您想要打开哪个端口 Redis 默认使用端口 6379
:
1sudo firewall-cmd --permanent --zone=redis --add-port=6379/tcp
接下来,指定任何私人IP地址,应该允许通过防火墙并访问Redis:
1sudo firewall-cmd --permanent --zone=redis --add-source=client_server_private_IP
运行这些命令后,重新加载防火墙以执行新规则:
1sudo firewall-cmd --reload
在此配置下,当防火墙从客户端的 IP 地址看到一个包时,它会将专用 Redis 区的规则应用于该连接。所有其他连接将由默认的公共
区处理。默认区中的服务适用于每个连接,而不仅仅是那些不明确匹配的连接,所以您不需要将其他服务(如 SSH)添加到 Redis 区,因为这些规则将自动应用于该连接。
如果您选择 使用 Iptables 设置防火墙,则需要通过以下命令授予副主机访问 Redis 正在使用的端口:
1sudo iptables -A INPUT -i lo -j ACCEPT
2sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
3sudo iptables -A INPUT -p tcp -s client_servers_private_IP/32 --dport 6379 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
4sudo iptables -P INPUT DROP
请确保使用您的分布提供的机制来保存您的 Iptables 防火墙规则. 您可以通过查看我们的 Iptables 基本指南来了解更多关于 Iptables 的信息。
请记住,使用任何一个防火墙工具都会起作用。重要的是,防火墙已启动并运行,以便未知个人无法访问您的服务器。
步骤3 — 配置 Redis 密码
如果您使用了 How To Configure a Redis Cluster on CentOS 7 教程安装了 Redis,则您应该为其配置密码。
配置 Redis 密码允许其内置的安全功能之一 - 命令auth
- 要求客户端在允许访问数据库之前进行身份验证。
1sudo vi /etc/redis.conf
滚动到安全
部分,并寻找评论的指令,该指令写道:
1[label /etc/redis.conf]
2# requirepass foobared
通过删除#
,并将foobared
更改为您选择的非常强大的密码,而不是自己创建密码,您可以使用一个工具,如apg
或pwgen
来生成一个。
请注意,输入此命令以书面方式将每次生成相同的密码. 要创建与此生成的密码不同的密码,请将引文中的单词更改为任何其他单词或短语。
1echo "digital-ocean" | sha256sum
虽然生成的密码不会发音,但它是一个非常强大和非常长的密码,这正是Redis所需的密码类型。
1[label /etc/redis.conf]
2requirepass password_copied_from_output
如果您喜欢更短的密码,请使用下面命令的输出代替。
1echo "digital-ocean" | sha1sum
设置密码后,保存并关闭文件,然后重新启动 Redis:
1sudo systemctl restart redis.service
要测试密码是否有效,请访问 Redis 命令行:
1redis-cli
以下是用于测试 Redis 密码是否有效的命令序列,第一个命令试图在身份验证之前为值设置密钥。
1set key1 10
这不会起作用,因为我们尚未被验证,所以Redis返回错误。
1[secondary_label Output]
2(error) NOAUTH Authentication required.
以下命令使用 Redis 配置文件中指定的密码进行身份验证。
1auth your_redis_password
Redis 将确认我们已被验证:
1[secondary_label Output]
2OK
此后,运行前一个命令应该再次成功:
1set key1 10
1[secondary_label Output]
2OK
命令get key1 对新密钥的值进行Redis查询。
1get key1
1[secondary_label Output]
2"10"
这个最后的命令输出redis-cli
。你也可以使用exit
:
1quit
但是,请注意,如果没有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' 部分中。
1sudo vi /etc/redis.conf
<$>[注] **注:这些是例子,您应该选择禁用或更名对您有意义的命令。您可以自己检查命令并确定它们如何被滥用在 redis.io/commands。
若要禁用或杀死命令,只需将命名为空串,如下所示:
1[label /etc/redis.conf]
2# It is also possible to completely kill a command by renaming it into
3# an empty string:
4#
5rename-command FLUSHDB ""
6rename-command FLUSHALL ""
7rename-command DEBUG ""
若要重新命名命令,请将命令命名为另一个名称,如下面的示例。
1[label /etc/redis.conf]
2rename-command CONFIG ""
3rename-command SHUTDOWN SHUTDOWN_MENOT
4rename-command CONFIG ASC12_CONFIG
保存您的更改,关闭文件,然后通过重新启动 Redis 来应用更改:
1sudo systemctl restart redis.service
要测试新命令,请输入 Redis 命令行:
1redis-cli
使用您之前定义的密码进行身份验证:
1auth your_redis_password
1[secondary_label Output]
2OK
假设您将 CONFIG命令更名为 ASC12_CONFIG,则尝试使用config
命令将失败。
1config get requirepass
1[secondary_label Output]
2(error) ERR unknown command 'config'
调用重命名命令应该是成功的(它是案例不敏感):
1asc12_config get requirepass
1[secondary_label Output]
21) "requirepass"
32) "your_redis_password"
最后,你可以离开redis-cli
:
1exit
请注意,如果您已经使用了 Redis 命令行,然后重新启动 Redis,则需要重新验证。
1[secondary_label Output]
2NOAUTH Authentication required.
<$>[警告]
关于重命名命令,在 /etc/redis.conf
文件中的 SECURITY
部分末尾有一个警告声明,该声明说:
」
1[label /etc/redis.conf]
2. . .
3
4# Please note that changing the name of commands that are logged into the
5# AOF file or transmitted to slaves may cause problems.
6
7. . .
这意味着,如果重命令不在AOF文件中,或者如果它是,但AOF文件没有被传送给奴隶,那么应该没有问题。当您重命令时,请记住这一点。
当您使用 AOF 并处理主奴隶安装时,请从该项目的 GitHub 问题页面中考虑这个答案。
命令登录到 AOF,并以相同的方式复制到奴隶,所以如果您尝试在没有相同更名的实例上重播 AOF,您可能会面临不一致,因为命令不能执行(对奴隶来说也是如此)。
在这种情况下,处理重命名的最佳方法是确保重命名命令应用于所有主奴隶安装的实例。
步骤 5 — 设置数据目录所有权和文件权限
在此步骤中,我们将考虑一些所有权和权限的更改,您可以改进您的 Redis 安装的安全配置文件. 这包括确保只有需要访问 Redis 的用户才有读取数据的权限。
您可以通过在其母目录的长列表中对 Redis 数据目录进行抓取
来验证这一点。
1ls -l /var/lib | grep redis
1[secondary_label Output]
2drwxr-xr-x 2 redis redis 4096 Aug 6 09:32 redis
您可以看到 Redis 数据目录由 redis 用户拥有,并向 redis 组授予次要访问权限. 此所有权设置是安全的,但文件夹的权限(设置为 755)不存在。
1sudo chmod 770 /var/lib/redis
您应该更改的另一个权限是 Redis 配置文件的权限. 默认情况下,它具有 644 文件权限,由 root拥有,由 root 组拥有次要权限:
1ls -l /etc/redis.conf
1[secondary_label Output]
2-rw-r--r-- 1 root root 30176 Jan 14 2014 /etc/redis.conf
该权限(644)是世界可读的,这是一个安全问题,因为配置文件包含您在步骤 4 中配置的未加密密码,这意味着我们需要更改配置文件的所有权和权限。
1sudo chown redis:redis /etc/redis.conf
然后更改权限,以便只有文件的所有者才能阅读和/或写入它:
1sudo chmod 600 /etc/redis.conf
您可以使用以下方式验证新的所有权和权限:
1ls -l /etc/redis.conf
1[secondary_label Output]
2total 40
3-rw------- 1 redis redis 29716 Sep 22 18:32 /etc/redis.conf
最后,重新启动 Redis:
1sudo systemctl restart redis.service
恭喜,您的 Redis 安装现在应该更安全!
结论
请记住,一旦有人登录到您的服务器,很容易绕过我们已经设置的Redis特定的安全功能,这就是为什么本教程中涵盖的最重要的安全功能是防火墙,因为它首先防止未知用户登录您的服务器。
如果您试图通过不受信任的网络保护 Redis 通信,则需要使用 SSL 代理,正如 Redis 开发人员在 官方 Redis 安全指南中推荐的那样。