關於 sudo 你可能不知道的

2019-11-20 09:18:00

覺得你已經了解了 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 attemptsczanik@linux-mewy:~>

由於並非所有人都喜歡系統管理員的這種幽默,因此預設情況下會禁用這些羞辱資訊。以下範例說明了如何僅對經驗豐富的系統管理員(即 wheel 組的成員)啟用此設定:

Defaults !insultsDefaults:%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 !visiblepwDefaults always_set_homeDefaults match_group_by_gidDefaults always_query_group_pluginDefaults env_resetDefaults 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/binroot ALL=(ALL) ALL%wheel ALL=(ALL) ALLDefaults:%wheel insultsDefaults !insultsDefaults 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 的更多資訊,請參考以下資源: