介绍
Redis是以其灵活性、性能和广泛的语言支持而闻名的内存关键值库,本教程展示了如何在 Debian 10 服务器上安装、配置和保护 Redis。
前提条件
要完成本指南,您需要访问 Debian 10 服务器,该服务器具有非 root 用户,具有sudo
权限,并配置了基本的防火墙。
当你准备开始时,登录你的服务器作为你的 sudo 启用用户,并继续下方。
步骤 1 – 安装和配置 Redis
为了获得最新版本的 Redis,我们将使用apt
来从官方的 Debian 存储库中安装它。
更新您的本地apt
包缓存并通过键入来安装 Redis:
1sudo apt update
2sudo apt install redis-server
這將下載並安裝 Redis 及其依賴組件,然後在安裝過程中自動生成的 Redis 配置檔案中進行一個重要的配置變更。
使用您喜爱的文本编辑器打开此文件:
1sudo nano /etc/redis/redis.conf
在檔案內,尋找「監督」指令. 此指令允許您宣佈 init 系統以管理 Redis 作為服務,為您提供更多對其運作的控制。 該「監督」指令預設為「不」。
1[label /etc/redis/redis.conf]
2. . .
3
4# If you run Redis from upstart or systemd, Redis can interact with your
5# supervision tree. Options:
6# supervised no - no supervision interaction
7# supervised upstart - signal upstart by putting Redis into SIGSTOP mode
8# supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET
9# supervised auto - detect upstart or systemd method based on
10# UPSTART_JOB or NOTIFY_SOCKET environment variables
11# Note: these supervision methods only signal "process is ready."
12# They do not enable continuous liveness pings back to your supervisor.
13supervised systemd
14
15. . .
此时您只需要对 Redis 配置文件进行更改,所以在完成后保存并关闭它,然后重新加载 Redis 服务文件以反映您对配置文件所做的更改:
1sudo systemctl restart redis
有了它,你已经安装和配置了Redis,它在你的机器上运行,但在开始使用它之前,最好先检查Redis是否正常工作。
步骤 2 - 测试 Redis
与任何新安装的软件一样,在对其配置进行任何进一步更改之前,最好确保 Redis 按预期运行。
請先檢查 Redis 服務是否正在運行:
1sudo systemctl status redis
如果运行没有任何错误,此命令将产生类似于以下的输出:
1[secondary_label Output]
2● redis-server.service - Advanced key-value store
3 Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled)
4 Active: active (running) since Wed 2018-09-05 20:19:44 UTC; 41s ago
5 Docs: http://redis.io/documentation,
6 man:redis-server(1)
7 Process: 10829 ExecStopPost=/bin/run-parts --verbose /etc/redis/redis-server.post-down.d (code=exited, status=0/SUCCESS)
8 Process: 10825 ExecStop=/bin/kill -s TERM $MAINPID (code=exited, status=0/SUCCESS)
9 Process: 10823 ExecStop=/bin/run-parts --verbose /etc/redis/redis-server.pre-down.d (code=exited, status=0/SUCCESS)
10 Process: 10842 ExecStartPost=/bin/run-parts --verbose /etc/redis/redis-server.post-up.d (code=exited, status=0/SUCCESS)
11 Process: 10838 ExecStart=/usr/bin/redis-server /etc/redis/redis.conf (code=exited, status=0/SUCCESS)
12 Process: 10834 ExecStartPre=/bin/run-parts --verbose /etc/redis/redis-server.pre-up.d (code=exited, status=0/SUCCESS)
13 Main PID: 10841 (redis-server)
14 Tasks: 3 (limit: 4915)
15 CGroup: /system.slice/redis-server.service
16 └─10841 /usr/bin/redis-server 127.0.0.1:6379
17. . .
在这里,您可以看到 Redis 正在运行并已启用,这意味着它每次启动服务器时都设置为启动。
<$>[注] 注: 此设置适用于许多常见的 Redis 用例,但是,如果您喜欢在服务器启动时每次手动启动 Redis,则可以使用以下命令配置此设置:
1sudo systemctl disable redis
美元
要测试 Redis 是否正常运行,请使用命令行客户端连接到服务器:
1redis-cli
在以下提示中,使用ping
命令测试连接性:
1ping
1[secondary_label Output]
2PONG
此输出确认服务器连接仍然活跃. 接下来,检查您是否可以通过运行设置密钥:
1set test "It's working!"
1[secondary_label Output]
2OK
通过键入返回值:
1get test
假设一切工作,您将能够检索您存储的值:
1[secondary_label Output]
2"It's working!"
确认您可以获取值后,请退出 Redis 提示以返回壳:
1exit
作为最后的测试,我们将检查 Redis 是否能够在停止或重新启动后仍然保持数据。
1sudo systemctl restart redis
然后再次连接到命令行客户端,并确认您的测试值仍然可用:
1redis-cli
1get test
您的密钥的值仍然可以访问:
1[secondary_label Output]
2"It's working!"
在你完成后,再次进入外壳:
1exit
因此,您的 Redis 安装完全可操作,并为您准备好使用。然而,一些默认配置设置不安全,并为恶意行为者提供了攻击和获取访问您的服务器和数据的机会。本教程中的其余步骤涵盖了缓解这些漏洞的方法,如官方 Redis 网站所规定(http://redis.io/topics/security)。尽管这些步骤是可选的,如果您选择不遵循这些步骤,Redis 仍然会工作,但强烈建议您完成这些步骤以加强系统的安全性。
步骤 3 – 绑定到 localhost
默认情况下,Redis仅可从 localhost 访问,但是,如果您安装和配置了Redis,并遵循与本教程不同的教程,您可能已经更新了配置文件,以允许从任何地方连接。
若要修复此问题,请打开 Redis 配置文件以编辑:
1sudo nano /etc/redis/redis.conf
查找此行,并确保它没有评论(如果有的话,删除#
字符):
1[label /etc/redis/redis.conf]
2bind 127.0.0.1
完成后保存并关闭文件(按CTRL + X
,Y
,然后按ENTER
).
然后,重新启动服务,以确保 systemd 读取您的更改:
1sudo systemctl restart redis
若要檢查此變更是否已生效,請執行以下「netstat」命令:
1sudo netstat -lnp | grep redis
1[secondary_label Output]
2tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 10959/redis-server
此输出显示,该redis-server
程序绑定到 localhost (127.0.0.1
),反映了您刚刚对配置文件的更改. 如果您在该列中看到另一个 IP 地址(0.0.0.0
,例如),那么您应该双重检查是否没有评论正确的行,并重新启动 Redis 服务。
现在,您的 Redis 安装仅在 localhost 上进行收听,恶意行为者将更难提出请求或获得访问您的服务器,但是,Redis 目前没有设置要求用户在对其配置或数据进行更改之前进行身份验证。
步骤 4 – 配置 Redis 密码
配置 Redis 密码允许其内置的两个安全功能之一,即auth
命令,该命令需要客户端进行身份验证才能访问数据库。密码直接配置在 Redis 配置文件中,即 `/etc/redis/redis.conf,因此使用您喜爱的编辑器重新打开该文件:
1sudo nano /etc/redis/redis.conf
滚动到安全
部分,并寻找评论的指令,该指令写道:
1[label /etc/redis/redis.conf]
2# requirepass foobared
删除#
并将foobared
更改为安全密码。
<$>[注]
注: 在redis.conf
文件中的requirepass
指令之上,有一个评论的警告:
1# Warning: since Redis is pretty fast an outside user can try up to
2# 150k passwords per second against a good box. This means that you should
3# use a very strong password otherwise it will be very easy to break.
4#
因此,重要的是您将一个非常强大且非常长的值指定为您的密码,而不是自己创建密码,您可以使用openssl
命令生成随机命令,如下示例所示。
1openssl rand 60 | openssl base64 -A
你的输出应该看起来像:
1[secondary_label Output]
2RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE
在复制和粘贴该命令的输出作为requirepass
的新值后,它应该读到:
1[secondary_label /etc/redis/redis.conf]
2requirepass RBOJ9cCNoGCKhlEBwQLHri1g+atWgn4Xn4HwNUbtzoVxAYxkiYBi7aufl4MILv1nxBqR4L6NNzI0X6cE
美元
设置密码后,保存并关闭文件,然后重新启动 Redis:
1sudo systemctl restart redis.service
要测试密码是否有效,请访问 Redis 命令行:
1redis-cli
下面显示了用于测试 Redis 密码是否有效的命令序列,第一个命令试图在身份验证之前为值设置密钥:
1set key1 10
这不会起作用,因为您没有身份验证,所以Redis返回错误:
1[secondary_label Output]
2(error) NOAUTH Authentication required.
下一个命令使用 Redis 配置文件中指定的密码进行身份验证:
1auth your_redis_password
Redis 承认:
1[secondary_label Output]
2OK
在此之后,运行以前的命令将再次成功:
1set key1 10
1[secondary_label Output]
2OK
'get key1' 查询 Redis 对新密钥的值。
1get key1
1[secondary_label Output]
2"10"
在验证后确认您可以在 Redis 客户端中运行命令后,您可以退出redis-cli
:
1quit
接下来,我们将研究重新命名 Redis 命令,如果错误地或由恶意行为者输入,可能会对您的机器造成严重损害。
步骤5 – 重命名危险命令
Redis 内置的另一个安全功能包括重命名或完全禁用被认为是危险的某些命令。
当未经授权的用户运行时,这些命令可以用于重新配置,破坏或以其他方式删除您的数据. 与身份验证密码一样,重命名或禁用命令在 /etc/redis/redis.conf
文件的同一安全性
部分配置。
一些被认为是危险的命令包括: FLUSHDB , FLUSHALL , KEYS , PEXPIRE , DEL , CONFIG , SHUTDOWN , BGREWRITEAOF , BGSAVE , SAVE , SPOP , SREM , RENAME 和 DEBUG 。
您是否应该禁用或更名命令取决于您的具体需求或网站的需求. 如果您知道您永远不会使用可能被滥用的命令,那么您可以禁用命令。
要启用或禁用 Redis 命令,请再次打开配置文件:
1sudo nano /etc/redis/redis.conf
<$>[警告] 警告: 下列说明如何禁用和更名命令的步骤是示例。您只应该选择禁用或更名对您有意义的命令。
若要禁用命令,只需将命令重命名为空串(用一对没有字符的引文符号表示),如下所示:
1[label /etc/redis/redis.conf]
2. . .
3# It is also possible to completely kill a command by renaming it into
4# an empty string:
5#
6rename-command FLUSHDB ""
7rename-command FLUSHALL ""
8rename-command DEBUG ""
9. . .
若要更名命令,请按下面的示例给命令另一个名称。
1[label /etc/redis/redis.conf]
2. . .
3# rename-command CONFIG ""
4rename-command SHUTDOWN SHUTDOWN_MENOT
5rename-command CONFIG ASC12_CONFIG
6. . .
保存您的更改并关闭文件。
重命名命令后,通过重新启动 Redis 来应用更改:
1sudo systemctl restart redis
要测试新命令,请输入 Redis 命令行:
1redis-cli
然后是真实的:
1auth your_redis_password
1[secondary_label Output]
2OK
假设您将CONFIG
命令重命名为ASC12_CONFIG
,如上面的示例所示,首先尝试使用原始的CONFIG
命令。
1config get requirepass
1[secondary_label Output]
2(error) ERR unknown command 'config'
但是,重新命名命令将成功,它不是案例敏感:
1asc12_config get requirepass
1[secondary_label Output]
21) "requirepass"
32) "your_redis_password"
最后,你可以离开redis-cli
:
1exit
请注意,如果您已经使用了 Redis 命令行,然后重新启动 Redis,则需要重新验证。
1[secondary_label Output]
2NOAUTH Authentication required.
<$>[警告] 關於重命名命令的做法,在 `/etc/redis/redis.conf 的「安全」部分末尾有一個警告聲明,該聲明說:
请注意,更改登录到 AOF 文件或发送给奴隶的命令的名称可能会导致问题。
注: _Redis项目选择使用主人
和奴隶
的术语,而DigitalOcean通常更喜欢替代的描述。
也就是说,如果命令不是在AOF文件中,或者如果是,但AOF文件没有被传送给奴隶,那么应该没有问题。
因此,当你试图更名命令时,请记住这一点:更名命令的最佳时间是当你不使用AOF坚持时,或者安装后不久,即在你的使用Redis的应用程序部署之前。
当您使用 AOF 并处理主奴隶安装时,请考虑 这个答案来自该项目的 GitHub 问题页面。
命令登录到 AOF,并以相同的方式复制到奴隶,所以如果您尝试在没有相同更名的实例上重播 AOF,您可能会面临不一致,因为命令不能执行(对奴隶来说也是如此)。
因此,在这种情况下,处理重命名的最佳方法是确保重命名命令应用于主奴隶安装中的所有实例。
结论
在本教程中,您安装并配置了 Redis,验证了您的 Redis 安装是否正常运行,并使用其内置的安全功能,使其不容易受到恶意行为者的攻击。
请记住,一旦有人登录到您的服务器,很容易绕过我们已经部署的 Redis 特定的安全功能,因此,您的 Redis 服务器上最重要的安全功能是您的防火墙(如果您遵循前提 初始服务器设置教程,则您将其配置),因为这使得恶意行为者很难跳过该围栏。