2 sudo
基本知識 #
執行某些指令需要 root 特權。但是,出於安全及避免出錯考量,我們不建議您以 root
身分登入。更安全的做法是先以一般使用者身分登入,再使用 sudo
以提升的特權來執行指令。
在 SUSE Linux Enterprise Server 上,sudo
設定為與 su
的運作方式類似。但是,sudo
提供了一種靈活機制,可讓使用者使用其他任何使用者的特權執行指令。此舉可以將具有特定權限的角色指定給某些使用者和群組。例如,可以允許 users
群組的成員以 wilber
使用者的特權執行指令。您可以透過禁止任何指令選項,來進一步限制對指令的存取。su 始終要求必須提供 root
密碼才能使用 PAM 進行驗證,但 sudo
可以設定為使用您自己的身分證明進行驗證。這表示使用者無需共用 root
密碼,因而提高了安全性。
2.1 sudo
基本用法 #
以下章節將會介紹 sudo
的基本用法。
2.1.1 執行單個指令 #
做為一般使用者,您可以在指令前加上 sudo
來以 root
身分執行任何指令。系統會提示您提供 root 密碼。如果驗證成功,便會以 root
身分執行指令:
tux >
id -un
1 tuxtux >
sudo
id -un
root's password:2 roottux >
id -un
tux3tux >
sudo
id -un
4 root
| |
輸入期間不會顯示密碼 (無論是純文字還是遮罩字元均不顯示)。 | |
只有以 | |
提升的權限會持續一段時間,因此您不必再次提供 |
使用 sudo
時,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
2.1.2 啟動外圍程序 #
使用 sudo
來以提升的特權執行指令的做法並不總是可行。雖然可以使用 sudo bash
指令,但還是建議您使用以下其中一種內建機制來啟動外圍程序:
sudo -s (<指令>)
啟動由
SHELL
環境變數所指定的外圍程序或目標使用者的預設外圍程序。如果指定了某個指令,該指令將被傳送到外圍程序(使用-c
選項)。否則,外圍程序將以互動式模式執行。tux:~ >
sudo -s root's password:root:/home/tux #
exittux:~ >
sudo -i (<指令>)
與
-s
類似,但會做為登入外圍程序啟動外圍程序。這表示系統會處理該外圍程式的啟動檔案 (.profile
等),並將目前的工作目錄設定為目標使用者的主目錄。tux:~ >
sudo -i root's password:root:~ #
exittux:~ >
sudo
依預設不會傳播環境變數。使用 env_reset
選項會導致行為發生變化,請參閱有用的旗標和選項。
2.2 設定 sudo
#
sudo
提供了各種可設定的選項。
如果您不小心將自己鎖定在 sudo
之外,則可以使用 su -
和 root
密碼來啟動 root 外圍程序。若要修復該錯誤,請執行 visudo
。
2.2.1 編輯組態檔案 #
sudo
的主要規則組態檔案為 /etc/sudoers
。如果該檔案的格式錯誤,您可能便無法進入系統,因此強烈建議您使用 visudo
來進行編輯。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
指令會忽略以 ~
(波狀符號) 字元結尾或包含 .
(點) 字元的檔案。
如需 visudo
指令的詳細資訊,請執行 man 8 visudo
。
2.2.2 sudoers 組態的基本語法 #
sudoers 組態檔案包含兩種類型的選項:字串和旗標。其中,字串可以包含任何值,旗標可以開啟或關閉。sudoers 組態檔案最重要的語法建構為:
# Everything on a line after # is 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
此旗標控制呼叫使用者是否需要輸入密碼。如果要求輸入目標使用者 (例如
root
) 的密碼則為開啟,如果要求輸入其自己的密碼則為關閉。Defaults targetpw # Turn targetpw flag ON
-
rootpw
如果設定,
sudo
將提示輸入root
密碼。預設值為 OFF。Defaults !rootpw # Turn rootpw flag OFF
-
env_reset
如果設定,
sudo
會建構一個包含TERM
、PATH
、HOME
、MAIL
、SHELL
、LOGNAME
、USER
、USERNAME
和SUDO_*
的精簡環境。此外,會從呼叫環境輸入env_keep
中列出的變數。預設為開啟。Defaults env_reset # Turn env_reset flag ON
-
env_keep
當
env_reset
旗標為開啟時要保留的一系列環境變數。# 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
當
env_reset
旗標為關閉時要移除的一系列環境變數。# 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
。
2.2.3 基本 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 位址。可以使用
!
字首來否定。Host_List
的常用選項為ALL
。NOPASSWD:|PASSWD:
如果使用者在
NOPASSWD:
之後執行的指令與Cmd_List
相符,系統不會提示使用者輸入密碼。PASSWD
是預設選項。僅當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 ""
不要使用不帶 Defaults targetpw
的 ALL ALL = ALL
等規則。否則,任何人都能夠以 root
身分執行指令。
2.3 sudo
使用案例 #
雖然預設組態可適用於標準使用情境,但您仍可依據特定需求自訂預設組態。
2.3.1 在無需提供 root
密碼的情況下使用 sudo
#
依設計,wheel
群組的成員可以用 root 身分執行所有帶有 sudo
的指令。下面的程序介紹如何將使用者帳戶新增至 wheel
群組。
將您的使用者帳戶新增至
wheel
群組。如果您的使用者帳戶還不是
wheel
群組的成員,請使用sudo usermod -a -G wheel USERNAME
指令新增。登出然後重新登入即可啟用變更。執行groups USERNAME
指令以驗證變更是否成功。使用使用者帳戶的普通密碼進行驗證。
使用
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'!
警告:sudoers 中可造成嚴重後果的規則請勿跳過此步驟。否則任何使用者都能以
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.
2.3.2 對 X.Org 應用程式使用 sudo
#
使用 sudo
啟動圖形應用程式通常會導致以下錯誤:
tux >
sudo
xterm xterm: Xt error: Can't open display: %s xterm: DISPLAY is not set
一種簡單的解決方式是使用 xhost 來暫時允許 root 使用者存取本地使用者的 X 工作階段。可使用以下指令完成此動作:
xhost si:localuser:root
以下指令可移除授予的存取權:
xhost -si:localuser:root
以 root 特權執行圖形應用程式存在安全隱患。建議僅在例外的情況下,才啟用對圖形應用程式的 root 存取權。另外,建議在關閉圖形應用程式後,立即撤銷授予的 root 存取權。
2.4 更多資訊 #
sudo --help
指令提供可用指令行選項的簡要綜覽,而 man sudoers
指令則會提供有關 sudoers 及其組態設定的詳細資訊。