如何在 Ubuntu 14.04 上保护您的 Redis 安装如何在 Ubuntu 14.04 上保护您的 Redis 安装如何在 Ubuntu 14.04 上保护您的 Redis 安装如何在 Ubuntu 14.04 上保护您的 Redis 安装
  • 文章
  • 正则表达式
    • 工具
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容
发表 admin at 2025年2月28日
类别
  • 未分类
标签

如何在 Ubuntu 14.04 上保护您的 Redis 安装

介绍

Redis 是一种内存中的 NoSQL 键值缓存和存储,也可以持久保存到磁盘。

本教程展示了如何为 Redis 服务器实现基本的安全性。

但是,请记住,Redis 是为受信任的客户端 在受信任的环境 中使用而设计的,它本身没有强大的安全功能。为了强调这一点,引用 Redis 官方网站的一段话:

Redis 旨在供受信任环境中的受信任客户端访问。这意味着通常将 Redis 实例直接暴露给 Internet 或通常暴露给不受信任的客户端可以直接访问 Redis TCP 端口或 UNIX 套接字的环境并不是一个好主意。

. . .

通常,Redis 并未针对最大安全性进行优化,而是针对最大性能和简单性进行了优化。

没有安全性的性能和简单性是灾难的根源。即使是 Redis 的一些安全功能也没有什么值得赞扬的。其中包括:一个基本的未加密密码,以及命令重命名和禁用。它缺乏真正的访问控制系统。

但是,配置现有的安全功能仍然是让您的数据库处于不安全状态的一大步。

在本教程中,您将了解如何配置 Redis 的一些安全功能,以及一些其他系统安全功能,这些功能将提高 Ubuntu 14.04 上独立 Redis 安装的安全状况。

请注意,本指南不涉及 Redis 服务器和客户端应用程序位于不同主机或不同数据中心的情况。 Redis 流量必须穿越不安全或不受信任的网络的安装需要一组完全不同的配置,例如除了此处给出的配置之外,还需要在 Redis 机器之间设置 SSL 代理或 VPN。

先决条件

对于本教程,您需要:

  • 从初始服务器设置添加了 sudo 用户的 Ubuntu 14.04 服务器
  • 使用此 iptables 指南配置 iptables,通过(可选)更新名称服务器步骤(如果您不执行名称服务器配置部分,APT 将无法工作)。配置名称服务器后,您就完成了
  • 使用本 Redis 指南中仅主安装的说明安装并运行 Redis,直至第 2 步 — 配置 Redis 主步骤

第 1 步 - 验证 Redis 是否正在运行

首先使用 SSH 登录到您的服务器:

  1. ssh username@server-ip-address

要检查 Redis 是否正常工作,请使用 Redis 命令行。 redis-cli 命令用于访问 Redis 命令行。

  1. redis-cli

如果你已经为 Redis 设置了密码,你必须在连接后auth。

  1. auth your_redis_password
OK

测试数据库服务器:

  1. ping

回复:

PONG

出口:

  1. quit

第 2 步 — 使用 iptables 保护服务器

如果您遵循了 iptables 的先决条件,请随意跳过此步骤。或者,您现在就可以做。

Redis 只是一个在您的服务器上运行的应用程序,因为它自己没有真正的安全功能,所以真正保护它的第一步是首先保护它运行的服务器。

对于像 Ubuntu 14.04 服务器这样的面向公众的服务器,第一步是按照本 iptables 指南配置防火墙。现在点击该链接并设置您的防火墙。

如果您已经使用该指南实施了防火墙规则,那么您不需要为 Redis 添加额外的规则,因为默认情况下,除非明确允许,否则所有传入流量都会被丢弃。由于 Redis 服务器的默认独立安装仅在环回接口(127.0.0.1 或本地主机)上侦听,因此无需担心其默认端口上的传入流量。

如果您需要特别允许 Redis 的 IP 地址,您可以通过 grep -ing netstat 的输出检查 Redis 正在侦听的 IP 地址以及它绑定到的端口命令。第四列——此处为 127.0.0.1:6379——表示与 Redis 关联的 IP 地址和端口组合:

  1. sudo netstat -plunt | grep -i redis
tcp   0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      8562/redis-server 1

确保您的防火墙策略允许此 IP 地址。有关如何添加规则的更多信息,请参阅这篇 iptables 基础文章。

第 3 步 — 绑定到本地主机

默认情况下,Redis 服务器只能从本地主机访问。但是,如果您按照教程设置了 Redis 主服务器,则更新了配置文件以允许来自任何地方的连接。这不如绑定到本地主机安全。

打开 Redis 配置文件进行编辑:

  1. sudo nano /etc/redis/redis.conf

找到这一行并确保它未被注释(如果 # 存在,请将其删除):

bind 127.0.0.1

我们将继续使用这个文件,所以暂时保持打开状态。

第 4 步 — 配置 Redis 密码

如果您使用如何在 Ubuntu 14.04 上配置 Redis 集群一文安装了 Redis,您应该已经为它配置了密码。根据您的判断,您现在可以按照本节设置一个更安全的密码。如果没有,本节中的说明将显示如何设置数据库服务器密码。

配置 Redis 密码可启用其两个内置安全功能之一 - auth 命令,该命令需要客户端进行身份验证才能访问数据库。密码直接在 Redis 的配置文件 /etc/redis/redis.conf 中配置,你应该在上一步中打开它。

滚动到 SECURITY 部分并查找带有注释的指令,内容如下:

# requirepass foobared

通过删除 # 取消注释,并将 foobared 更改为非常强且非常长的值。

您可以使用 apg 或 pwgen 之类的工具来生成密码,而不是自己编写密码。如果您不想仅仅为了生成密码而安装应用程序,您可以使用下面的单行代码。要生成与这将生成的密码不同的密码,请更改引号中的单词。

  1. echo "digital-ocean" | sha256sum

您的输出应该类似于:

960c3dac4fa81b4204779fd16ad7c954f95942876b9c4fb1a255667a9dbe389d

虽然生成的密码不会发音,但它给你一个非常强大和非常长的密码,这正是 Redis 所需的密码类型。将该命令的输出复制并粘贴为 requirepass 的新值后,它应该显示为:

requirepass 960c3dac4fa81b4204779fd16ad7c954f95942876b9c4fb1a255667a9dbe389d

如果您更喜欢较短的密码,请改用以下命令的输出。同样,更改引号中的单词,这样它就不会生成与这个相同的密码:

  1. echo "digital-ocean" | sha1sum

这次你会得到更短的输出:

10d9a99851a411cdae8c3fa09d7290df192441a9

设置密码后,保存文件,重启Redis:

  1. sudo service redis-server restart

要测试密码是否有效,请访问 Redis 命令行:

  1. redis-cli

以下输出显示了用于测试 Redis 密码是否有效的一系列命令。第一个命令尝试在身份验证之前将密钥设置为值。

  1. set key1 10

这行不通,因此 Redis 返回一个错误。

(error) NOAUTH Authentication required.

第二个命令使用 Redis 配置文件中指定的密码进行身份验证。

  1. auth your_redis_password

Redis 承认。

OK

之后,重新运行之前的命令就成功了。

  1. set key1 10
OK

get key1 向 Redis 查询新键的值。

  1. get key1
"10"

最后一个命令退出 redis-cli。您也可以使用 exit:

  1. quit

接下来,我们将看看重命名 Redis 命令。

第 5 步 — 重命名危险命令

Redis 内置的另一个安全功能允许您重命名或完全禁用某些被认为危险的命令。

当由未经授权的用户运行时,此类命令可用于重新配置、销毁或以其他方式擦除您的数据。与身份验证密码一样,重命名或禁用命令是在 /etc/redis/redis.conf 文件的同一 SECURITY 部分中配置的。

一些已知的危险命令包括:FLUSHDB、FLUSHALL、KEYS、PEXPIRE、DEL、CONFIG、SHUTDOWN、BGREWRITEAOF、BGSAVE、SAVE、SPOP、SREM、RENAME 和 DEBUG。这不是一个完整的列表,但重命名或禁用该列表中的所有命令是一个很好的起点。

是否禁用或重命名命令是特定于站点的。如果您知道您永远不会使用可能被滥用的命令,那么您可以禁用它。否则,重命名它。

要启用或禁用 Redis 命令,请再次打开配置文件进行编辑:

  1. sudo nano /etc/redis/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 来应用更改:

  1. sudo service redis-server restart

要测试新命令,请输入 Redis 命令行:

  1. redis-cli

然后,假设您将 CONFIG 命令重命名为 ASC12_CONFIG,以下输出显示如何测试新命令是否已应用。

认证后:

  1. auth your_redis_password
OK

第一次尝试使用 config 命令应该会失败,因为它已被重命名。

  1. config get requirepass
(error) ERR unknown command 'config'

调用重命名的命令应该会成功(不区分大小写):

  1. asc12_config get requirepass
1) "requirepass"
2) "your_redis_password"

最后,您可以退出 redis-cli:

  1. exit

注意:如果您已经在使用 Redis 命令行,然后重新启动 Redis,则需要重新进行身份验证。否则,如果您键入命令,您将收到此错误:

NOAUTH Authentication required.

关于重命名命令,在 /etc/redis/redis.conf 的 SECURITY 部分末尾有一个警告声明,内容如下:

请注意,更改记录到 AOF 文件或传输到从站的命令的名称可能会导致问题。

这意味着如果重命名的命令不在 AOF 文件中,或者如果它在 AOF 文件中但尚未传输到从属服务器,那么应该没有问题。

因此,在尝试重命名命令时请记住这一点。重命名命令的最佳时间是在您未使用 AOF 持久性时,或刚安装后,即在部署使用 Redis 的应用程序之前。

当您使用 AOF 并处理主从安装时,请考虑该项目的 GitHub 问题页面中的这个答案。以下是对作者问题的回复:

命令被记录到 AOF 并以与发送相同的方式复制到从站,因此如果您尝试在没有相同重命名的实例上重放 AOF,您可能会遇到不一致,因为命令无法执行(奴隶也一样)。

因此,在这种情况下处理重命名的最佳方法是确保重命名命令应用于主从安装中的所有实例。

第 6 步 — 设置数据目录所有权和文件权限

在此步骤中,我们将考虑您可以进行的一些所有权和权限更改,以改进 Redis 安装的安全配置文件。这涉及确保只有需要访问 Redis 的用户才有权读取其数据。默认情况下,该用户是 redis 用户。

您可以通过 grep 在其父目录的长列表中对 Redis 数据目录进行验证。命令及其输出如下所示。

  1. ls -l /var/lib | grep redis
drwxr-xr-x 2 redis   redis   4096 Aug  6 09:32 redis

可以看到Redis数据目录归redis用户所有,二级访问权限授予redis组。那部分很好。

不是的部分是文件夹的权限,即 755。要确保只有 Redis 用户可以访问文件夹及其内容,请将权限更改为 700:

  1. sudo chmod 700 /var/lib/redis

您应该更改的另一个权限是 Redis 配置文件的权限。默认情况下,它的文件权限为 644,由 root 拥有,root 组具有二级所有权:

  1. ls -l /etc/redis/redis.conf
-rw-r--r-- 1 root root 30176 Jan 14  2014 /etc/redis/redis.conf

该权限 (644) 是全球可读的,这不是一个好主意,因为它包含在第 4 步中配置的未加密密码。

我们需要更改所有权和权限。理想情况下,它应该由 redis 用户拥有,而二级所有权由 root 用户拥有。为此,请运行以下命令:

  1. sudo chown redis:root /etc/redis/redis.conf

然后更改所有权,以便只有文件的所有者才能读取和/或写入它:

  1. sudo chmod 600 /etc/redis/redis.conf

您可以使用以下方式验证新的所有权和权限:

  1. ls -l /etc/redis/redis.conf
total 40
-rw------- 1 redis root 29716 Sep 22 18:32 /etc/redis/redis.conf

最后,重启 Redis:

  1. sudo service redis-server restart

结论

请记住,一旦有人登录到您的服务器,就很容易绕过我们已部署的特定于 Redis 的安全功能。因此,最重要的安全功能是让越过围栏变得极其困难的功能。

那应该是你的防火墙。

为了让你的服务器安全更上一层楼,你可以配置一个像 OSSEC 这样的入侵检测系统。要在 Ubuntu 14.04 上配置 OSSEC,请参阅本 OSSEC 指南。

如果您试图通过不受信任的网络保护 Redis 通信,您将必须使用 SSL 代理,正如 Redis 开发人员在官方 Redis 安全指南中所推荐的那样。设置 SSL 代理以保护 Redis 通信是一个单独的主题。

我们没有在重命名部分包含完整的 Redis 命令列表。但是,您可以在 redis.io/commands 上自行检查并确定它们可能如何被滥用。

©2015-2025 艾丽卡 support@alaica.com