2 sudo
基本知識 #
執行某些指令需要 root 特權。但是,基於安全考量以及為了避免出錯,我們不建議以 root
身分登入。更安全的做法是先以一般使用者身分登入,再使用 sudo
以提升的權限來執行指令。
在 SUSE Linux Enterprise Desktop 上,sudo
設定為與 su
的運作方式類似。但是,sudo
提供了一種靈活機制,可讓使用者使用其他任何使用者的特權執行指令。此舉可以將具有特定權限的角色指定給某些使用者和群組。例如,可以允許 users
群組的成員以 wilber
使用者的特權執行指令。您可以透過禁止任何指令選項,來進一步限制對指令的存取。su 始終要求必須提供 root
密碼才能使用 PAM 進行驗證,但 sudo
可以設定為使用您自己的身分證明進行驗證。此可提升安全性,因為使用者無需共用 root
密碼。
2.1 sudo
基本用法 #
以下章節將會介紹 sudo
的基本用法。
2.1.1 執行單個指令 #
做為一般使用者,您可以在指令前加上 sudo
來以 root
身分執行任何指令。系統會提示您提供 root 密碼。如果驗證成功,便會以 root
身分執行指令:
>
id -un
1 tux>
sudo
id -un
root's password:2 root>
id -un
tux3>
sudo
id -un
4 root
| |
輸入期間不會顯示密碼 (無論是純文字還是遮罩字元均不顯示)。 | |
只有以 | |
提升的權限會持續一段時間,因此您不必再次提供 |
使用 sudo
時,I/O 重新導向不起作用:
>
sudo
echo s > /proc/sysrq-trigger bash: /proc/sysrq-trigger: Permission denied>
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 (<command>)
啟動由
SHELL
環境變數所指定的外圍程序或目標使用者的預設外圍程序。如果指定了某個指令,該指令會傳遞到外圍程序 (使用-c
選項)。否則,外圍程序將以互動式模式執行。tux:~ >
sudo -s root's password:root:/home/tux #
exittux:~ >
sudo -i (<command>)
與
-s
類似,但會做為登入外圍程序啟動外圍程序。這表示系統會處理該外圍程序的啟動檔案 (.profile
等),並會將目前的工作目錄設定為目標使用者的主目錄。tux:~ >
sudo -i root's password:root:~ #
exittux:~ >
sudo
依預設不會傳播環境變數。使用 env_reset
選項會導致行為發生變化,請參閱有用的旗標和選項。
2.2 設定 sudo
#
sudo
提供了各種可設定的選項。
如果您不小心將自己鎖定在 sudo
之外,可以使用 su
-
和 root
密碼來啟動 root 外圍程序。若要修復該錯誤,請執行 visudo
。
下面所述的範例規則僅用於演示目的。請使用這些範例來瞭解 sudo
組態檔案的一般語法。不要在現實設定中使用它們,因為它們並未體現這些環境的複雜性。
2.2.1 sudo
組態最佳實務 #
在開始之前,請注意以下有關維護 sudo
組態的幾條基本規則:
- 一律使用
visudo
來編輯sudo
組態檔案 應使用
visudo
指令對sudo
組態進行任何變更。visudo
是一個量身打造的工具,可用於編輯sudo
組態檔案和執行基本語法檢查,以確定組態保持完整且能正常運作。錯誤的sudo
組態可能會導致將使用者鎖定在自己的系統之外。- 一律在
/etc/sudoers.d/
下建立自訂組態 自訂組態必須位於
/etc/sudoers.d/
下,透過sudo
才能提取它們。自訂組態檔案中的設定優先於/etc/sudoers
包含的預設組態中的設定。- 永遠注意系統讀取組態的順序
為確保系統依正確的順序讀取自訂組態,請在組態前加上數字。使用前置零來確定檔案的讀取順序。例如,系統會在
10_myotherconfig
之前剖析01_myfirstconfig
。如果某個檔案中設定了一則指令,而系統是在包含衝突資訊的另一個檔案之前讀取該檔案,則會套用最後讀取的指令。- 永遠使用描述性檔案名稱
使用能夠提示組態檔案作用的檔案名稱。這可以協助您追蹤
sudo
設定的預期功能。
2.2.2 建立使用者特定的組態檔案 #
建立一個 sudo
組態檔案,以允許一般使用者 (tux
) 使用自己的密碼 (而非 root
密碼) 執行 useradd
指令。
以系統管理員 (
root
) 身分啟動visudo
,建立一個用於儲存新使用者特定指令的自訂組態檔案。使用帶編號的描述性名稱:#
visudo -f /etc/sudoers.d/02_usermanagement
建立一則規則,以允許
tux
在套用此sudo
組態的整個環境中執行/usr/sbin/useradd
二進位檔案:tux1 ALL2 = /usr/sbin/useradd3
指定使用者或群組。依名稱或
#UID
列出使用者,並依%GROUPNAME
列出群組。以逗號分隔多個號碼。若要否定項目,請使用!
。指定一或多個主機 (以逗號分隔)。使用完全合格的主機名稱或 IP 位址。新增
ALL
以在所有主機上全域強制執行此設定。使用!
進行否定。指定一或多個可執行檔 (以逗號分隔)。指定可執行檔時,請務必注意以下規則:
/usr/sbin/useradd
在不新增任何其他選項的情況下,此動作允許執行每個可能的
useradd
指令。/usr/sbin/useradd -c
如果您明確指定某個選項,則該選項是唯一允許的選項。您在上文中指定的使用者無法使用其他任何選項。
/usr/sbin/useradd ""
這樣,使用者將只能呼叫
useradd
,完全不能使用任何選項。
在上面的範例中,您可能希望允許使用所有選項和子指令,或者基於安全考量將允許的選項和子指令限制為少數幾個,但在這種情況下,完全禁止使用者指定任何選項是毫無意義的。
若要讓使用者使用自己的密碼而非
root
密碼,請新增以下一行內容:Defaults:tux !targetpw
如果啟用,此旗標要求使用者輸入目標使用者 (即
root
) 的密碼。此旗標在任何 SUSE Linux Enterprise Desktop 系統上預設都處於啟用狀態。使用!
可以對其否定,以要求使用者只輸入自己的密碼而非root
密碼。儲存組態,離開編輯器,並開啟另一個外圍程序來測試
sudo
是否遵循您的新組態。
2.2.3 透過對項目進行分組來建立自訂組態 #
修改範例 2.1 「建立使用者特定的組態檔案」中的組態,使一組指定使用者無需輸入 root
密碼即可執行 useradd
指令。另外,將 usermod
和 userdel
新增至此群組可用的指令清單。
若要修改範例組態,請以系統管理員身分使用
visudo
將其開啟:#
visudo /etc/sudoers.d/02_usermanagement
使用以逗號分隔的清單將更多使用者新增至規則:
tux, wilber ALL = /usr/sbin/useradd
若要允許列出的使用者執行一系列指令,請以逗號分隔的清單指定這些指令:
tux, wilber ALL = /usr/sbin/useradd, /usr/sbin/usermod, /usr/sbin/userdel
若要讓列出的使用者使用自己的密碼而非
root
密碼,請新增以下一行內容:Defaults:tux, wilber !targetpw
如果啟用,此旗標要求列出的使用者輸入目標使用者 (即
root
) 的密碼。此旗標在任何 SUSE Linux Enterprise Desktop 系統上預設都處於啟用狀態。使用!
可以對其否定,以要求列出的使用者只輸入自己的密碼而非root
密碼。儲存組態,離開編輯器,並開啟另一個外圍程序來測試
sudo
是否遵循您的新組態。
2.2.4 透過套用別名簡化組態 #
使用別名可以進一步簡化範例 2.2 「透過對項目進行分組來建立自訂組態」中的自訂組態。對項目進行分組在一定程度上有所幫助,但若要使 sudo
組態保持整潔精簡,使用使用者、指令和主機的全域別名是最有效的方法。
使用別名和群組 (而非清單) 是處理設定變更的更好方法。如果某個使用者離職,只需將其從別名聲明檔案內的全域 User_Alias
聲明中移除即可,而無需搜尋所有單獨的自訂組態檔案。該程序同樣適用於任何其他類型的別名 (Host_Alias
、Cmnd_Alias
和 Runas_Alias
)。
建立一個新檔案來儲存全域別名定義:
#
visudo /etc/sudoers.d/01_aliases
新增以下一行內容以建立
TEAMLEADERS
別名:User_Alias TEAMLEADERS = tux, wilber
新增以下一行內容以建立
USERMANAGEMENT
別名:Cmnd_Alias USERMANAGEMENT = /usr/sbin/useradd, /usr/sbin/usermod, /usr/sbin/userdel
儲存變更並結束
visudo
。以系統管理員身分啟動
visudo
,以編輯範例組態檔案:#
visudo -f /etc/sudoers.d/02_usermanagement
刪除先前的規則,並用以下規則 (使用了您剛才定義的別名) 取代該規則:
TEAMLEADERS ALL = USERMANAGEMENT
若要讓
User_Alias
定義的所有使用者都使用自己的密碼而非root
密碼,請新增以下一行內容:Defaults:TEAMLEADERS !targetpw
儲存組態,離開編輯器,並開啟另一個外圍程序來測試
sudo
是否遵循您的新組態。
2.2.5 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
記號為使用者、主機和指令集合建立別名。除此之外,還可以將某選項僅套用到一組特定的使用者。
如需 sudoers 組態檔案的詳細資訊,請參閱 man 5
sudoers
。
2.2.6 基本 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 ""
使用 ALL ALL =
ALL
之類的規則時切勿不帶 Defaults targetpw
。否則,任何人都能夠以 root
身分執行指令。
在 sudoers
檔案中指定群組名稱時,請務必使用 NetBIOS 網域名稱而不是領域,例如:
%DOMAIN\\GROUP_NAME ALL = (ALL) ALL
請注意,使用 winbindd 時,其格式還取決於 smb.conf
檔案中的 winbind separator
選項。預設值為 \
。例如,如果將其變更為 +
,則 sudoers
檔案中的帳戶格式必須為 DOMAIN+GROUP_NAME
。
2.3 對 X.Org 應用程式使用 sudo
#
使用 sudo
啟動圖形應用程式通常會導致以下錯誤:
>
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
及其組態的詳細資訊。