我可以阻止非 root 用户使用记录器在系统日志中创建虚假条目(例如 sshd)吗?

我可以阻止非 root 用户使用记录器在系统日志中创建虚假条目(例如 sshd)吗?

我刚刚以非 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。
  • uidgid:日志记录过程运行时的 UID 和 GID。
  • appname:日志记录进程的名称
  • cmd:日志记录过程的完整命令行

在 的情况下loggerpid将是 的 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文件。

相关内容