跳至內容跳至頁面導覽:上一頁 [access key p]/下一頁 [access key n]
documentation.suse.com / SUSE Linux Enterprise Desktop 文件 / 管理指南 / 一般任務 / sudo 基本知識
適用範圍 SUSE Linux Enterprise Desktop 15 SP6

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 -un1
tux
> sudo id -un
root's password:2
root
> id -un
tux3
> sudo id -un
4
root

1

id -un 指令會列印目前使用者的登入名稱。

2

輸入期間不會顯示密碼 (無論是純文字還是遮罩字元均不顯示)。

3

只有以 sudo 開頭的指令才會以提升的特權執行。

4

提升的權限會持續一段時間,因此您不必再次提供 root 密碼。

提示
提示:I/O 重新導向

使用 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

在上面的範例中,只有 echocat 指令才以提升的權限執行。重新導向將由使用者的外圍程序以使用者特權執行。若要以提升的特權執行重新導向,請如第 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 # exit
tux:~ > 
sudo -i (<command>)

-s 類似,但會做為登入外圍程序啟動外圍程序。這表示系統會處理該外圍程序的啟動檔案 (.profile 等),並會將目前的工作目錄設定為目標使用者的主目錄。

tux:~ > sudo -i
root's password:
root:~ # exit
tux:~ > 
提示
提示:環境變數

sudo 依預設不會傳播環境變數。使用 env_reset 選項會導致行為發生變化,請參閱有用的旗標和選項

2.2 設定 sudo

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 指令。

範例 2.1︰ 建立使用者特定的組態檔案
  1. 以系統管理員 (root) 身分啟動 visudo,建立一個用於儲存新使用者特定指令的自訂組態檔案。使用帶編號的描述性名稱:

      # visudo -f /etc/sudoers.d/02_usermanagement
  2. 建立一則規則,以允許 tux 在套用此 sudo 組態的整個環境中執行 /usr/sbin/useradd 二進位檔案:

      tux1 ALL2 = /usr/sbin/useradd3

    1

    指定使用者或群組。依名稱或 #UID 列出使用者,並依 %GROUPNAME 列出群組。以逗號分隔多個號碼。若要否定項目,請使用 !

    2

    指定一或多個主機 (以逗號分隔)。使用完全合格的主機名稱或 IP 位址。新增 ALL 以在所有主機上全域強制執行此設定。使用 ! 進行否定。

    3

    指定一或多個可執行檔 (以逗號分隔)。指定可執行檔時,請務必注意以下規則:

    /usr/sbin/useradd

    在不新增任何其他選項的情況下,此動作允許執行每個可能的 useradd 指令。

    /usr/sbin/useradd -c

    如果您明確指定某個選項,則該選項是唯一允許的選項。您在上文中指定的使用者無法使用其他任何選項。

    /usr/sbin/useradd ""

    這樣,使用者將只能呼叫 useradd,完全不能使用任何選項。

    在上面的範例中,您可能希望允許使用所有選項和子指令,或者基於安全考量將允許的選項和子指令限制為少數幾個,但在這種情況下,完全禁止使用者指定任何選項是毫無意義的。

  3. 若要讓使用者使用自己的密碼而非 root 密碼,請新增以下一行內容:

    Defaults:tux !targetpw

    如果啟用,此旗標要求使用者輸入目標使用者 (即 root) 的密碼。此旗標在任何 SUSE Linux Enterprise Desktop 系統上預設都處於啟用狀態。使用 ! 可以對其否定,以要求使用者只輸入自己的密碼而非 root 密碼。

  4. 儲存組態,離開編輯器,並開啟另一個外圍程序來測試 sudo 是否遵循您的新組態。

2.2.3 透過對項目進行分組來建立自訂組態

修改範例 2.1 「建立使用者特定的組態檔案」中的組態,使一組指定使用者無需輸入 root 密碼即可執行 useradd 指令。另外,將 usermoduserdel 新增至此群組可用的指令清單。

範例 2.2︰ 透過對項目進行分組來建立自訂組態
  1. 若要修改範例組態,請以系統管理員身分使用 visudo 將其開啟:

    # visudo /etc/sudoers.d/02_usermanagement
  2. 使用以逗號分隔的清單將更多使用者新增至規則:

    tux, wilber ALL = /usr/sbin/useradd
  3. 若要允許列出的使用者執行一系列指令,請以逗號分隔的清單指定這些指令:

    tux, wilber ALL = /usr/sbin/useradd, /usr/sbin/usermod, /usr/sbin/userdel
  4. 若要讓列出的使用者使用自己的密碼而非 root 密碼,請新增以下一行內容:

    Defaults:tux, wilber !targetpw

    如果啟用,此旗標要求列出的使用者輸入目標使用者 (即 root) 的密碼。此旗標在任何 SUSE Linux Enterprise Desktop 系統上預設都處於啟用狀態。使用 ! 可以對其否定,以要求列出的使用者只輸入自己的密碼而非 root 密碼。

  5. 儲存組態,離開編輯器,並開啟另一個外圍程序來測試 sudo 是否遵循您的新組態。

2.2.4 透過套用別名簡化組態

使用別名可以進一步簡化範例 2.2 「透過對項目進行分組來建立自訂組態」中的自訂組態。對項目進行分組在一定程度上有所幫助,但若要使 sudo 組態保持整潔精簡,使用使用者、指令和主機的全域別名是最有效的方法。

使用別名和群組 (而非清單) 是處理設定變更的更好方法。如果某個使用者離職,只需將其從別名聲明檔案內的全域 User_Alias 聲明中移除即可,而無需搜尋所有單獨的自訂組態檔案。該程序同樣適用於任何其他類型的別名 (Host_AliasCmnd_AliasRunas_Alias)。

範例 2.3︰ 透過套用別名簡化組態
  1. 建立一個新檔案來儲存全域別名定義:

    # visudo /etc/sudoers.d/01_aliases
  2. 新增以下一行內容以建立 TEAMLEADERS 別名:

    User_Alias    TEAMLEADERS = tux, wilber
  3. 新增以下一行內容以建立 USERMANAGEMENT 別名:

    Cmnd_Alias    USERMANAGEMENT = /usr/sbin/useradd, /usr/sbin/usermod, /usr/sbin/userdel
  4. 儲存變更並結束 visudo

  5. 以系統管理員身分啟動 visudo,以編輯範例組態檔案:

    # visudo -f /etc/sudoers.d/02_usermanagement
  6. 刪除先前的規則,並用以下規則 (使用了您剛才定義的別名) 取代該規則:

    TEAMLEADERS ALL = USERMANAGEMENT
  7. 若要讓 User_Alias 定義的所有使用者都使用自己的密碼而非 root 密碼,請新增以下一行內容:

    Defaults:TEAMLEADERS !targetpw
  8. 儲存組態,離開編輯器,並開啟另一個外圍程序來測試 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

1

存在兩個例外:#include#includedir 是一般指令。

2

移除 ! 字元會將所需旗標設定為 ON。

3

請參閱第 2.2.6 節 「基本 sudoers 規則」

有用的旗標和選項
targetpw

此旗標控制呼叫使用者是否需要輸入密碼。如果要求輸入目標使用者 (例如 root) 的密碼則為開啟,如果要求輸入其自己的密碼則為關閉。

Defaults targetpw # Turn targetpw flag ON
rootpw

如果設定,sudo 將提示輸入 root 密碼。預設值為 OFF。

Defaults !rootpw # Turn rootpw flag OFF
env_reset

如果設定,sudo 會建構一個具有 TERMPATHHOMEMAILSHELLLOGNAMEUSERUSERNAMESUDO_* 的極簡環境。此外,會從呼叫環境輸入 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
sudoers 規則語法
User_List

一或多個 (以逗號分隔) 識別碼:使用者名稱、%GROUPNAME 格式的群組,或 #UID 格式的使用者 ID。可以使用 ! 字首指定否定。

Host_List

一或多個 (用逗號分隔) 識別碼:完全合格的主機名稱或 IP 位址。可以使用 ! 字首指定否定。Host_List 的常用選項為 ALL

NOPASSWD:|PASSWD:

如果使用者在 NOPASSWD: 之後執行的指令與 Cmd_List 相符,系統不會提示使用者輸入密碼。

PASSWD 為預設選項。僅當 PASSWDNOPASSWD 位於同一行時,才需要指定此選項:

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_ListHost_ListCmnd_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 身分執行指令。

重要
重要:Winbind 和 sudo

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 及其組態的詳細資訊。