關於 sudo 你可能不知道的
大家都知道 sudo
,對嗎?默認情況下,該工具已安裝在大多數 Linux 系統上,並且可用於大多數 BSD 和商業 Unix 變體。不過,在與數百名 sudo
用戶交談之後,我得到的最常見的答案是 sudo
是一個使生活複雜化的工具。
有 root 用戶和 su
命令,那麼為什麼還要使用另一個工具呢?對於許多人來說,sudo
只是管理命令的前綴。只有極少數人提到,當你在同一個系統上有多個管理員時,可以使用 sudo
日誌查看誰做了什麼。
那麼,sudo
是什麼? 根據 sudo 網站:
「sudo 允許系統管理員通過授予某些用戶以 root 用戶或其他用戶身份運行某些命令的能力,同時提供命令及其參數的審核記錄,從而委派許可權。」
默認情況下,sudo
只有簡單的配置,一條規則允許一個用戶或一組用戶執行幾乎所有操作(在本文後面的配置文件中有更多信息):
%wheel ALL=(ALL) ALL
在此示例中,參數表示以下含義:
- 第一個參數(
%wheel
)定義組的成員。 - 第二個參數(
ALL
)定義組成員可以在其上運行命令的主機。 - 第三個參數(
(ALL)
)定義了可以執行命令的用戶名。 - 最後一個參數(
ALL
)定義可以運行的應用程序。
因此,在此示例中,wheel
組的成員可以以所有主機上的所有用戶身份運行所有應用程序。但即使是這個一切允許的規則也很有用,因為它會記錄誰在計算機上做了什麼。
別名
當然,它不僅可以讓你和你最好的朋友管理一個共享機器,你還可以微調許可權。你可以將以上配置中的項目替換為列表:用戶列表、命令列表等。多數情況下,你可能會複製並粘貼配置中的一些列表。
在這種情況下,別名可以派上用場。在多個位置維護相同的列表容易出錯。你可以定義一次別名,然後可以多次使用。因此,當你對一位管理員不再信任時,將其從別名中刪除就行了。使用多個列表而不是別名,很容易忘記從具有較高特權的列表之一中刪除用戶。
為特定組的用戶啟用功能
sudo
命令帶有大量默認設置。不過,在某些情況下,你想覆蓋其中的一些情況,這時你可以在配置中使用 Defaults
語句。通常,對每個用戶都強制使用這些默認值,但是你可以根據主機、用戶名等將設置縮小到一部分用戶。這裡有個我那一代的系統管理員都喜歡玩的一個示例:「羞辱」。這些只不過是一些有人輸入錯誤密碼時的有趣信息:
czanik@linux-mewy:~> sudo ls
[sudo] password for root:
Hold it up to the light --- not a brain in sight! # 把燈舉高點,腦仁太小看不到
[sudo] password for root:
My pet ferret can type better than you! # 我的寵物貂也比你輸入的好
[sudo] password for root:
sudo: 3 incorrect password attempts
czanik@linux-mewy:~>
由於並非所有人都喜歡系統管理員的這種幽默,因此默認情況下會禁用這些羞辱信息。以下示例說明了如何僅對經驗豐富的系統管理員(即 wheel
組的成員)啟用此設置:
Defaults !insults
Defaults:%wheel insults
我想,感謝我將這些消息帶回來的人用兩隻手也數不過來吧。
摘要驗證
當然,sudo
還有更嚴肅的功能。其中之一是摘要驗證。你可以在配置中包括應用程序的摘要:
peter ALL = sha244:11925141bb22866afdf257ce7790bd6275feda80b3b241c108b79c88 /usr/bin/passwd
在這種情況下,sudo
在運行應用程序之前檢查應用程序摘要,並將其與配置中存儲的摘要進行比較。如果不匹配,sudo
拒絕運行該應用程序。儘管很難在配置中維護此信息(沒有用於此目的的自動化工具),但是這些摘要可以為你提供額外的保護層。
會話記錄
會話記錄也是 sudo
鮮為人知的功能。在演示之後,許多人離開我的演講後就計劃在其基礎設施上實施它。為什麼?因為使用會話記錄,你不僅可以看到命令名稱,還可以看到終端中發生的所有事情。你可以看到你的管理員在做什麼,要不他們用 shell 訪問了機器而日誌僅會顯示啟動了 bash
。
當前有一個限制。記錄存儲在本地,因此具有足夠的許可權的話,用戶可以刪除他們的痕迹。所以請繼續關注即將推出的功能。
插件
從 1.8 版開始,sudo
更改為基於插件的模塊化體系結構。通過將大多數功能實現為插件,你可以編寫自己的功能輕鬆地替換或擴展 sudo
的功能。已經有了 sudo
上的開源和商業插件。
在我的演講中,我演示了 sudo_pair
插件,該插件可在 GitHub 上獲得。這個插件是用 Rust 開發的,這意味著它不是那麼容易編譯,甚至更難以分發其編譯結果。另一方面,該插件提供了有趣的功能,需要第二個管理員通過 sudo
批准(或拒絕)運行命令。不僅如此,如果有可疑活動,可以在屏幕上跟蹤會話並終止會話。
在最近的 All Things Open 會議上的一次演示中,我做了一個臭名昭著的演示:
czanik@linux-mewy:~> sudo rm -fr /
看著屏幕上顯示的命令。每個人都屏住呼吸,想看看我的筆記本電腦是否被毀了,然而它逃過一劫。
日誌
正如我在開始時提到的,日誌記錄和警報是 sudo
的重要組成部分。如果你不會定期檢查 sudo
日誌,那麼日誌在使用 sudo
中並沒有太多價值。該工具通過電子郵件提醒配置中指定的事件,並將所有事件記錄到 syslog 中。可以打開調試日誌用於調試規則或報告錯誤。
警報
電子郵件警報現在有點過時了,但是如果你使用 syslog-ng 來收集日誌消息,則會自動解析 sudo
日誌消息。你可以輕鬆創建自定義警報並將其發送到各種各樣的目的地,包括 Slack、Telegram、Splunk 或 Elasticsearch。你可以從我在 syslong-ng.com 上的博客中了解有關此功能的更多信息。
配置
我們談論了很多 sudo
功能,甚至還看到了幾行配置。現在,讓我們仔細看看 sudo
的配置方式。配置本身可以在 /etc/sudoers
中獲得,這是一個簡單的文本文件。不過,不建議直接編輯此文件。相反,請使用 visudo
,因為此工具還會執行語法檢查。如果你不喜歡 vi
,則可以通過將 EDITOR
環境變數指向你的首選編輯器來更改要使用的編輯器。
在開始編輯 sudo
配置之前,請確保你知道 root 密碼。(是的,即使在默認情況下 root 用戶沒有密碼的 Ubuntu 上也是如此。)雖然 visudo
會檢查語法,但創建語法正確而將你鎖定在系統之外的配置也很容易。
如果在緊急情況下,而你手頭有 root 密碼,你也可以直接編輯配置。當涉及到 sudoers
文件時,有一件重要的事情要記住:從上到下讀取該文件,以最後的設置為準。這個事實對你來說意味著你應該從通用設置開始,並在末尾放置例外情況,否則,通用設置會覆蓋例外情況。
你可以在下面看到一個基於 CentOS 的簡單 sudoers
文件,並添加我們之前討論的幾行:
Defaults !visiblepw
Defaults always_set_home
Defaults match_group_by_gid
Defaults always_query_group_plugin
Defaults env_reset
Defaults env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS"
Defaults env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
root ALL=(ALL) ALL
%wheel ALL=(ALL) ALL
Defaults:%wheel insults
Defaults !insults
Defaults log_output
該文件從更改多個默認值開始。然後是通常的默認規則:root
用戶和 wheel
組的成員對計算機具有完全許可權。接下來,我們對 wheel
組啟用「羞辱」,但對其他所有人禁用它們。最後一行啟用會話記錄。
上面的配置在語法上是正確的,但是你可以發現邏輯錯誤嗎?是的,有一個:後一個通用設置覆蓋了先前的更具體設置,讓所有人均禁用了「羞辱」。一旦交換了這兩行的位置,設置就會按預期進行:wheel
組的成員會收到有趣的消息,但其他用戶則不會收到。
配置管理
一旦必須在多台機器上維護 sudoers
文件,你很可能希望集中管理配置。這裡主要有兩種可能的開源方法。兩者都有其優點和缺點。
你可以使用也用來配置其餘基礎設施的配置管理應用程序之一:Red Hat Ansible、Puppet 和 Chef 都具有用於配置 sudo
的模塊。這種方法的問題在於更新配置遠非實時。同樣,用戶仍然可以在本地編輯 sudoers
文件並更改設置。
sudo
工具也可以將其配置存儲在 LDAP 中。在這種情況下,配置更改是實時的,用戶不能弄亂sudoers
文件。另一方面,該方法也有局限性。例如,當 LDAP 伺服器不可用時,你不能使用別名或使用 sudo
。
新功能
新版本的 sudo
即將推出。1.9 版將包含許多有趣的新功能。以下是最重要的計劃功能:
- 記錄服務可集中收集會話記錄,與本地存儲相比,它具有許多優點:
- 在一個地方搜索更方便。
- 即使發送記錄的機器關閉,也可以進行記錄。
- 記錄不能被想要刪除其痕迹的人刪除。
- audit 插件沒有向
sudoers
添加新功能,而是為插件提供了 API,以方便地訪問任何類型的sudo
日誌。這個插件允許使用插件從sudo
事件創建自定義日誌。 - approval 插件無需使用第三方插件即可啟用會話批准。
- 以及我個人最喜歡的:插件的 Python 支持,這使你可以輕鬆地使用 Python 代碼擴展
sudo
,而不是使用 C 語言進行原生編碼。 ### 總結
希望本文能向你證明 sudo
不僅僅是一個簡單的命令前綴。有無數種可能性可以微調系統上的許可權。你不僅可以微調許可權,還可以通過檢查摘要來提高安全性。會話記錄使你能夠檢查系統上正在發生的事情。你也可以使用插件擴展 sudo
的功能,或者使用已有的插件或編寫自己的插件。最後,從即將發布的功能列表中你可以看到,即使 sudo
已有數十年的歷史,它也是一個不斷發展的有生命力的項目。
如果你想了解有關 sudo
的更多信息,請參考以下資源:
via: https://opensource.com/article/19/10/know-about-sudo
作者:Peter Czanik 選題:lujun9972 譯者:wxy 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive