許多指令與系統公用程式都需要以 root 身分執行,才能修改檔案並/或執行只有進階使用者才能執行的任務。出於安全考量並避免在無意間執行可能造成嚴重後果的指令,一般情況下建議不要以 root 身分登入,而是以無特權的一般使用者身分進行操作,並使用 sudo 指令以執行需要更高權限的指令。
在 SUSE Linux Enterprise Desktop 上,sudo 預設設定為以類似 su 的方式運作。不過,sudo 允許使用者以可靈活設定的方式使用其他任何使用者擁有的權限執行指令。此舉可以將具有特定權限的角色指定給某些使用者和群組。舉例而言,可以允許 users 群組的成員以 wilber 擁有的權限執行指令。而對指令的存取還可以進一步予以限制,例如禁止指定任何指令選項。su 始終要求必須提供 root 密碼才能使用 PAM 進行驗證,但 sudo 可以設定為使用您自己的身分證明進行驗證。此舉無需透露 root 密碼,因此更加安全。例如,您可以允許 users 群組的成員以 wilber 身分執行 frobnicate 指令,並禁止其指定任何引數。這樣可以將具有特定能力的角色指定給某些使用者和群組。
sudo 的基本使用方法 #
sudo 簡單易用,但能力不凡。
以一般使用者身分登入後,您可以透過在指令前增加 sudo,以 root 身分執行任何指令。系統會提示使用者輸入 root 密碼,一旦驗證成功,便會以 root 身分執行指令︰
tux >id -un1 tuxtux >sudo id -un root's password:2 roottux >id -un tux3tux >sudo id -un 4 root
| |
輸入期間,密碼不會顯示 (既不顯示為純文字,也不顯示為項目符號)。 | |
只有以 | |
在限定時間內,您無需再次輸入 |
I/O 重新導向的工作方式與您的預期可能會有所不同︰
tux >sudo echo s > /proc/sysrq-trigger bash: /proc/sysrq-trigger: Permission deniedtux >sudo cat < /proc/1/maps bash: /proc/1/maps: Permission denied
只有 echo/cat 二進位值會以更高權限執行,重新導向會由使用者的外圍程序以使用者自己的權限來執行。若要啟動外圍程序,可依第 2.1.2 節 「啟動外圍程序」中所述的方法,或使用 dd 公用程式︰
echo s | sudo dd of=/proc/sysrq-trigger sudo dd if=/proc/1/maps | cat
在每個指令前都增加 sudo 可能會很繁瑣。雖然您可以指定一個外圍程序做為 sudo bash 指令,但還是建議使用下列其中一種內建機制來啟動外圍程序︰
sudo -s (<指令>)
啟動由 SHELL 環境變數所指定的外圍程序或目標使用者的預設外圍程序。如果提供了指令,此指令便會傳遞給該外圍程序 (使用 -c 選項);否則,外圍程序會以互動模式執行。
tux:~ >sudo -i root's password:root:/home/tux #exittux:~ >
sudo -i (<指令>)
與 -s 類似,但會將該外圍程序啟動為登入外圍程序。這表示系統會處理該外圍程式的啟動檔案 (.profile 等),並將目前的工作目錄設定為目標使用者的主目錄。
tux:~ >sudo -i root's password:root:~ #exittux:~ >
sudo 依預設不會傳播環境變數︰
tux >ENVVAR=test env | grep ENVVAR ENVVAR=testtux >ENVVAR=test sudo env | grep ENVVAR root's password: 1tux >
輸出為空即說明在使用 |
使用 env_reset 選項會導致行為出現變更,請參閱表格 2.1 「有用的旗標和選項」。
sudo #
sudo 是一項非常靈活的工具,提供大量組態。
如果您不小心因鎖定而無法使用 sudo,可以使用 su - 和 root 密碼來取得 root 外圍程序,並執行 visudo 來修復錯誤。
sudo 的主要規則組態檔案為 /etc/sudoers。一旦該檔案中存在錯誤,您便有可能無法進入系統,因此強烈建議您使用 visudo 進行編輯。此舉可防止同時變更所開啟的檔案,並會在儲存之前檢查語法錯誤。
您還可以透過設定 EDITOR 環境變數以使用除 vi 以外的編輯器 (無論名稱為何),例如︰
sudo EDITOR=/usr/bin/nano visudo
不過,/etc/sudoers 檔案本身由系統套件所提供,所做的修改可能會在更新時遭到破壞。因此,建議將自訂組態存入 /etc/sudoers.d/ 目錄下的檔案中。該目錄下的所有檔案都會自動納入。若要在該子目錄下建立或編輯檔案,請執行︰
sudo visudo -f /etc/sudoers.d/NAME
或使用其他編輯器 (如 nano)︰
sudo EDITOR=/usr/bin/nano visudo -f /etc/sudoers.d/NAME
/etc/sudoers.d 中忽略的檔案
/etc/sudoers 中的 #includedir 指令 (用於 /etc/sudoers.d) 會忽略以 ~ (波狀符號) 結尾或包含 . (點).
如需 visudo 指令的詳細資訊,請執行 man 8 visudo。
sudoers 組態檔案中有字串和旗標兩種選項。其中,字串可以包含任何值,旗標可以開啟或關閉。sudoers 組態檔案最重要的語法建構為︰
# Everything on a line after a # gets ignored 1 Defaults !insults # Disable the insults flag 2 Defaults env_keep += "DISPLAY HOME" # Add DISPLAY and HOME to env_keep tux ALL = NOPASSWD: /usr/bin/frobnicate, PASSWD: /usr/bin/journalctl 3
| |
移除 | |
|
選項名稱 |
描述 |
範例 |
|---|---|---|
targetpw
|
此旗標控制呼叫使用者是否需要輸入密碼。如果要求輸入目標使用者 (例如 |
Defaults targetpw # Turn targetpw flag ON |
rootpw
|
如果設定了此選項, |
Defaults !rootpw # Turn rootpw flag OFF |
env_reset
|
如果設定了此選項, |
Defaults env_reset # Turn env_reset flag ON |
env_keep
|
當 |
# Set env_keep to contain EDITOR and PROMPT Defaults env_keep = "EDITOR PROMPT" Defaults env_keep += "JRE_HOME" # Add JRE_HOME Defaults env_keep -= "JRE_HOME" # Remove JRE_HOME |
env_delete
|
當 |
# Set env_delete to contain EDITOR and PROMPT Defaults env_delete = "EDITOR PROMPT" Defaults env_delete += "JRE_HOME" # Add JRE_HOME Defaults env_delete -= "JRE_HOME" # Remove JRE_HOME |
Defaults 記號還可用於建立使用者、主機和指令三者之集合的別名。除此之外,還可以將某選項僅套用到一組特定的使用者。
如需 /etc/sudoers 組態檔案的詳細資訊,請諮詢 man 5 sudoers。
sudoers 組態中的規則可能會相當複雜,本節僅介紹基本內容。每個規則後面都跟著基本規劃 ([] 表示可選部份)︰
#Who Where As whom Tag What User_List Host_List = [(User_List)] [NOPASSWD:|PASSWD:] Cmnd_List
User_List
一或多個識別碼 (以 , 分隔)︰使用者名稱、以 %GROUPNAME 格式表示的群組,或是以 #UID 格式表示的使用者 ID。否定運算可以使用 ! 字首。
Host_List
一或多個識別碼 (以 , 分隔)︰完全合格的主機名稱或 IP 位址。否定運算可以使用 ! 字首。ALL 是 Host_List 的一般選項。
NOPASSWD:|PASSWD:
如果使用者在 NOPASSWD: 之後執行的指令與 CMDSPEC 相符,系統不會提示使用者輸入密碼。
PASSWD 為預設值,只有當其與 NOPASSWD 出現在同一行時才需要指定︰
tux ALL = PASSWD: /usr/bin/foo, NOPASSWD: /usr/bin/bar
Cmnd_List
一或多個規範 (以 , 分隔)︰指向可執行程式的路徑,後跟允許的引數或不跟任何內容。
/usr/bin/foo # Anything allowed /usr/bin/foo bar # Only "/usr/bin/foo bar" allowed /usr/bin/foo "" # No arguments allowed
ALL 可以用作 User_List、Host_List 和 Cmnd_List。
允許 tux 在無需輸入密碼的情況下以 root 身分執行所有指令的規則︰
tux ALL = NOPASSWD: ALL
允許 tux 執行 systemctl restart apache2 的規則︰
tux ALL = /usr/bin/systemctl restart apache2
允許 tux 在不帶任何引數的情況下以 admin 身分執行 wall 的規則︰
tux ALL = (admin) /usr/bin/wall ""
下列類型的建構
ALL ALL = ALL
在沒有 Defaults targetpw 的情況下切勿使用,否則任何人都能以 root 身分執行指令。
雖然預設組態對於簡單設定和桌面環境往往已足夠,但自訂組態也非常有用。
root 密碼的情況下使用 sudo #
在具有特殊限制 (「使用者 X 只能以 root 身分執行指令 Y」) 的情況下,這點無法實現。在其他情況下,還是建議進行某類分隔。依慣例,wheel 群組的成員可以以 root 身分執行所有帶有 sudo 的指令。
將自己新增至 wheel 群組
如果您的使用者帳戶尚不是 wheel 群組的成員,可執行 sudo usermod -a -G wheel 使用者名稱,然後登出並再次登入,將帳戶加入其中。執行 groups 使用者名稱驗證變更是否成功。
將使用呼叫使用者的密碼進行驗證的選項設定為預設設定。
使用 visudo 建立檔案 /etc/sudoers.d/userpw (請參閱第 2.2.1 節 「編輯組態檔案」) 並新增︰
Defaults !targetpw
選取新的預設規則。
視您是否希望使用者重新輸入其密碼,在 /etc/sudoers 中取消備註特定的行,並將預設規則設定為備註。
## Uncomment to allow members of group wheel to execute any command # %wheel ALL=(ALL) ALL ## Same thing without a password # %wheel ALL=(ALL) NOPASSWD: ALL
對預設規則設定更多限制
移除 /etc/sudoers 中的 allow-everything 規則或設定為備註︰
ALL ALL=(ALL) ALL # WARNING! Only use this together with 'Defaults targetpw'!
切勿遺忘此步驟,否則任何使用者都能以 root 身分執行任何指令!
測試組態
嘗試以 wheel 成員身分和非成員身分執行 sudo。
tux:~ >groups users wheeltux:~ >sudo id -un tux's password: rootwilber:~ >groups userswilber:~ >sudo id -un wilber is not in the sudoers file. This incident will be reported.
sudo #
使用 sudo 啟動圖形應用程式時,會遇到以下錯誤︰
tux > sudo xterm
xterm: Xt error: Can't open display: %s
xterm: DISPLAY is not setYaST 將選擇 ncurses 介面而非圖形介面。
若要在 sudo 啟動的應用程式中使用 X.Org,需要傳播環境變數 DISPLAY 和 XAUTHORITY。若要對此進行設定,請建立檔案 /etc/sudoers.d/xorg (請參閱第 2.2.1 節 「編輯組態檔案」) 並新增下列一行︰
Defaults env_keep += "DISPLAY XAUTHORITY"
若尚未設定 XAUTHORITY 變數,請依如下方式設定︰
export XAUTHORITY=~/.Xauthority
現在,X.Org 應用程式便可正常執行︰
sudo yast2
使用 sudo --help 可取得有關可用的指令行參數的簡要綜覽。說明和其他重要資訊可參閱 man 頁面 man 8 sudo,組態則記錄在 man 5 sudoers 中。