Redis 是一种内存中、NoSQL、键值缓存和存储,也可以持久保存到磁盘上。
本教程展示如何实现 Redis 服务器的基本安全性。
但是,请记住,Redis 是为以下用户而设计的:值得信赖的客户 in a 可信环境,本身没有强大的安全功能。为了强调这一点,这里引用Redis 官方网站:
Redis 旨在由受信任环境中的受信任客户端进行访问。这意味着通常将 Redis 实例直接暴露到 Internet 或一般情况下暴露到不受信任的客户端可以直接访问 Redis TCP 端口或 UNIX 套接字的环境并不是一个好主意。
. . .
一般来说,Redis 并不是为了最大安全性而优化的,而是为了最大性能和简单性而优化的。
没有安全性的性能和简单性将导致灾难。即使 Redis 拥有的少数安全功能也确实没有什么值得称赞的。其中包括:基本的未加密密码以及命令重命名和禁用。它缺乏真正的访问控制系统。
然而,配置现有的安全功能仍然比不保护数据库安全迈出了一大步。
在本教程中,您将了解如何配置 Redis 具有的少数安全功能,以及其他一些系统安全功能,这些功能将提高 Ubuntu 14.04 上独立 Redis 安装的安全状况。
请注意,本指南不涉及 Redis 服务器和客户端应用程序位于不同主机或不同数据中心的情况。 Redis 流量必须穿越不安全或不受信任的网络的安装需要一组完全不同的配置,例如设置 SSL 代理或VPN除了此处给出的之外,Redis 机器之间的关系。
对于本教程,您需要:
-
添加了 sudo 用户的 Ubuntu 14.04 服务器,来自初始服务器设置
-
iptables 配置使用这个 iptables 指南,向上通过(可选)更新名称服务器步骤(如果不进行名称服务器配置部分,APT 将无法工作)。配置名称服务器后,您就完成了
-
Redis 使用仅主安装中的说明进行安装和工作本 Redis 指南,向上通过第 2 步 — 配置 Redis Master step
首先使用 SSH 登录到您的服务器:
-
ssh username@server-ip-address
要检查 Redis 是否正常工作,请使用 Redis 命令行。这redis-cli
命令用于访问Redis命令行。
如果您已经为 Redis 设置了密码,则必须auth
连接后。
Output
OK
测试数据库服务器:
回复:
Output
PONG
Exit:
如果您遵循 iptables 的先决条件,请随意跳过此步骤。或者,你现在就可以做。
Redis 只是一个在您的服务器上运行的应用程序,并且由于它自己没有真正的安全功能,因此真正保护它的第一步是首先保护它所运行的服务器。
对于像 Ubuntu 14.04 服务器这样面向公众的服务器,请按照以下方式配置防火墙这个 iptables 指南这是第一步。点击该链接并立即设置您的防火墙。
如果您已使用该指南实施了防火墙规则,则无需为 Redis 添加额外的规则,因为默认情况下,除非明确允许,否则所有传入流量都会被丢弃。由于 Redis 服务器的默认独立安装仅在环回接口(127.0.0.1 或 localhost)上侦听,因此不应担心其默认端口上的传入流量。
如果您需要专门允许Redis的IP地址,您可以检查Redis正在侦听的IP地址以及它绑定的端口grep
- 的输出netstat
命令。第四栏——127.0.0.1:6379这里 — 表示与 Redis 关联的 IP 地址和端口组合:
-
sudo netstat -plunt | grep -i redis
Output
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 8562/redis-server 1
确保您的防火墙策略允许此 IP 地址。有关如何添加规则的更多信息,请参阅此iptables 基础知识文章.
默认情况下,只能从本地主机访问 Redis 服务器。但是,如果您按照教程设置了 Redis 主服务器,则您已更新配置文件以允许从任何地方进行连接。这不像绑定到本地主机那样安全。
打开Redis配置文件进行编辑:
-
sudo nano/etc/redis/redis.conf
找到此行并确保其未注释(删除#
如果存在):
/etc/redis/redis.conf
bind 127.0.0.1
我们将继续使用该文件,因此暂时保持打开状态。
如果您使用以下方式安装了 Redis如何在 Ubuntu 14.04 上配置 Redis 集群文章,您应该为其配置密码。您现在可以根据本节自行决定创建更安全的密码。如果没有,本节中的说明将介绍如何设置数据库服务器密码。
配置 Redis 密码可启用其两个内置安全功能之一 -auth
命令,该命令要求客户端进行身份验证才能访问数据库。密码直接在Redis的配置文件中配置,/etc/redis/redis.conf
,您应该仍然在上一步中打开它。
滚动到SECURITY
部分并查找注释指令,内容如下:
/etc/redis/redis.conf
# requirepass foobared
通过删除来取消注释#
,并改变foobared
到一个非常强且非常长的值。
您可以使用类似的工具,而不是自己创建密码apg
or pwgen
生成一个。如果您不想安装应用程序只是为了生成密码,您可以使用下面的单行代码。要生成与实际生成的密码不同的密码,请更改引号中的单词。
-
echo "digital-ocean" | sha256sum
您的输出应该类似于:
Output
960c3dac4fa81b4204779fd16ad7c954f95942876b9c4fb1a255667a9dbe389d
虽然生成的密码无法发音,但它为您提供了一个非常强且非常长的密码,这正是 Redis 所需的密码类型。复制并粘贴该命令的输出作为新值后requirepass
,它应该是:
/etc/redis/redis.conf
requirepass 960c3dac4fa81b4204779fd16ad7c954f95942876b9c4fb1a255667a9dbe389d
如果您更喜欢较短的密码,请改用以下命令的输出。再次更改引号中的单词,这样它就不会生成与此相同的密码:
-
echo "digital-ocean" | sha1sum
这次你会得到更短的输出:
Output
10d9a99851a411cdae8c3fa09d7290df192441a9
设置密码后,保存文件,并重新启动Redis:
要测试密码是否有效,请访问 Redis 命令行:
以下输出显示了用于测试 Redis 密码是否有效的一系列命令。第一个命令尝试在身份验证之前将密钥设置为值。
那是行不通的,所以 Redis 返回一个错误。
Output
(error) NOAUTH Authentication required.
第二条命令使用 Redis 配置文件中指定的密码进行身份验证。
Redis 承认了。
Output
OK
之后重新运行之前的命令即可成功。
Output
OK
get key1
查询 Redis 以获取新键的值。
Output
"10"
最后一条命令退出redis-cli
。您还可以使用exit
:
接下来,我们将了解重命名 Redis 命令。
Redis 内置的另一个安全功能允许您重命名或完全禁用某些被认为危险的命令。
当未经授权的用户运行时,此类命令可用于重新配置、销毁或以其他方式擦除您的数据。与认证密码一样,重命名或禁用命令在同一配置中配置。SECURITY
的部分/etc/redis/redis.conf
file.
一些已知的危险命令包括:FLUSHDB, FLUSHALL, KEYS, PEXPIRE, DEL, CONFIG, SHUTDOWN, BGREWRITEAOF, BGSAVE, SAVE, SPOP, SREM, RENAME and DEBUG。这不是一个完整的列表,但重命名或禁用该列表中的所有命令是一个很好的起点。
无论禁用还是重命名命令都是特定于站点的。如果您知道您永远不会使用可能被滥用的命令,那么您可以禁用它。否则,重命名它。
要启用或禁用 Redis 命令,请再次打开配置文件进行编辑:
-
sudo nano/etc/redis/redis.conf
这些都是例子。您应该选择禁用或重命名对您有意义的命令。您可以自己检查这些命令并确定它们可能如何被滥用:redis.io/命令.
要禁用或终止命令,只需将其重命名为空字符串,如下所示:
/etc/redis/redis.conf
# 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 ""
要重命名命令,请为其指定另一个名称,如下例所示。重命名的命令应该很难让别人猜到,但让你容易记住。不要让自己的生活变得困难。
/etc/redis/redis.conf
rename-command CONFIG ""
rename-command SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG
保存您的更改。
重命名命令后,通过重新启动 Redis 来应用更改:
要测试新命令,请输入 Redis 命令行:
然后,假设您重命名了CONFIG命令到ASC12_配置,以下输出显示如何测试是否已应用新命令。
验证后:
Output
OK
第一次尝试使用config
命令应该失败,因为它已被重命名。
Output
(error) ERR unknown command 'config'
调用重命名的命令应该会成功(不区分大小写):
- asc12_config 获取 requirepass
Output
1) "requirepass"
2) "your_redis_password"
最后,您可以退出redis-cli
:
注意:如果您已经在使用 Redis 命令行,然后重新启动 Redis,则需要重新进行身份验证。否则,如果您键入命令,您将收到此错误:
Output
NOAUTH Authentication required.
关于重命名命令,在末尾有一个警告声明SECURITY
部分在/etc/redis/redis.conf
内容如下:
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 文件尚未传输到从机,那么应该没有问题。
因此,当您尝试重命名命令时请记住这一点。重命名命令的最佳时间是在您不使用 AOF 持久性时,或者在安装之后,即在部署使用 Redis 的应用程序之前。
当您使用 AOF 并处理主从安装时,请考虑该项目的 GitHub 问题页面中的这个答案。以下是对作者问题的答复:
命令被记录到 AOF 并以与发送相同的方式复制到从属设备,因此,如果您尝试在没有相同重命名的实例上重播 AOF,您可能会遇到不一致,因为命令无法执行(对于奴隶来说也是如此)。
因此,在这种情况下处理重命名的最佳方法是确保重命名的命令应用于主从安装中的所有实例。
在此步骤中,我们将考虑您可以进行的一些所有权和权限更改,以提高 Redis 安装的安全配置文件。这涉及确保只有需要访问 Redis 的用户才有权读取其数据。默认情况下,该用户是redis user.
您可以通过以下方式验证这一点grep
-ing 表示其父目录的长列表中的 Redis 数据目录。该命令及其输出如下所示。
-
ls -l/var/lib| grep redis
Output
drwxr-xr-x 2 redis redis 4096 Aug 6 09:32 redis
可以看到Redis数据目录属于redis用户,具有授予的辅助访问权限redis团体。那部分很好。
没有的部分是文件夹的权限,为 755。为了确保只有 Redis 用户有权访问该文件夹及其内容,请将权限更改为 700:
-
sudo chmod 700/var/lib/redis
您应该更改的另一个权限是 Redis 配置文件的权限。默认情况下,它的文件权限为 644,所有者为root,拥有二次所有权root group:
-
ls -l/etc/redis/redis.conf
Output
-rw-r--r-- 1 root root 30176 Jan 14 2014 /etc/redis/redis.conf
该权限 (644) 是世界可读的,这不是一个好主意,因为它包含在步骤 4 中配置的未加密密码。
我们需要更改所有权和权限。理想情况下,它应该由redis用户,拥有二次所有权root用户。为此,请运行以下命令:
-
sudo chownredis:root /etc/redis/redis.conf
然后更改所有权,以便只有文件的所有者可以读取和/或写入它:
-
sudo chmod 600/etc/redis/redis.conf
您可以使用以下方式验证新的所有权和权限:
-
ls -l/etc/redis/redis.conf
Output
total 40
-rw------- 1 redis root 29716 Sep 22 18:32 /etc/redis/redis.conf
最后,重新启动Redis:
请记住,一旦有人登录到您的服务器,就很容易绕过我们设置的 Redis 特定安全功能。因此,最重要的安全功能是让人们极难跳过栅栏。
那应该是你的防火墙。
要将服务器安全性提升到新的水平,您可以配置 OSSEC 等入侵检测系统。要在 Ubuntu 14.04 上配置 OSSEC,请参阅本 OSSEC 指南.
如果您尝试在不受信任的网络上保护 Redis 通信的安全,则必须使用 SSL 代理,正如 Redis 开发人员在官方Redis安全指南。设置 SSL 代理以保护 Redis 通信是一个单独的主题。
我们没有在重命名部分包含 Redis 命令的完整列表。但是,您可以自己检查一下并确定它们可能如何被滥用redis.io/命令.