我正在运行 Debian 服务器,几天前我的 rsyslog 开始表现得非常奇怪,守护进程正在运行,但它似乎什么也没做。许多人使用该系统,但我是唯一拥有(合法)root 访问权限的人。
我正在使用默认的 rsyslogd 配置(如果您认为相关,我会附加它,但它是软件包附带的配置)。
在我轮换所有日志文件之后,它们仍然是空的:
# ls -l /var/log/*.log
-rw-r--r-- 1 root root 0 Jun 27 00:25 /var/log/alternatives.log
-rw-r----- 1 root adm 0 Jun 26 13:03 /var/log/auth.log
-rw-r----- 1 root adm 0 Jun 26 13:03 /var/log/daemon.log
-rw-r--r-- 1 root root 0 Jun 27 00:25 /var/log/dpkg.log
-rw-r----- 1 root adm 0 Jun 26 13:03 /var/log/kern.log
-rw-r----- 1 root adm 0 Jun 26 13:03 /var/log/lpr.log
-rw-r----- 1 root adm 0 Jun 26 13:03 /var/log/mail.log
-rw-r----- 1 root adm 0 Jun 26 13:03 /var/log/user.log
任何强制写入日志的尝试都没有任何效果:
# logger hey
# ls -l /var/log/messages
-rw-r----- 1 root adm 0 Jun 26 13:03 /var/log/messages
lsof 显示 rsyslogd 没有打开任何日志文件:
# lsof -p 1855
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsyslogd 1855 root cwd DIR 202,0 4096 2 /
rsyslogd 1855 root rtd DIR 202,0 4096 2 /
rsyslogd 1855 root txt REG 202,0 342076 21649 /usr/sbin/rsyslogd
rsyslogd 1855 root mem REG 202,0 38556 32153 /lib/i386-linux-gnu/i686/cmov/libnss_nis-2.13.so
rsyslogd 1855 root mem REG 202,0 79728 32165 /lib/i386-linux-gnu/i686/cmov/libnsl-2.13.so
rsyslogd 1855 root mem REG 202,0 26456 32163 /lib/i386-linux-gnu/i686/cmov/libnss_compat-2.13.so
rsyslogd 1855 root mem REG 202,0 297500 1061058 /usr/lib/rsyslog/imuxsock.so
rsyslogd 1855 root mem REG 202,0 42628 32170 /lib/i386-linux-gnu/i686/cmov/libnss_files-2.13.so
rsyslogd 1855 root mem REG 202,0 22784 1061106 /usr/lib/rsyslog/imklog.so
rsyslogd 1855 root mem REG 202,0 1401000 32169 /lib/i386-linux-gnu/i686/cmov/libc-2.13.so
rsyslogd 1855 root mem REG 202,0 30684 32175 /lib/i386-linux-gnu/i686/cmov/librt-2.13.so
rsyslogd 1855 root mem REG 202,0 9844 32157 /lib/i386-linux-gnu/i686/cmov/libdl-2.13.so
rsyslogd 1855 root mem REG 202,0 117009 32154 /lib/i386-linux-gnu/i686/cmov/libpthread-2.13.so
rsyslogd 1855 root mem REG 202,0 79980 17746 /usr/lib/libz.so.1.2.3.4
rsyslogd 1855 root mem REG 202,0 18836 1061094 /usr/lib/rsyslog/lmnet.so
rsyslogd 1855 root mem REG 202,0 117960 31845 /lib/i386-linux-gnu/ld-2.13.so
rsyslogd 1855 root 0u unix 0xebe8e800 0t0 640 /dev/log
rsyslogd 1855 root 3u FIFO 0,5 0t0 2474 /dev/xconsole
rsyslogd 1855 root 4u unix 0xebe8e400 0t0 645 /var/spool/postfix/dev/log
rsyslogd 1855 root 5r REG 0,3 0 4026532176 /proc/kmsg
我非常沮丧,甚至重新安装了 rsyslog 包,但它仍然拒绝记录任何内容:
# apt-get remove --purge rsyslog
# apt-get install rsyslog
我以为有人入侵了系统,所以运行 rkhunter、chkrootkit、unhide 以尝试查找隐藏进程/端口,并在远程主机中运行 nmap 以与 netstat 显示的端口进行比较。我知道这没有任何意义,但一切看起来都很好。该系统还有一个 iptables 防火墙,对传入/传出连接有非常严格的限制。
这让我发疯了,知道这是怎么回事吗?
[编辑-磁盘空间信息]
# df -h
Filesystem Size Used Avail Use% Mounted on
rootfs 24G 22G 629M 98% /
/dev/root 24G 22G 629M 98% /
devtmpfs 10M 112K 9.9M 2% /dev
tmpfs 76M 48K 76M 1% /run
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 151M 40K 151M 1% /tmp
tmpfs 151M 0 151M 0% /run/shm
[编辑-strace信息]
我觉得 Strace 还不错
[pid 28824] access("/var/log/auth.log", F_OK) = 0
[pid 28824] access("/var/log/syslog", F_OK) = 0
[pid 28824] access("/var/log/daemon.log", F_OK) = 0
[pid 28824] access("/var/log/kern.log", F_OK) = 0
[pid 28824] access("/var/log/lpr.log", F_OK) = 0
[pid 28824] access("/var/log/mail.log", F_OK) = 0
[pid 28824] access("/var/log/user.log", F_OK) = 0
[pid 28824] access("/var/log/mail.info", F_OK) = 0
[pid 28824] access("/var/log/mail.warn", F_OK) = 0
[pid 28824] access("/var/log/mail.err", F_OK) = 0
[pid 28824] access("/var/log/news/news.crit", F_OK) = 0
[pid 28824] access("/var/log/news/news.err", F_OK) = 0
[pid 28824] access("/var/log/news/news.notice", F_OK) = 0
[pid 28824] access("/var/log/debug", F_OK) = 0
[pid 28824] access("/var/log/messages", F_OK) = 0
完整的 strace 日志可以从此处下载这里
答案1
最有可能的是文件所有权问题。rsyslog 开始以 root 身份运行,但随后放弃权限并以用户 syslog 身份运行(配置指令$PrivDropToUser)。
syslog 文件(auth.log、daemon.log 等)最初归 syslog:adm 所有,但如果您将所有权更改为 root(从文件列表中看来如此),那么无论您 HUP(即重新加载)rsyslog 或重新启动它,都会因缺乏权限而被拒绝打开这些文件。
如果所有权变更发生在日志轮换之后,请检查logrotate 配置选项。要么像在 中create
一样进行配置,要么甚至更好,在 中全局定义它,省略模式、所有者和组,就像这样(顺便说一下,这是默认配置),在这种情况下将使用文件的相同值。请参阅以了解完整详细信息。create 0644 syslog adm
/etc/logrotate.d/rsyslog
/etc/logrotate.conf
create
man logrotate
一些版本的 rsyslog 包含一个指令$omfileForceChown作为外部更改文件所有权的解决方法,但不建议这样做。建议的方法是正确配置所有权和权限。有关此问题的更多信息,请参见该链接。
答案2
如果文件权限全部正确并且 logrotate 配置正确,下一步就是查看 rsyslog 系统调用。
# find the start command
me@d2-slprod02:~$ sudo systemctl status rsyslog
● rsyslog.service - System Logging Service
Loaded: loaded (/lib/systemd/system/rsyslog.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2019-06-21 10:04:43 CEST; 2h 26min ago
Docs: man:rsyslogd(8)
http://www.rsyslog.com/doc/
Main PID: 18753 (rsyslogd)
Tasks: 4
Memory: 1.4M
CPU: 291ms
CGroup: /system.slice/rsyslog.service
└─18753 /usr/sbin/rsyslogd -n
# let's have a look at syscalls.
sudo strace /usr/sbin/rsyslogd -n
...
write(2, "rsyslogd: error during parsing f"..., 206rsyslogd: error during parsing file /etc/rsyslog.d/50-default.conf, on or before line 8: warnings occured in file '/etc/rsyslog.d/50-default.conf' around line 8 [v8.16.0 try http://www.rsyslog.com/e/2207 ]
...
一旦我在此文件中修复了拼写错误/etc/rsyslog.d/50-default.conf
,syslog 就会再次开始写入 /var/log/syslog!
答案3
我遇到这个问题是因为我的 /var/log 驻留在 ramdisk 上以减少 SSD 的磨损,而我想将其移动到 HDD,这样我就拥有比当前启动更多的历史记录。
有趣的是,由于它是一个 ramdisk,我没有一个可以在单用户模式下复制的,所以我不知道权限和所有权应该是什么!呃。
简短的故事,关于你的新位置:
chmod 770 /var/log
chgrp syslog /var/log
initctl restart rsyslog
Rsyslog 现在可以写入 /var/log,因为它以“syslog”用户、组“syslog”身份运行。
答案4
今天遇到了权限问题 --- 就我而言,是 SELINUX 关闭了它。rsyslog 正在推送到专用挂载并拒绝权限。
以下是我解决这个问题的方法:
ls -Zd /var/log
drwxr-xr-x root root system_u:object_r:var_log_t:s0 /var/log
根据这些信息,我将更改应用到 rsyslog 位置:
chcon -tR var_log_t /new/directory
重新启动 rsyslog 并立即看到成功运行。将其他 RHEL 服务器链接到日志服务器并观察其他 RHEL 服务器立即开始向其提供信息。请注意,该目录仅需 600 个权限即可正常工作。