關於 sudo 你可能不知道的

以爲你已經瞭解了 sudo 的全部知識了嗎?再想一想。linux

你們都知道 sudo,對嗎?默認狀況下,該工具已安裝在大多數 Linux 系統上,而且可用於大多數 BSD 和商業 Unix 變體。不過,在與數百名 sudo 用戶交談以後,我獲得的最多見的答案是 sudo 是一個使生活複雜化的工具。git

有 root 用戶和 su 命令,那麼爲何還要使用另外一個工具呢?對於許多人來講,sudo 只是管理命令的前綴。只有極少數人提到,當你在同一個系統上有多個管理員時,可使用 sudo 日誌查看誰作了什麼。github

那麼,sudo 是什麼? 根據 sudo 網站shell

「sudo 容許系統管理員經過授予某些用戶以 root 用戶或其餘用戶身份運行某些命令的能力,同時提供命令及其參數的審覈記錄,從而委派權限。」安全

默認狀況下,sudo 只有簡單的配置,一條規則容許一個用戶或一組用戶執行幾乎全部操做(在本文後面的配置文件中有更多信息):bash

%wheel ALL=(ALL) ALL
複製代碼

在此示例中,參數表示如下含義:服務器

  • 第一個參數(%wheel)定義組的成員。
  • 第二個參數(ALL)定義組成員能夠在其上運行命令的主機。
  • 第三個參數((ALL))定義了能夠執行命令的用戶名。
  • 最後一個參數(ALL)定義能夠運行的應用程序。

所以,在此示例中,wheel 組的成員能夠以全部主機上的全部用戶身份運行全部應用程序。但即便是這個一切容許的規則也頗有用,由於它會記錄誰在計算機上作了什麼。app

別名

固然,它不只可讓你和你最好的朋友管理一個共享機器,你還能夠微調權限。你能夠將以上配置中的項目替換爲列表:用戶列表、命令列表等。多數狀況下,你可能會複製並粘貼配置中的一些列表。編輯器

在這種狀況下,別名能夠派上用場。在多個位置維護相同的列表容易出錯。你能夠定義一次別名,而後能夠屢次使用。所以,當你對一位管理員再也不信任時,將其從別名中刪除就好了。使用多個列表而不是別名,很容易忘記從具備較高特權的列表之一中刪除用戶。模塊化

爲特定組的用戶啓用功能

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: opensource.com/article/19/…

做者:Peter Czanik 選題:lujun9972 譯者:wxy 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出

相關文章
相關標籤/搜索