我可以将 dmesg 限制为一个组吗?

我可以将 dmesg 限制为一个组吗?

我知道,出于安全原因(如地址随机化),不让每个用户都能够读取内核的 dmesg 是有意义的。 Linux 允许使用以下命令将 dmesg 限制为 root 用户:sysctl -w kernel.dmesg_restrict = 1

该 sysctl 强制每个想要使用 dmesg 的人添加前缀sudo,这对我来说是一个问题。

我想要介于两者之间的东西。我希望我的计算机上的某些用户帐户能够无 sudoless 访问 dmesg,但不能像 apache 这样的守护进程或像 www-data 这样的非用户帐户。

理想情况下,dmesg 访问权限将仅限于某个组(例如,adm)。

最干净的方法是什么?


脚注:

1 虽然我喜欢 sudo 的概念,但我相信它应该是一个四个字母的单词:明智的人明智地使用它作为一个完美的绰号,用于极少数情况下,当没有其他东西足够的时候。不幸的是,我看到人们现在不假思索地使用 sudo 来执行许多平凡的任务。让人们养成过度使用 sudo 的习惯是比内核潜在地址泄漏更严重的安全问题。

² 我提到“最干净”,因为我怀疑某些解决方案(例如chmod 4750 /bin/dmesg)可能具有潜在的安全隐患。


更新:我已经接受了 Ikkachu 的setcap解决方案,但我希望在未来的 Linux 版本中会有一个更干净、更通用的答案。也许 dmesg_restrict 的第三个 sysctl 设置介于 0(所有人)和 1(仅限 root)之间,这将允许系统管理员指定受信任的组。

答案1

如果“sudoless”意味着您希望能够dmesg在命令行上进行写入等操作,那么最简单的解决方案是制作一个调用/bin/dmesgthrough 的脚本sudo,并配置 sudo 使其发生而无需输入密码。

所以,像这样:

echo 'username ALL = NOPASSWD:/bin/dmesg  ' >> /etc/sudoers
cat <<'EOF' > ./dmesg
#!/bin/sh
sudo /bin/dmesg "$@"
EOF
chmod +x ./dmesg

然后放在./dmesg你路径中的某个地方。

只要您没有其他程序需要能够直接读取内核消息缓冲区而不经过/bin/dmesg.但是,设置/bin/dmesgsetuid 也会有同样的限制。通过运行它sudo可能比简单地运行 setuid 更安全。

顺便说一句,即使尝试读取它,更改权限也/dev/kmsg不起作用。dmesg它回到syslog(2)系统调用。


如果这还不够,您也许可以这样做能力。 sysctldmesg_restrict将读取日志限制为带有 的进程CAP_SYSLOG,因此我们只需要安排进行设置即可。

所以,像这样:

# cp /bin/dmesg /bin/dmesg.capable 
# chown .adm /bin/dmesg.capable
# chmod 710 /bin/dmesg.capable
# setcap cap_syslog=ep /bin/dmesg.capable

该组中的用户adm现在应该能够/bin/dmesg.capable查看日志。

但请注意,这些功能是臭名昭著的,因为其中许多功能提供了绕过其余访问控制系统的方法,尽管仅授予可能CAP_SYSLOGdmesg以完全 root 身份运行更好。


我想到的其他选项是 SELinux,seccomp以及简单的旧式内核补丁以允许特定组读取日志。

相关内容