root 如何啟動一個只有 root 才能殺死的進程?

root 如何啟動一個只有 root 才能殺死的進程?

在背景啟動進程或將其作為systemd服務很容易。

然而,如果我想啟動一個進程來監視Linux機器上的活動,那麼它就成為了攻擊的目標。如果任何使用者想做壞事,它會先透過簡單地執行或 來終止該進程,即使他們只是sudoers 或wheel使用者。killsystemctl stop

有沒有辦法強制執行只能root殺死的進程?


夥計們,只要想到連rsyslog服務都可以被殺死,你就應該承認 Linux 確實是多麼脆弱。這就像飛行員可以關閉黑盒子一樣。有航空公司允許這種情況發生嗎?或者是否有人給飛行員一份允許名單,以阻止他們採取任何措施來拯救飛機?當然,飛行員可以讓飛機墜毀,但黑盒子會被記錄下來。

從安全角度來看,我關於禁止名單的提議是合法的,儘管它可能會讓你感到害怕。所以不要試圖責怪提出問題的人,好嗎?

答案1

擁有不受限制的 sudo/wheel 權限,任何人都可以撤消您所做的任何事情。即使您設法透過消除直接終止進程的可能性(例如使用 )來實現此目的,sudo kill仍然可以使用其他 sudo 命令來規避此問題,或者您也將自己鎖定在管理之外。

問問自己,為什麼不受信任的用戶首先擁有不受限制的 sudo 權限?他們不應該。僅將此類特權給予您完全信任的人。如果仍有一些特權命令需要執行,請僅對這些命令啟用 sudo:

+netmgr /usr/sbin/ifup, /usr/sbin/ifdown

(用於visudo -f /etc/sudoers.d/netmgr將其放入 sudoers 附加文件中)。

這樣您就可以允許用戶僅運行sudo /usr/sbin/ifupsudo /usr/sbin/ifdown,但不允許運行其他 sudo 命令。中還有大量其他範例、說明和安全注意事項man sudoers。閱讀!

審計通常以其他方式完成。特別是,您設定了其他機器,配置其係統日誌以接受來自遠端站的日誌。在有問題的機器上,您設定了日誌記錄,以便除了本機儲存之外,它還會將所有日誌傳送到日誌記錄機器中。即使有人禁用此日誌發送,禁用本身的操作也會被記錄下來,所以至少您會知道誰是罪魁禍首。

答案2

你不能賦予某人權力,然後又阻止他們使用它。你必須嚴格限制你賦予他們的權力,只包括你希望他們擁有的權力。

您在評論中說:

我必須允許他們使用killorsystemctl stop因為有一些應用程式確實需要這些權限來完成他們的工作

這並不意味著那些使用者需要存取這些命令,只有那些應用。使用者的運行權限有限sudo ./someprogram,一旦程式以 root 身份運行,它就可以kill根據需要使用 等。不過,使用者無法直接存取這些內部命令。

從根本上來說,用戶不需要訪問命令,他們需要訪問功能性。如果kill風險太大,則阻止對其進行存取並提供其他更安全的方法來實現相同的結果。也許您創建了一個小型實用程序safekill,其行為類似於kill但拒絕終止某些進程的請求。為您的用戶提供 sudo 訪問權限safekill,但不是真正的kill.如果使用者總是使用這些命令來做同樣的事情,請將整個過程封裝在一個小程式中,並讓他們使用它而不是手動執行(例如,他們會運行sudo restart_webservers而不是單獨終止並重新啟動所有不同的伺服器進程) 。您的用戶仍然可以存取他們所需的功能,但他們無法直接使用危險武器。

根據您的特定設置,可能還有另一種更極端的執行機制可用。一些處理器有看門狗定時器可用的。修改您的活動監控程序以啟動看門狗並每隔幾秒鐘重置一次。如果有人設法殺死您的監視器,看門狗計時器將到期,系統將自行重新啟動,在啟動時重新啟動監視器程式。這不會嚴格阻止監視器被停用,但會禁止任何人在停用它後做任何有意義的事情。這也會在您的系統日誌中創建漂亮的大危險信號。大多數帶有看門狗的系統都會報告看門狗何時觸發特定的重新啟動。使用者登入 shell 時發生的看門狗觸發的重新啟動應視為非常可疑的。

答案3

Linux菜鳥在這裡。您是否可以考慮編寫只執行這些人應該做的事情的程式或腳本,然後使它們成為 root 所有者並添加它們 setuid 位元?當然,一個大問題是您可能不希望其他人執行這些命令。不知道你能否取得原始的使用者資訊。當然,使用 setuid/setgid 時始終需要格外小心。

答案4

我想出了一個開始!

root可以為使用者設定 DEFAULT SHELL,如下所示:

useradd [someuser] -s [a certain executable]

那麼如果某個可執行檔 = A 審查腳本:

  1. 自動審查某些指令的執行。喜歡stop&rsyslog結合。

  2. 禁止命令轉義此 shell 並使用另一個 shell,甚至是原始 shellbash

  3. 禁止命令以防止使用者獲得root像上面提到的 @user253751 那樣的角色。

  4. 將其餘命令傳遞給/bin/bash

然後r+x為任何用戶設定它。

在此答案下,任何建議都會受到讚賞。特別是對於2和3,似乎有多種方法。


/etc/profileBash 將首先載入和中的設定/etc/bashrc。我注意到後者處理PROMPT_COMMAND變數。可以在它的最後一行劫持它以添加到審查腳本中,但某些系統需要豁免用戶名,因為預設沒有人具有 root 權限將其更改回來。

滿足上述4+1的完整審查將被標記為合法答案。

我永遠不會將“你應該放棄”的答案標記為合法的。

相關問題是:

如何記錄使用者的 bash 指令?

如何讓 bash 將 shell 指令記錄到 syslog?

不執行 bash_profile 或 bashrc 登入

相關內容