2020 年 5 個新 sudo 功能
當你想在 POSIX 系統上執行一個操作時,最安全的方法之一就是使用 sudo
命令。與以 root 用戶身份登錄並執行命令可能是個危險的操作不同,sudo
授予任何被系統管理員指定為 「sudoer」的用戶臨時許可權,來執行通常受限制的活動。
幾十年來,這個系統幫助 Linux、Unix 和 macOS 系統免受愚蠢的錯誤和惡意攻擊,它是當今所有主要 Linux 發行版的默認管理機制。
當在 2020 年 5 月發布 sudo 1.9 時,它帶來了許多新功能,包括集中收集會話記錄,支持 sudo
內的 chroot,以及 Python API。如果你對其中的任何一項感到驚訝,請閱讀我的文章,了解一些 sudo 鮮為人知的功能。
sudo
不僅僅是一個管理命令的前綴。你可以微調許可權,記錄終端上發生的事情,使用插件擴展sudo
,在 LDAP 中存儲配置,進行廣泛的日誌記錄,以及更多。
1.9.0 版本和後續的小版本增加了各種新功能(我將在下面介紹),包括:
- 一個集中收集
sudo
會話記錄的記錄服務 - 審計插件 API
- 審批插件 API
- Python 對插件的支持
sudo
內置 chroot 和 CWD 支持(從 1.9.3 開始)
哪裡可以得到 sudo 1.9?
大多數的 Linux 發行版仍然封裝了上一代的 sudo
(1.8 版本),並且在長期支持(LTS)的發行版中會保持這個版本數年。據我所知,提供了最完整的 sudo 1.9 包的 Linux 發行版是 openSUSETumbleweed,它是一個滾動發行版,而且該 sudo
包的子包中有 Python 支持。最近的 Fedora 版本包含了 sudo 1.9,但沒有 Python 支持。FreeBSD Ports 有最新的 sudo
版本,如果你自己編譯 sudo
而不是使用軟體包,你可以啟用 Python 支持。
如果你喜歡的 Linux 發行版還沒有包含 sudo 1.9,請查看 sudo 二進位頁面來查看是否有現成的包可以用於你的系統。這個頁面還提供了一些商用 Unix 變種的軟體包。
像往常一樣,在你開始試驗 sudo
設置之前,確保你知道 root 密碼。是的,即使在 Ubuntu 上也是如此。有一個臨時的「後門」是很重要的;如果沒有這個後門,如果出了問題,你就必須得黑掉自己的系統。記住:語法正確的配置並不意味著每個人都可以在該系統上通過 sudo
做任何事情!
記錄服務
記錄服務可以集中收集會話記錄。與本地會話記錄存儲相比,這有很多優勢:
- 更方便地在一個地方進行搜索,而不是訪問各個機器來尋找記錄
- 即使在發送機器停機的情況下也可以進行記錄
- 本地用戶若想掩蓋其軌跡,不能刪除記錄
為了快速測試,你可以通過非加密連接向記錄服務發送會話。我的博客中包含了說明,可以在幾分鐘內完成設置。對於生產環境,我建議使用加密連接。有很多可能性,所以請閱讀最適合你的環境的文檔。
審計插件 API
新的審計插件 API 不是一個用戶可見的功能。換句話說,你不能從 sudoers
文件中配置它。它是一個 API,意味著你可以從插件中訪問審計信息,包括用 Python 編寫的插件。你可以用很多不同的方式來使用它,比如當一些有趣的事情發生時,從 sudo
直接發送事件到 Elasticsearch 或日誌即服務(LaaS)上。你也可以用它來進行調試,並以任何你喜歡的格式將其他難以訪問的信息列印到屏幕上。
根據你使用它的方式,你可以在 sudo
插件手冊頁(針對 C 語言)和 sudo
Python 插件手冊中找到它的文檔。在 sudo
源代碼中可以找到 Python 代碼示例,在我的博客上也有一個簡化的例子。
審批插件 API
審批插件 API 可以在命令執行之前加入額外的限制。這些限制只有在策略插件成功後才會運行,因此你可以有效地添加額外的策略層,而無需更換策略插件,進而無需更換 sudoers
。可以定義多個審批插件,而且所有插件都必須成功,命令才能執行。
與審計插件 API 一樣,你可以從 C 和 Python 中使用它。我博客上記錄的示例 Python 代碼是對該 API 的一個很好的介紹。一旦你理解了它是如何工作的,你就可以擴展它來將 sudo
連接到工單系統,並且只批准有相關開放工單的會話。你也可以連接到人力資源資料庫,這樣只有當班的工程師才能獲得管理許可權。
Python 對插件的支持
儘管我不是程序員,但我最喜歡的 sudo 1.9 新特性是 Python 對插件的支持。你可以用 Python 也能使用 C 語言調用大部分 API。幸運的是,sudo
對性能不敏感,所以運行速度相對較慢的 Python 代碼對 sudo
來說不是問題。使用 Python 來擴展 sudo
有很多優勢:
- 更簡單、更快速的開發
- 不需要編譯;甚至可以通過配置管理分發代碼
- 許多 API 沒有現成的 C 客戶端,但有 Python 代碼
除了審計和審批插件 API 之外,還有一些其他的 API,你可以用它們做一些非常有趣的事情。
通過使用策略插件 API,你可以取代 sudo
策略引擎。請注意,你將失去大部分的 sudo
功能,而且沒有基於 sudoers
的配置。這在小眾情況下還是很有用的,但大多數時候,最好還是繼續使用 sudoers
,並使用審批插件 API 創建額外的策略。如果你想嘗試一下,我的 Python 插件介紹提供了一個非常簡單的策略:只允許使用 id
命令。再次確認你知道 root 密碼,因為一旦啟用這個策略,它就會阻止任何實際使用 sudo
的行為。
使用 I/O 日誌 API,你可以訪問用戶會話的輸入和輸出。這意味著你可以分析會話中發生了什麼,甚至在發現可疑情況時終止會話。這個 API 有很多可能的用途,比如防止數據泄露。你可以監控屏幕上的關鍵字,如果數據流中出現任何關鍵字,你可以在關鍵字出現在用戶的屏幕上之前中斷連接。另一種可能是檢查用戶正在輸入的內容,並使用這些數據來重建用戶正在輸入的命令行。例如,如果用戶輸入 rm -fr /
,你可以在按下回車鍵之前就斷開用戶的連接。
組插件 API 允許非 Unix 組的查找。在某種程度上,這與審批插件 API 類似,因為它也擴展了策略插件。你可以檢查一個用戶是否屬於一個給定的組,並在後面的配置部分基於此採取行動。
chroot 和 CWD 支持
sudo
的最新功能是支持 chroot 和改變工作目錄(CWD),這兩個選項都不是默認啟用的,你需要在 sudoers
文件中明確啟用它們。當它們被啟用時,你可以調整目標目錄或允許用戶指定使用哪個目錄。日誌反映了這些設置何時被使用。
在大多數系統中,chroot 只對 root 用戶開放。如果你的某個用戶需要 chroot,你需要給他們 root 許可權,這比僅僅給他們 chroot 許可權要大得多。另外,你可以通過 sudo
允許訪問 chroot 命令,但它仍然允許漏洞,他們可以獲得完全的許可權。當你使用 sudo
內置的 chroot 支持時,你可以輕鬆地限制對單個目錄的訪問。你也可以讓用戶靈活地指定根目錄。當然,這可能會導致災難(例如,sudo --chroot / -s
),但至少事件會被記錄下來。
當你通過 sudo
運行一個命令時,它會將工作目錄設置為當前目錄。這是預期的行為,但可能有一些情況下,命令需要在不同的目錄下運行。例如,我記得使用過一個應用程序,它通過檢查我的工作目錄是否是 /root
來檢查我的許可權。
嘗試新功能
希望這篇文章能啟發你仔細研究一下 sudo 1.9。集中會話記錄比在本地存儲會話日誌更加方便和安全。chroot 和 CWD 支持為你提供了額外的安全性和靈活性。而使用 Python 來擴展 sudo
,可以很容易地根據你的環境來定製 sudo
。你可以通過使用最新的 Linux 發行版或 sudo
網站上的即用型軟體包來嘗試這些新功能。
如果你想了解更多關於 sudo 的信息,這裡有一些資源:
via: https://opensource.com/article/20/10/sudo-19
作者:Peter Czanik 選題:lujun9972 譯者:wxy 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive