我刚刚以非 root 用户身份使用记录器,但看起来每个人都能够使用“-t”参数在系统日志中创建虚假条目。
预计会这样工作吗?我可能会淹没日志或将一些操作隐藏在大量不同的虚假条目之下 - 这对系统安全不利。
我可以阻止它吗?=> logger 是 util-linux-systemd 包(以前的 util-linux)的一部分,不能轻易卸载,其次,它默认对机器上的每个人都是可执行的。
使用的系统:不同的 SuSE Linux (SLE 10、11、15)
命令行:
justin@garfield:~ > logger -t sshd[986]: Accepted publickey from 127.0.0.19.8 port 65537 sha2: RSA 2e:45:25:54:6o:34:3a:z3:55:07:04 (just a fake)"
justin@garfield:~ > su -l
Password:
root@garfield:~ > tail -n 2 /var/log/messages
Oct 27 13:35:45 garfield sshd[986]: Accepted publickey from 127.0.0.19.8 port 65537 sha2: RSA 2e:45:25:54:6o:34:3a:z3:55:07:04 (just a fake)
Oct 27 13:36:21 garfield su: (to root) justin on /dev/pts/0
注意:我只是使用了不可能的值(IP,公钥)来明确表明它是虚假条目。
答案1
我认为它应该以这种方式工作,有时从脚本发布日志消息非常有用。它当然不是为了让用户污染系统日志。我认为解决方案是拥有一个配置良好的日志系统,这将防止用户污染日志或伪造系统消息,让您可以识别有此类习惯的用户。
我使用rsyslogd
,因此我以其作为示例。
首先,您需要配置rsyslogd
来存储它打开的套接字中的某些变量:
module (load="imuxsock"
SysSock.Annotate="on"
SysSock.ParseTrusted="on"
)
通过它,您可以访问以下变量:
pid
:日志记录进程的 PID。uid
和gid
:日志记录过程运行时的 UID 和 GID。appname
:日志记录进程的名称cmd
:日志记录过程的完整命令行
在 的情况下logger
,pid
将是 的 PID systemd-journald
,并且appname
始终为systemd-journal
。有了这些,您可以做以下几件事:
只需记录这些
您可以使用包含这些变量的模板,这样您就可以查看消息和获取的参数之间是否存在差异。在模板中,您可以像 一样访问这些变量%$!pid%
。例如,如果您使用这样的模板:
$template SomeLogFormat,"%TIMESTAMP:::date-rfc3339% <%pri-text%> %syslogtag%%msg% (logged by pid=%$!pid% running as %$!uid%)\n"
daemon.* /var/log/daemon.log;SomeLogFormat
将产生以下条目:
2021-10-27T18:27:54.638759+02:00 <daemon.info> sshd[986]: Accepted publickey from 127.0.0.19.8 port 65537 sha2: RSA 2e:45:25:54:6o:34:3a:z3:55:07:04 (just a fake) (logged by pid=540 running as 1000)
从中,您可以判断消息是否合法,如果不合法,您将获得心情不好的用户的 UID。请注意,您可以使用模板,而不是逐个提供参数,%$!%
该模板将以 JSON 格式记录上述值。
重新路由用户日志
您可以将用户写入的日志放在单独的文件中(可能放在单独的文件系统上,这样用户就不会填满根文件系统)。您可以使用以下配置重新路由来自用户的所有日志:
if $!uid > 999 then /opt/log/user.log;SomeLogFormat
& stop
模板(部分)的使用;SomeLogFormat
是可选的。这样,来自 UID 为 1000 以上的所有内容都将写入/opt/log/user.log
。您甚至可以按 UID 分隔用户日志,如下所示:
$template userLogFile,"/opt/log/userlog_%$!uid%.log"
if $!uid > 999 then ?userLogFile;SomeLogFormat
& stop
这样,每个用户都会有自己的userlog_xxxx.log
文件。