Redis 是一个功能强大的内存键值存储,可用作数据库服务器、缓存和消息代理。它以其快速的性能、灵活性以及对多种语言的支持而闻名。它是免费且开源的软件,使用 C 语言 编写。在本指南中,了解如何在 Ubuntu 18.04 上安装和保护 Redis。
前提条件
为了遵循本指南,您需要提前准备几件事。您需要有一个 Ubuntu 18.04 服务器,您可以按照我们的教程轻松安装。此外,您需要有一个具有 sudo 特权的非 root 用户,并配置了基本防火墙。您可以按照我们关于 配置 Linux sudoers 文件 和 在 Ubuntu 和 Debian 云服务器上设置 UFW
现在,让我们开始吧!
安装 Redis
Redis 可以直接从官方的 Ubuntu 仓库中获取。这是安装和配置它最简单的方法。除非有特定原因,否则我们建议采用这种方式。由于 Redis 源代码是免费提供的,因此也可以从源码构建 Redis。但是,我们不推荐这样做,因为管理和更新它会更麻烦。
从 Ubuntu 仓库安装 Redis
首先,更新本地 APT 软件包缓存:
|
1 |
sudo apt update |
接下来,使用以下命令安装 Redis:
|
1 |
sudo apt install redis-server |
从源码安装 Redis
Ubuntu 默认不带构建工具和必要的库。以下命令将安装构建 Redis 所需的所有工具:
|
1 |
sudo apt install git build-essential |
构建 Redis 还有两个额外的依赖项。这些依赖项对于使用附加功能(例如 TLS 支持、systemd 集成等)编译 Redis 是必需的。要编译支持 TLS 的 Redis,请安装 “libssl-dev” 软件包。要编译支持 systemd 的 Redis,请安装 “libsystemd-dev” 软件包:
|
1 |
sudo apt install libssl-dev libsystemd-dev |
Redis 源代码可在 GitHub 上获取。查看 Redis GitHub 页面。接下来,获取源代码:
|
1 |
git clone https://github.com/redis/redis.git |
将当前活动目录更改为 Redis 源代码目录:
|
1 |
cd redis/ |
之后,运行 make 工具开始编译。它将在没有任何附加元素的情况下编译 Redis:
|
1 |
make -j$(nproc) |
要启用 TLS 支持(假设已安装 “libssl-dev”),请改用以下命令:
|
1 |
make -j$(nproc) BUILD_TLS=yes |
要启用对 systemd 的支持(假设已安装 “libsystemd-dev”),请使用以下命令:
|
1 |
make -j$(nproc) USE_SYSTEMD=yes |
接下来,测试编译是否成功。请注意,运行测试可能需要额外的软件包 “tcl-dev” 和相关的依赖项:
|
1 |
make test |
最后,通过运行以下命令安装 Redis:
|
1 |
sudo make install |
如果 Redis 是使用 TLS 构建的,则必须以以下方式运行服务器:
|
1 2 |
./utils/gen-test-certs.sh ./runtest --tls |
配置 Redis
安装完成后,就可以配置 Redis 了。在文本编辑器中打开 Redis 配置文件,然后向下滚动到 “supervised” 部分:
|
1 |
sudo vim /etc/redis/redis.conf |
将 “supervised” 的值更改为 “systemd”。这将确保 Redis 服务由 systemd 管理。要使更改生效,请重启 Redis 服务:
|
1 |
sudo systemctl restart redis.service |
测试 Redis
在进一步使用 Redis 之前,测试其是否正常运行总是一个好主意。这里有几种测试 Redis 行为的方法。第一步是检查 Redis 服务是否已启动并运行:
|
1 |
sudo systemctl status redis |
此时,Redis 已经运行。默认情况下,Redis 服务将在开机时启动。如果需要手动运行 Redis 服务,请将其禁用:
|
1 |
sudo systemctl disable redis |
下一个测试是使用 Redis 控制台进行检查。启动 Redis 命令行客户端:
|
1 |
redis-cli |
运行 “ping” 命令:
|
1 |
ping |
输出确认与服务器的连接仍然处于活动状态。下一个测试是查看它是否允许设置键。创建一个值为 “hello world” 的 “temp” 键:
|
1 |
set temp “hello world” |
使用 “get” 命令检索该值:
|
1 |
get temp |
如果到目前为止一切正常,Redis 应该会毫无问题地返回该键值。关闭 Redis 命令行客户端:
|
1 |
exit |
最后的测试是检查即使在停止或重启后,Redis 是否仍能持久化数据。重启 Redis 服务:
|
1 |
sudo systemctl restart redis |
如果在运行上述命令时遇到错误,请使用 “systemctl enable redis-server” 命令:
|
1 |
sudo systemctl enable redis-server |
启动 Redis 命令行客户端并检索我们之前创建的 “temp” 键的值:
|
1 2 |
redis-cli get temp |
Redis 测试到此结束。您的 Redis 服务器现在已准备好用于所需的目的。
保护 Redis 安全
此时,Redis 已完全投入运行。然而,它的一些默认配置并没有提供最佳的安全性。如果不进行更新,任何恶意攻击者都可以利用这个机会来获取对服务器及其数据的访问权限。本节将展示如何缓解这些漏洞。虽然这些步骤是可选的,但强烈建议遵循它们以加强系统安全。
绑定到 localhost
默认情况下,Redis 只能从 localhost 访问。但是,如果 Redis 是在远程服务器上配置的,则必须更新配置以允许从任何地方进行连接。然而,这可能不如绑定到 localhost 安全。要将 Redis 重新绑定到 localhost,请在文本编辑器中打开 Redis 配置文件:
|
1 |
sudo vim /etc/redis/redis.conf |
向下滚动并找到以下内容。确保它没有被注释掉:
|
1 |
bind 127.0.0.1 ::1 |
保存并关闭文件。然后,重启 Redis 服务以确保更改立即生效:
|
1 |
sudo systemctl restart redis |
验证更改是否成功:
|
1 |
sudo netstat -lnp | grep redis |
如果您遇到 ‘netstat: command not found’ 错误,请使用命令安装 net-tools “sudo apt-get install net-tools”。输出验证了 “redis-server” 已成功绑定到 localhost (127.0.0.1),这反映了最近所做的更改。如果存在任何其他 IP 地址(例如 0.0.0.0),请重新检查配置文件并再次重启 Redis 服务器。
配置 Redis 密码
配置密码允许使用 Redis 的内置安全功能 – “AUTH” 命令。它要求客户端进行身份验证才能访问数据库。默认情况下,Redis 没有配置密码。必须在 Redis 配置文件中声明密码。在文本编辑器中打开配置文件:
|
1 |
sudo vim /etc/redis/redis.conf |
然后,向下滚动到以下行并取消注释:
|
1 |
requirepass foobared |
取消注释后,“foobared” 将是默认密码。将其更改为您选择的密码。对于 Redis 而言,密码强度是一个非常值得关注的因素。由于 Redis 是一个高性能服务器,因此它可能更容易受到暴力破解攻击。这就是为什么配置文件中直接包含以下警告的原因。这里有一个生成极强随机密码的快速示例。我们将使用 OpenSSL 命令来生成一个随机字符串:
|
1 |
echo $(openssl rand 60 | openssl base64 -A) |
配置新密码后,重启 Redis 服务以使更改生效:
|
1 |
sudo systemctl restart redis.service |
现在来测试密码是否已成功应用。启动 Redis 命令行控制台:
|
1 |
redis-cli |
然后,尝试设置一个新键:
|
1 |
set user “cloudsigma” |
Redis 将拒绝该请求,因为该操作未进行身份验证。要在服务器上执行任何操作,用户必须先获得授权。使用以下命令对用户进行授权:
|
1 |
auth <password> |
如果密码正确,Redis 将确认该操作。现在,Redis 将允许访问其服务器功能:
|
1 2 |
set user “cloudsigma” get user |
目前,我们对 Redis 控制台的操作已完成。您可以关闭控制台:
|
1 |
exit |
重命名危险命令
Redis 允许重命名或完全禁用某些被认为危险的命令。这是 Redis 的另一个重要内置安全功能。为什么这些命令会被视为危险?如果由未经授权的用户运行,这些命令可能会重新配置、破坏或清除服务器中的数据。禁用/重命名一系列危险的 Redis 命令是常见做法。请注意,命令的安全威胁取决于具体情况。例如,以下某些命令可能需要定期使用。在这种情况下,不建议禁用它们。在这种情况下,重命名命令可能会更有利。以下是被认为危险的命令的简要列表。这是增强 Redis 服务器安全性的一个很好的起点:
- FLUSHDB
- FLUSHALL
- KEYS
- PEXPIRE
- DEL
- CONFIG
- SHUTDOWN
- BGREWRITEAOF
- BGSAVE
- SAVE
- SPOP
- SREM
- RENAME
- DEBUG
要重命名或禁用命令,必须在 Redis 配置文件中进行声明。打开 Redis 配置文件,并添加以下行。这里,“rename-command” 用于将命令重命名为空字符串。根据需要添加尽可能多的条目:
|
1 |
sudo vim /etc/redis/redis.conf |
|
1 2 3 4 |
$ rename-command FLUSHDB "" $ rename-command FLUSHALL "" $ rename-command SHUTDOWN "" $ rename-command CONFIG "" |
同样,也可以将命令重命名为其他名称。在某些情况下,这可能会提供更大的灵活性:
|
1 2 3 4 |
$ rename-command FLUSHDB "command_1" $ rename-command FLUSHALL "command_2" $ rename-command SHUTDOWN "command_3" $ rename-command CONFIG "command_4" |
保存文件并退出编辑器。要使更改生效,请重启 Redis 服务:
|
1 |
sudo systemctl restart redis.service |
验证更改。接下来,启动 Redis 控制台并进行身份验证:
|
1 2 |
redis-cli auth <password> |
假设 “CONFIG” 命令已被禁用或重命名。尝试使用以下 “CONFIG” 命令。它将失败:
|
1 |
config get requirepass |
如果该命令已被禁用,则在重新启用之前无法访问。但是,如果它已被重命名,请使用新的别名:
|
1 |
command_4 get requirepass |
结论
本教程演示了如何安装、保护、配置和验证 Redis 安装。它还演示了如何使用 Redis 的内置安全功能来降低其遭受攻击的脆弱性。然而,如果有人已经登录到服务器,那么绕过 Redis 特有的安全功能是相当容易的。这就是为什么使用防火墙来保护对 Redis 服务器的访问至关重要的原因。
祝您使用愉快!






评论
暂无评论。发表第一条评论吧。