簡單的說,sudo 是一種許可權管理機制,管理員可以授權於一些普通使用者去執行一些 root 執行的操作,而不需要知道 root 的密碼。
嚴謹些說,sudo 允許一個已授權使用者以超級使用者或者其它使用者的角色執行一個命令。當然,能做什麼不能做什麼都是通過安全策略來指定的。sudo 支援外掛架構的安全策略,並能把輸入輸出寫入日誌。第三方可以開發併發布自己的安全策略和輸入輸出日誌外掛,並讓它們無縫的和 sudo 一起工作。預設的安全策略記錄在 /etc/sudoers 檔案中。而安全策略可能需要使用者通過密碼來驗證他們自己。也就是在使用者執行 sudo 命令時要求使用者輸入自己賬號的密碼。如果驗證失敗,sudo 命令將會退出。(注意,本文介紹的 sudo 命令執行在 ubuntu 14.04中。)
sudo 命令語法
sudo [-bhHpV][-s ][-u <使用者>][指令]
或
sudo [-klv]
引數
-b 在後臺執行指令。
-h 顯示幫助。
-H 將HOME環境變數設為新身份的HOME環境變數。
-k 結束密碼的有效期限,也就是下次再執行sudo時便需要輸入密碼。
-l 列出目前使用者可執行與無法執行的指令。
-p 改變詢問密碼的提示符號。
-s 執行指定的shell。
-u <使用者> 以指定的使用者作為新的身份。若不加上此引數,則預設以root作為新的身份。
-v 延長密碼有效期限5分鐘。
-V 顯示版本資訊。
-S 從標準輸入流替代終端來獲取密碼
sudo 程式相關檔案
/etc/sudoers
/etc/init.d/sudo
/etc/pam.d/sudo
/var/lib/sudo
/usr/share/doc/sudo
/usr/share/lintian/overrides/sudo
/usr/share/bash-completion/completions/sudo
/usr/bin/sudo
/usr/lib/sudo
基本配置
系統預設建立了一個名為 sudo 的組。只要把使用者加入這個組,使用者就具有了 sudo 的許可權。
至於如何把使用者加入 sudo 組,您可以直接編輯 /etc/group 檔案,當然您得使用一個有 sudo 許可權的使用者來幹這件事:
$ sudo vim /etc/group
在 sudo 組中加入新的使用者,要使用逗號分隔多個使用者。
或者您可以使用 usermod 命令把使用者新增到一個組中:
$ sudo usermod -a -G sudo jack
上面的設定中我們把使用者 jack 新增到了 sudo 組中,所以當使用者 jack 登入後就可以通過 sudo 命令以 root 許可權執行命令了!
詳細配置
在前面的配置中我們只是把使用者 jack 加入了 sudo 組,他就具有了通過 root 許可權執行命令的能力。
現在我們想問一下,這是怎麼發生的?是時候介紹如何配置 sudo 命令了!
sudo 命令的配置檔案為 /etc/sudoers。(注意,/etc/sudoers 的配置內容十分豐富,我們僅做簡單的介紹。要了解更多資訊,請參考 man sudoers。)
編輯這個檔案是有單獨的命令的 visudo(這個檔案我們最好不要使用 vim 命令來開啟),是因為一旦你的語法寫錯會造成嚴重的後果,這個工具會替你檢查你寫的語法,這個檔案的語法遵循以下格式:
who where whom command
說白了就是哪個使用者在哪個主機以誰的身份執行那些命令,那麼這個 where, 是指允許在那臺主機 ssh 連線進來才能執行後面的命令,檔案裡面預設給 root 使用者定義了一條規則:
root ALL=(ALL:ALL) ALL
root 表示 root 使用者。
ALL 表示從任何的主機上都可以執行,也可以這樣 192.168.100.0/24。
(ALL:ALL) 是以誰的身份來執行,ALL:ALL 就代表 root 可以任何人的身份來執行命令。
ALL 表示任何命令。
那麼整條規則就是 root 使用者可以在任何主機以任何人的身份來執行所有的命令。
現在我們可以回答 jack 為什麼具有通過 root 許可權執行命令的能力了。開啟 /etc/sudoers 檔案:
sudo 組中的所有使用者都具有通過 root 許可權執行命令的能力!
再看個例子:
nick 192.168.10.0/24=(root) /usr/sbin/useradd
上面的配置只允許 nick 在 192.168.10.0/24 網段上連線主機並且以 root 許可權執行 useradd 命令。
設定 sudo 時不需要輸入密碼
執行 sudo 命令時總是需要輸入密碼事件很不爽的事情(拋開安全性)。有些應用場景也需要在執行 sudo 時避開輸入密碼的互動過程。
那麼需要如何設定呢?其實很簡單,只需要在配置行中新增 NOPASSWD: 就可以了:
****** ALL=(ALL) NOPASSWD: ALL
再試試看,是不是已經不需要輸入密碼了?
sudo 的日誌
在 ubuntu 中,sudo 的日誌預設被記錄在 /var/log/auth.log 檔案中。當我們執行 sudo 命令時,相關日誌都是會被記錄下來的。比如下圖中顯示的就是一次執行 sudo 命令的日誌: