我知道,出于安全原因(如地址随机化),不让每个用户都能够读取内核的 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/dmesg
through 的脚本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/dmesg
setuid 也会有同样的限制。通过运行它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_SYSLOG
比dmesg
以完全 root 身份运行更好。
我想到的其他选项是 SELinux,seccomp
以及简单的旧式内核补丁以允许特定组读取日志。