Redis 是一种基于内存的键值对存储数据库,其以灵活性、性能和广泛的语言支持而闻名。本教程将会演示如何在 Debian 10 服务器上安装和安全地部署 Redis。
先决条件
要完成本教程,您需要使用一个拥有 sudo 权限的非 root 用户和基本的防火墙配置的服务器。
当你准备好开始时,使用拥有 sudo 权限的用户登录到你的服务器,然后继续下面的工作。
安装和配置 Redis
更新你的本地 apt 软件包缓存并安装 Redis:
1 | sudo apt update |
在这之后,需要对 Redis 的配置文件进行一个重要的修改,该文件是在安装过程中自动生成的。使用你喜欢的文本编辑器对其进行编辑:
1 | sudo vim /etc/redis/redis.conf |
在文件中,找到 supervised
项,此项允许你声明使用 init 将 Redis 作为一个服务来进行管理。默认情况下 supervised
被设为 no
,所以我们将其改为 systemd
:
随后只需要重启一下 Redis 服务:
1 | sudo systemctl restart redis |
测试 Redis
在对 Redis 的配置进行任何进一步的更改之前,最好确保 Redis 能按照预期的方式运行。首先检查 Redis 服务是否正在运行:
1 | sudo systemctl status redis |
如果运行时没有任何错误,这个命令将产生类似于下面的输出:
1 | * redis-server.service - Advanced key-value store |
在这里,你可以看到 Redis 正在运行( active (running) ),并且已经被设置为 enabled(每次服务器启动时启动)。
要测试 Redis 是否正常运行,可使用命令行客户端连接到服务器:
1 | redis-cli |
使用 ping
命令测试连通性:
1 | 127.0.0.1:6379> ping |
1 | PONG |
PONG
这个输出意味着服务器的连通性是没问题的。接下来检查是否能正常创建一个 key 并设置值:
1 | 127.0.0.1:6379> set test "It's working!" |
1 | OK |
执行下列指令获取指定 key 的值:
1 | 127.0.0.1:6379> get test |
假设一切正常,你就能检索到你存储的值:
1 | "It's working!" |
确认可以取值后,退出 Redis 命令提示符,回到 shell:
1 | 127.0.0.1:6379> exit |
作为最后一项测试,我们将检查 Redis 是否能够在停止或重启后仍能持久化数据。要做到这一点,你可以:
- 首先
sudo systemctl restart redis
重启 Redis 实例。 redis-cli
连接到服务器,get test
尝试获取先前给test
设定的值。
如果没有异常,那就说明你的 Redis 已经就绪。然而,它的一些默认配置是不安全的,为恶意行为者提供了攻击和访问你的服务器及其数据的机会。本教程中的其余步骤涵盖了 Redis 官方网站规定的缓解这些漏洞的方法。
Redis 的 bind 参数
编辑 Redis 配置文件 /etc/redis/redis.conf
:
1 | sudo vim /etc/redis/redis.conf |
找到这一行,你会看到这么一行:
- 默认情况下,Redis 只能从本地回环网络接口( localhost )访问,并不会暴露给公网接口,这样子是相对更安全的。即
bind 127.0.0.1 ::1
。- 如果在正常业务中 Redis 服务的确需要公网上的其他机器对其访问,可以通过在
bind
项后追加服务器的公网接口 IP。
可以使用 ip addr show
查看当前 Linux 服务器上的网络接口。
1 | eric@debian:~$ ip addr show |
我当前有两个网络接口:
网络接口 | 说明 |
---|---|
lo | 本地回环接口 |
ens3 | 公网接口 |
所以在 bind
后面加多一个公网接口的 IP,地址为 107.xxx.xxx.245
(IP 地址中的 x
是为了隐去我的 IP 地址的部分位数)。
1 | bind 127.0.0.1 ::1 107.xxx.xxx.245 |
然后 sudo systemctl restart redis
重启下 redis 服务即可,这样配置 Redis 就会监听本地回环接口和公网接口了。
要检查这个变化是否已经生效,可以使用 ss
或 netstat
来验证:
1 | ss -an | grep 6379 |
1 | sudo netstat -lnp | grep redis |
接下来你还需要添加一个防火墙规则,假设你使用 ufw
来管理防火墙并想要允许指定的远程机器的 IP(即客户端的公网 IP) 访问 Redis 服务,你可以运行以下命令:
1 | sudo ufw allow proto tcp from <CLIENT_IP_ADDRESS> to any port 6379 |
- 将
<CLIENT_IP_ADDRESS>
改为客户端的公网 IP
完成后,你可以使用 redis-cli
工具通过 ping
Redis 服务器来测试连接,可以在另一台机器(作为客户端)中执行命令:
1 | redis-cli -h <REDIS_IP_ADDRESS> ping |
- 将
<REDIS_IP_ADDRESS>
改为 Redis 服务端的公网 IP(本文的例子为107.xxx.xxx.245
,请自行根据你的情况作出修改),没有问题的话该命令将返回PONG
的响应。
配置 Redis 密码
密码是直接在 Redis 的配置文件 /etc/redis/redis.conf
中配置的,所以再次编辑配置文件 /etc/redis/redis.conf
:
1 | sudo vim /etc/redis/redis.conf |
找到 SECURITY 部分可以看到有一行被注释(即 #
开头)的项:
1 | . . . |
删去开头的 #
和空格,将默认的密码 foobared
改成你想要的密码。当然为了更安全,与其自己编写密码,你也可以选择使用一个简单的命令生成复杂度更高的密码(该命令将显示给定字符串的 SHA256 校验和),如:
1 | echo "HelloWorld" | sha256sum |
切记:要创建一个独特的密码,请将 ""
中的字符串(即 HelloWorld
)改为任何其他单词或短语。
修改后的配置文件将如下所示:
重启 redis 服务之后连接到 redis:
1 | sudo systemctl restart redis |
直接尝试给指定 key 设置一个值:
1 | 127.0.0.1:6379> set key1 10 |
不出意外的话会报错,因为你没有通过验证。输出报错信息如下:
1 | (error) NOAUTH Authentication required. |
所以你需要使用 auth
命令进行验证:
1 | 127.0.0.1:6379> auth your_redis_password |
- 请将
your_redis_password
改为您在 Redis 配置文件中的密码。
验证通过后就能正常使用 Redis 了。
禁用或重命名危险命令
Redis 内置的另一个安全功能可以禁用或重命名某些被认为是危险的命令,如 FLUSHDB,FLUSHALL,DEBUG 等。一些被认为是危险的命令(以下并非完整列表)包括:
- FLUSHDB
- FLUSHALL
- KEYS
- PEXPIRE
- DEL
- CONFIG
- SHUTDOWN
- BGREWRITEAOF
- BGSAVE
- SAVE
- SPOP
- SREM
- RENAME
- DEBUG
你是否应该禁用或重命名一个命令取决于你的具体需求,如果你知道你永远不会使用一个可能被滥用的命令,那么你可以禁用它(也可设置为一些复杂的、难以猜测的名字)。
同样的,编辑配置文件 /etc/redis/redis.conf
的 SECURITY 部分设置。
- 要禁用一个命令,只需将其重命名为一个空字符串(用一对引号表示,中间没有字符),如下所示:
1 | . . . |
- 要重命名一个命令,请给它另一个名字(一些复杂的或难以猜测的名字,但至少应该让你自己很容易记住),如下面的例子所示:
1 | . . . |
修改完配置文件后,最后重启 Redis 服务就好了。
总结
在本教程中,您安装并配置了 Redis,验证了您的 Redis 安装是否正常运行,并使用其内置的安全功能使其不易受到恶意行为者的攻击。请记住,一旦有人登录到你的服务器,就很容易规避我们设置的 Redis 特定安全功能。因此,最重要的安全功能是你系统的防火墙。