以爲你已經瞭解了 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 版將包含許多有趣的新功能。如下是最重要的計劃功能:
sudoers
添加新功能,而是爲插件提供了 API,以方便地訪問任何類型的 sudo
日誌。這個插件容許使用插件從 sudo
事件建立自定義日誌。sudo
,而不是使用 C 語言進行原生編碼。但願本文能向你證實 sudo
不只僅是一個簡單的命令前綴。有無數種可能性能夠微調系統上的權限。你不只能夠微調權限,還能夠經過檢查摘要來提升安全性。會話記錄使你可以檢查系統上正在發生的事情。你也可使用插件擴展 sudo
的功能,或者使用已有的插件或編寫本身的插件。最後,從即將發佈的功能列表中你能夠看到,即便 sudo
已有數十年的歷史,它也是一個不斷髮展的有生命力的項目。
若是你想了解有關 sudo
的更多信息,請參考如下資源:
via: opensource.com/article/19/…
做者:Peter Czanik 選題:lujun9972 譯者:wxy 校對:wxy