抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

Redis 是一种基于内存的键值对存储数据库,其以灵活性、性能和广泛的语言支持而闻名。本教程将会演示如何在 Debian 10 服务器上安装和安全地部署 Redis。

先决条件

要完成本教程,您需要使用一个拥有 sudo 权限的非 root 用户和基本的防火墙配置的服务器。

当你准备好开始时,使用拥有 sudo 权限的用户登录到你的服务器,然后继续下面的工作。

安装和配置 Redis

更新你的本地 apt 软件包缓存并安装 Redis:

1
2
sudo apt update
sudo apt install redis-server

在这之后,需要对 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
* redis-server.service - Advanced key-value store
Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2021-02-18 12:53:46 CST; 4s ago
Docs: http://redis.io/documentation,
man:redis-server(1)
Process: 9790 ExecStart=/usr/bin/redis-server /etc/redis/redis.conf (code=exited, status=0/SUCCESS)
Main PID: 9791 (redis-server)
Tasks: 4 (limit: 544)
Memory: 1.8M
CGroup: /system.slice/redis-server.service
`-9791 /usr/bin/redis-server 127.0.0.1:6379

Feb 18 12:53:46 debian systemd[1]: Starting Advanced key-value store...
Feb 18 12:53:46 debian systemd[1]: redis-server.service: Can't open PID file /run/redis/redis-server.pid (yet?) after start: No such
Feb 18 12:53:46 debian systemd[1]: Started 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 是否能够在停止或重启后仍能持久化数据。要做到这一点,你可以:

  1. 首先 sudo systemctl restart redis 重启 Redis 实例。
  2. 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
2
3
4
5
6
7
8
9
10
11
12
13
eric@debian:~$ ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq state UP group default qlen 1000
link/ether 00:16:13:4b:af:50 brd ff:ff:ff:ff:ff:ff
inet 107.xxx.xxx.245/24 brd 107.189.30.255 scope global dynamic ens3
valid_lft 2589688sec preferred_lft 2589688sec
inet6 fe80::216:13ff:fe4b:af50/64 scope link
valid_lft forever preferred_lft forever

我当前有两个网络接口:

网络接口 说明
lo 本地回环接口
ens3 公网接口

所以在 bind 后面加多一个公网接口的 IP,地址为 107.xxx.xxx.245(IP 地址中的 x 是为了隐去我的 IP 地址的部分位数)。

/etc/redis/redis.conf
1
bind 127.0.0.1 ::1 107.xxx.xxx.245

然后 sudo systemctl restart redis 重启下 redis 服务即可,这样配置 Redis 就会监听本地回环接口和公网接口了。

要检查这个变化是否已经生效,可以使用 ssnetstat 来验证:

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 部分可以看到有一行被注释(即 # 开头)的项:

/etc/redis/redis.conf
1
2
. . .
# requirepass foobared

删去开头的 # 和空格,将默认的密码 foobared 改成你想要的密码。当然为了更安全,与其自己编写密码,你也可以选择使用一个简单的命令生成复杂度更高的密码(该命令将显示给定字符串的 SHA256 校验和),如:

1
echo "HelloWorld" | sha256sum

切记:要创建一个独特的密码,请将 "" 中的字符串(即 HelloWorld)改为任何其他单词或短语。

修改后的配置文件将如下所示:

重启 redis 服务之后连接到 redis:

1
2
sudo systemctl restart redis
redis-cli

直接尝试给指定 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.confSECURITY 部分设置。

  • 要禁用一个命令,只需将其重命名为一个空字符串(用一对引号表示,中间没有字符),如下所示:
/etc/redis/redis.conf
1
2
3
4
5
. . .
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command DEBUG ""
. . .
  • 要重命名一个命令,请给它另一个名字(一些复杂的或难以猜测的名字,但至少应该让你自己很容易记住),如下面的例子所示:
/etc/redis/redis.conf
1
2
3
4
. . .
rename-command SHUTDOWN SHUTDOWN_MENOT
rename-command CONFIG ASC12_CONFIG
. . .

修改完配置文件后,最后重启 Redis 服务就好了。

总结

在本教程中,您安装并配置了 Redis,验证了您的 Redis 安装是否正常运行,并使用其内置的安全功能使其不易受到恶意行为者的攻击。请记住,一旦有人登录到你的服务器,就很容易规避我们设置的 Redis 特定安全功能。因此,最重要的安全功能是你系统的防火墙。

评论