Security

我可以將 dmesg 限制為一個組嗎?

  • November 28, 2017

我知道,出於安全原因(例如地址隨機化),不讓每個使用者都能讀取核心的 dmesg 是有道理的。Linux 允許使用以下命令將 dmesg 限制為 root 使用者:sysctl -w kernel.dmesg_restrict = 1.

該 sysctl 迫使所有想要使用 dmesg 的人預先添加sudo,這對我來說是個問題。¹

我想要介於兩者之間的東西。我希望我的機器上的一些使用者帳戶對 dmesg 具有 sudoless 訪問權限,但不是像 apache 這樣的守護程序或像 www-data 這樣的非使用者。

理想情況下,dmesg 訪問權限將僅限於某個組(例如,adm)。

最乾淨的²方法是什麼?


腳註:

¹雖然我在概念上喜歡 sudo,但我認為它應該是一個四個字母的詞:明智的人明智地使用它作為一個完美的綽號,用於在其他什麼都不夠用的極少數情況下。不幸的是,我現在看到人們使用 sudo 來完成許多平凡的任務而沒有三思而後行。讓人們養成過度使用 sudo 的習慣是比核心潛在的地址洩漏更嚴重的安全問題。

² 我提到“最乾淨”,因為我懷疑某些解決方案,例如chmod 4750 /bin/dmesg,可能具有潛在的安全隱患。


更新:我已經接受了 Ikkachu 的setcap解決方案,但我希望在未來的 Linux 版本中會有一個更清晰、更通用的答案。dmesg_restrict 的第三個 sysctl 設置可能介於 0(每個人)和 1(僅限 root)之間,這將使系統管理員指定受信任的組。

如果通過“sudoless”,你的意思是你希望能夠在命令行上寫或這樣,那麼最簡單的解決方案是製作一個通過dmesg呼叫的腳本,並配置 sudo 讓這種情況發生而不需要輸入密碼./bin/dmesg``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)系統呼叫。


如果這還不夠,您可以使用功能來做到這一點。sysctl將dmesg_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只是簡單的舊更新檔核心以允許特定組讀取日誌。

引用自:https://unix.stackexchange.com/questions/404787