我在我的 django 项目中使用 redis 作为芹菜的代理。作为部署过程的一部分,我在最后重新启动服务,因此 redis、芹菜、枪角兽 (django) 等从 redis 开始。但是我遇到了一个 redis 无法关闭的问题。
$ sudo systemctl restart redis
$
在撰写本文时,它在那里挂起了 15 分钟。journalctl
显示没有条目(我假设日志在一夜之间轮换),systemctl status
显示 redis 单元正在停用(sig-term),但没有指示它在做什么,除了:
May 24 10:31:22 staging systemd[1]: Stopping Advanced key-value store...
May 24 10:31:22 staging run-parts[305]: run-parts: executing /etc/redis/redis-server.pre-down.d/00_example
我知道 sig-term 允许 redis 优雅地退出,所以想知道是芹菜节拍任务还是 django 服务器正在访问它,但在停止这些服务后它仍然挂断。有没有我不知道的地方可以检查状态/它在做什么?
编辑:啊哈,好吧,所以事实证明 redis 默认情况下实际上并没有记录到 systemd,而是记录到/var/log/redis
这实际上会产生一些信息:
31602:M 24 May 10:59:56.097 * 1 changes in 900 seconds. Saving...
31602:M 24 May 10:59:56.101 * Background saving started by pid 1151
1151:C 24 May 10:59:56.103 # Failed opening .rdb for saving: Read-only file system
31602:M 24 May 10:59:56.204 # Background saving error
我正在使用dir
和dbfilename
指令的默认值
# The filename where to dump the DB
dbfilename dump.rdb
# The working directory.
#
# The DB will be written inside this directory, with the filename specified
# above using the 'dbfilename' configuration directive.
#
# The Append Only File will also be created inside this directory.
#
# Note that you must specify a directory here, not a file name.
dir /var/lib/redis
user@server:/var/lib/redis$ ls -l
total 252
-rw-r--r-- 1 redis redis 249649 May 23 02:44 dump.rdb
它归 redis 所有,为什么它会设置为只读?
还行。。。所以
user@server:/var/lib/redis$ redis-cli config get dir
1) "dir"
2) "/var/spool/cron"
user@server:/var/lib/redis$ redis-cli config get dbfilename
1) "dbfilename"
2) "root"
这开始显得很奇怪。到底是什么让它变成这样?
它开始看起来越来越像是攻击的结果:https://github.com/antirez/redis/issues/3594
有趣的是,我在防火墙后面运行 redis。目前不确定配置是如何更改的。幸运的是,它是一个暂存服务器,上面没有敏感信息,所以我可以将其删除,直到我弄清楚问题所在。
更新:因此,在进一步调查之后,我只能确定攻击一定发生在服务器上安装redis之后的某个时间点,但在防火墙被激活之前。默认情况下,我使用的 redis 版本绑定到 0.0.0.0。我使用部署脚本来设置服务器,因此漏洞时间必须为 ~10 秒。吸取的教训,在安装软件包之前激活防火墙。
我会说我不喜欢默认情况下绑定到 0.0.0.0 的 redis,尤其是当它能够完全损害您的服务器时。但根据我所读到的内容,这个论点已经被做死了,在后来的版本中情况有所改善。