我可以將 dmesg 限制為一個組嗎?
我知道,出於安全原因(例如地址隨機化),不讓每個使用者都能讀取核心的 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/dmesg
setuid 將具有相同的限制。通過執行它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
只是簡單的舊更新檔核心以允許特定組讀取日誌。