簡介
您是否曾想過,為什麼您必須輸入 “sudo”,當您嘗試在 Linux 或 Unix 作業系統環境中執行某些指令時?Sudo 實際上是一個縮寫,代表 “super-user do”。當您使用 sudo 指令時,您可以使用另一個使用者的安全權限來執行程式和指令。
預設情況下,sudo 指令允許系統使用者以 超級使用者 的權限來執行指令。全新安裝的 Linux/Unix 作業系統會建立一個具有超級使用者權限的 root 帳戶。在進行 Linux/Unix 系統的初始伺服器設定時,系統管理員會使用 root 帳戶登入,並將系統權限分配給其他系統使用者。這些設定儲存在一個名為 sudoers 的檔案中。具有 root 權限的帳戶可以編輯 sudoers 檔案並修改其他使用者的權限。
在本教學中,我們將討論如何取得 root 權限並對 sudoers 檔案進行編輯。
先決條件
這是一個動手實作的教學,您需要測試這些指令以完整理解本教學。我們在本教學中將使用 Ubuntu 20.04 伺服器,然而,如果您使用的是任何現代 Linux 發行版,例如 Debian 和 CentOS,您也可以照著步驟操作。您可以點選 此連結在 CloudSigma 上設定您自己的 Ubuntu 雲端伺服器.
取得 Root 權限
您可以透過以下討論的三種方式取得 root 權限:
以 root 身分登入
大多數人取得 root 權限最簡單的方法是使用 root 使用者憑證登入系統。如果您正在存取本機電腦,只需提供使用者名稱,系統就會提示您輸入密碼。
另一種可以用來以 root 身分登入的方法是使用 SSH — 這是一種用於登入伺服器並在伺服器上執行任務的命令列工具。它需要您伺服器的使用者名稱和 IP 位址。以 root 身分登入的語法如下,請替換為您伺服器的 IP 位址:
|
1 |
ssh root@your_server_ip_or_domain_name |
當您在終端機中輸入上述指令時,如果您尚未設定 SSH 金鑰,系統會提示您提供密碼;如果您已設定 SSH 金鑰,則會提示您輸入 SSH 金鑰的密碼。提供正確的憑證後,您將成功登入。請參考此 指南,以取得如何在 Ubuntu 中使用 SSH 連線到遠端伺服器的逐步說明.
使用 su 變更為 root
您可以使用 root 以外的任何其他帳戶登入 Linux 系統,這通常是執行非管理任務時的推薦方式。每當您想取得 root 權限時,只需在終端機上輸入 su 即可:
|
1 |
su |
系統會提示您輸入 root 密碼,之後您將進入 root shell 工作階段。在此 shell 工作階段中,您可以執行所有管理任務,而當您想返回一般的 shell 時,只需按下 Ctrl + D。或者,您也可以在終端機上輸入 exit 並按下 Enter 鍵。
使用 sudo 執行具有 root 權限的指令
在本教學開頭稍微介紹過的 sudo 指令,允許您執行單行指令,而不需要 root 權限的 shell。您只需輸入 sudo ,後面加上要執行的指令:
|
1 |
sudo execute_this_command |
例如,要更新您的系統,您可以輸入以下內容:
|
1 |
sudo apt-get update |
系統會提示您輸入密碼。而 su 與 sudo 指令之間的差別在於,su 會要求輸入 root 密碼,而 sudo 則是要求輸入目前使用者的密碼。預設情況下不會向使用者授予 sudo 存取權限,因為這對系統安全有很大的影響。我們將在以下章節中對此進行更多討論。
使用 Visudo 編輯 sudoers 檔案
Sudo 權限是在 sudoers 檔案 中設定的,該檔案位於 /etc/sudoers。這些權限是任何使用者存取 Linux 系統所必需的。任何語法錯誤都會阻止使用者登入系統,從而導致系統損壞。
Visudo 指令會使用特殊的編輯器開啟檔案,該編輯器會在儲存時檢查檔案的語法。因此,請務必僅使用 visudo 指令來開啟檔案,以防止您的伺服器系統變得無法使用。預設情況下,visudo 設定為使用 (vi) 開啟文字編輯器 vim。然而,Ubuntu 已將 visudo 設定為使用 nano 文字編輯器。在 Debian 或 Ubuntu 上,您可以透過輸入以下指令來切換到不同的編輯器:
|
1 |
sudo update-alternatives --config editor |
它會顯示一個編輯器列表,您可以從中選擇預設編輯器,如螢幕截圖所示。選擇您偏好的編輯器對應的號碼:

在 CentOS Linux 發行版上,編輯 /etc/sudoers 並新增以下行:
|
1 2 |
Defaults editor = /usr/bin/vim:/usr/bin/vi:/usr/bin/nano Defaults env_keep += "EDITOR" |
輸入以下指令。請記得替換 your_editor_of_choice 的名稱:
|
1 |
export EDITOR=`which your_editor_of_choice` |
該指令會將該行新增至 ~/.bashrc 檔案中。在終端機中輸入以下內容以套用變更:
|
1 |
. ~/.bashrc |
現在您的 visudo 已設定完成,您可以透過輸入以下指令來開啟位於 /etc/sudoers 的檔案:
|
1 |
sudo visudo |
編輯 Sudoers 檔案
當您執行上一個指令時,該檔案將在您設定的主編輯器中開啟。以下是該檔案的內容:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# # 此檔案必須以 root 身分使用 'visudo' 指令進行編輯。 # # 請考慮在 /etc/sudoers.d/ 中新增本地內容,而不是 # 直接修改此檔案。 # # 有關如何撰寫 sudoers 檔案的詳細資訊,請參閱 man 手冊頁。 # Defaults env_reset Defaults mail_badpass Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin" # 主機別名規格 # 使用者別名規格 # 指令別名規格 # 使用者權限規格 root ALL=(ALL:ALL) ALL # admin 群組的成員可以獲得 root 權限 %admin ALL=(ALL) NOPASSWD:ALL # 允許 sudo 群組的成員執行任何指令 %sudo ALL=(ALL) NOPASSWD:ALL # 有關 "#include" 指令的更多資訊,請參閱 sudoers(5): #includedir /etc/sudoers.d |
註解非常詳細,但我們將在下面討論這些行所代表的含義。
預設行
- Defaults env_reset – 重設終端機環境變數以移除任何使用者變數。因此,它會清除 sudo 工作階段中潛在的有害變數。
- Defaults mail_badpass – 指示系統將 sudo 密碼嘗試失敗的通知郵寄給設定的 mailto 使用者,通常是 root 帳戶。
- Defaults secure_path – 包含檔案系統中的多個路徑,sudo 操作在執行時會尋找這些路徑中的應用程式來使用,以防止使用其他可能對系統造成危險的使用者定義路徑。
使用者權限規格行
|
1 |
root ALL=(ALL:ALL) ALL |
- root ALL=(ALL:ALL) ALL – 第一個欄位指定該規則適用的使用者名稱。在此案例中,它是 root 使用者。
- root ALL=(ALL:ALL) ALL – 第一個 ALL 指定該規則將適用於所有主機。
- root ALL=(ALL:ALL) ALL – 第二個 ALL 指定此規則適用的使用者(即 root)可以以所有使用者的身份執行指令。
- root ALL=(ALL:ALL) ALL – 第三個 ALL 指定此規則適用的使用者(即 root)可以以所有群組的身份執行指令。
- root ALL=(ALL:ALL) ALL – 最後一個 ALL 指定這些規則適用於所有指令。
根據此規則的指示,root 使用者只要提供正確的密碼,就可以使用 sudo 執行任何指令。
群組權限規格行
這些行指定適用於群組的 sudo 權限規則。這些欄位表示與使用者權限行相同的操作,只有微小的差異。它們以 % 開頭以表示群組名稱。
如您所見,admin 群組可以以任何主機上的任何使用者身份執行任何指令。而 sudo 群組具有相同的權限,並額外擁有以任何群組身份執行指令的權限。
包含 /etc/sudoers.d 行
由於行首有 #,#includedir /etc/sudoers.d 行看起來可能像是一行註解。然而,這是一個 include 指令,表示應該載入 /etc/sudoers.d 目錄中的檔案,並將其作為 sudoers 檔案的一部分。此目錄中的檔案遵循與 sudoers 檔案相同的規則。
該目錄中任何不包含點(.)且不以 ~ 結尾的檔案都會被讀取並附加到 sudoers 檔案設定中。該目錄允許應用程式在安裝時,將其所有相關規則放入 /etc/sudoers.d 目錄中的單一專用檔案中,以此來更改 sudo 權限,而無需修改預設的 sudoers 檔案。此外,當您想要檢查或撤銷某個應用程式的權限時,您可以輕鬆地檢查或修改 /etc/sudoers.d 目錄中的檔案,而無需直接修改 /etc/sudoers 檔案。
根據經驗法則,/etc/sudoers.d 目錄中的所有檔案都應該始終使用 visudo 指令進行編輯。以下是語法,請記住在指令中替換您要編輯的檔案名稱:
|
1 |
sudo visudo -f /etc/sudoers.d/file_name_to_edit |
為使用者分配 Sudo 權限
當您授予新使用者一般的 sudo 存取權限時,這意味著您已給予該使用者帳戶對系統的完整管理存取權限。這是系統管理員在建立其他具有 sudo 權限的非 root 使用者時的常見工作。
在像 Ubuntu 20.04 這樣已經擁有通用管理群組的系統中,我們可以透過將使用者新增到該群組來輕鬆為其分配 sudo 權限。如在 /etc/sudoers 檔案中所見,sudo 群組具有完整的管理權限,我們可以透過輸入以下指令將使用者名稱新增到該群組中:
|
1 |
sudo usermod -aG sudo username |
或者,您可以使用 gpasswd 指令來達到相同的目的:
|
1 |
sudo gpasswd -a username sudo |
在 CentOS 上,具有 sudo 權限的預設群組名稱為 wheel,因此您可以使用以下指令來分配權限:
|
1 |
sudo usermod -aG wheel username |
或者,使用 gpasswd 指令,您可以使用以下指令來達到相同的目的:
|
1 |
sudo gpasswd -a username wheel |
在某些情況下,wheel CentOS 上的群組可能會在 /etc/sudoers 檔案中被註解掉。要啟用它,請使用 visudo 打開該檔案,並取消註解包含該群組名稱的那一行。您可以透過刪除行首的 # 來完成此操作:%wheel ALL=(ALL) ALL.
建立自訂規則
憑藉您目前對 sudoers 一般語法的了解,是時候來設定一些規則了。
建立別名
別名允許您透過將項目分組到各種「別名」下來組織您的 sudoers 檔案。我們將在本節中討論三個指令:User_Alias 用於建立使用者/群組別名,Cmnd_Alias 用於建立指令別名,以及Runas_Alias 用於允許其他使用者以另一個使用者的身份執行。
例如,使用 User_Alias,在您的 /etc/sudoers 檔案中,您可以新增以下程式碼片段來建立三個不同的使用者群組。某些使用者可能屬於多個群組:
|
1 2 3 |
User_Alias GROUPONE = adelle, nikita, ellie User_Alias GROUPTWO = nikita, brenden, natalia User_Alias GROUPTHREE = brenden, walter, james |
請注意,所有群組名稱都以大寫字母開頭。在 /etc/sudoers 檔案中新增上述群組別名後,您可以將更新 apt 資料庫的權限分配給 GROUPTWO,方法是在 /etc/sudoers 檔案中新增以下規則:
|
1 |
GROUPTWO ALL = /usr/bin/apt-get update |
請注意,在未指定要執行的使用者/群組的情況下,sudo 指令將始終預設為 root 使用者。
以下是 Cmnd_Alias 的範例,我們在其中建立了一個用於關機和重新啟動系統的指令別名。然後將該規則分配給 GROUPTHREE。在 /etc/sudoers 檔案中新增以下行即可實現此目的:
|
1 2 |
Cmnd_Alias POWER = /sbin/shutdown, /sbin/halt, /sbin/reboot, /sbin/restart GROUPTHREE ALL = POWER |
在上面的程式碼片段中,第一行建立了一個名為 POWER 的指令別名,其中包含關機和重新啟動的指令。第二行允許 GROUPTHREE 的成員執行此指令。
以下是 Runas_Alias 的範例,我們在其中建立了一個別名,允許一組使用者以另一個使用者的身份執行:
|
1 2 |
Runas_Alias WEB = www-data, apache GROUPONE ALL = (WEB) ALL |
在上面的程式碼片段中,第一行建立了一個名為 WEB 的別名,指定該別名將以 apache 使用者或 www-data 使用者的身份執行。第二行將該別名分配給 GROUPONE。現在,第一群組的成員可以以 apache 或 www-data 使用者的身份執行指令。
鎖定規則
在本節中,您將學習控制 sudo 如何回應呼叫的各種方法。某些指令在單一使用者系統上相對無害。在這種情況下,您可以允許使用者以 root 權限執行它們,而無需輸入 root 密碼。例如,您可以建立一條規則,允許 GROUPONE 中的使用者在不輸入密碼的情況下執行 updatedb 指令,方法是在 /etc/sudoers 檔案中新增以下內容:
|
1 |
GROUPONE ALL = NOPASSWD: /usr/bin/updatedb |
標籤 NOPASSWD 意味著不需要密碼。與 NOPASSWD 標籤對應的標籤是 PASSWD,這是預設行為。這意味著必須在提示字元下提供密碼。
標籤適用於規則,除非它被其對應標籤覆蓋,例如:
|
1 |
GROUPTWO ALL = NOPASSWD: /usr/bin/updatedb, PASSWD: /bin/kill |
在此規則中,GROUPTWO 中的使用者可以執行 updatedb 命令而無需輸入密碼。然而,他們在執行 kill 命令之前必須提供密碼。
在某些情況下,您可能希望限制使用者執行某些命令,以防止一些危險的執行。這就是 NOEXEC 標籤發揮作用的地方。某些程式可以從其介面內執行其他命令。此類程式的一個範例是 less。如果您在 less 介面中輸入具有以下語法的命令,它將會執行,從而導致一些非預期的行為。
|
1 |
!name_of_command_to_run |
為了防止此類行為,您可以將以下規則新增至 /etc/sudoers 檔案中,以限制由 username:
|
1 |
username ALL = NOEXEC: /usr/bin/less |
其他資訊
在本節中,我們包含了一些您在操作 sudo 時可能會發現有必要了解的其他資訊、指令和命令。
如果您在設定中使用了 Runas_Alias,指定某個使用者或群組可以作為另一個使用者執行,則您可以透過對使用者使用 -u 旗標以及對群組使用 -g 旗標,來以這些使用者的身分執行命令。語法如下:
|
1 2 |
sudo -u run_as_user command sudo -g run_as_group command |
每個命令都會提示您輸入相關的密碼。為了方便起見,sudo 會將密碼儲存一段時間,這樣您就不必在每次使用 sudo 執行命令時都重複輸入。當您完成 sudo 特權命令的操作後,您可能希望透過輸入以下命令來清除該快取時間:
|
1 |
sudo -k |
如果您有更多需要 sudo 特權執行的任務,並且希望延長密碼請求前的時間,或者希望避免 sudo 命令稍後提示輸入密碼,您可以透過輸入以下命令來更新時間:
|
1 |
sudo -v |
該命令會提示您輸入密碼,並將其快取以供稍後使用 sudo 時使用。
要列出為您的名稱定義的 sudo 特權,您可以輸入以下命令:
|
1 |
sudo -l |
該命令會列出 /etc/sudoers 檔案中設定的所有適用於您使用者名稱的規則。從這些規則中,您可以大致了解您的使用者名稱在系統上可以執行哪些任務。以下是範例螢幕截圖:

在某些情況下,您執行的命令可能會因為忘記在前面加上 sudo 而失敗。在這種情況下,您可能必須重新輸入以 sudo 開頭的命令。為了避免重新輸入命令,您可以利用 bash 的「重複上一個命令」功能。其語法是雙驚嘆號。您可以透過輸入以下內容來執行您在終端機上執行的上一個命令:
|
1 |
sudo !! |
最後,重要的是要了解 sudo 只是將要執行的命令提升為具有 sudo 特權。如需其他資訊,您可以按照 此連結來和您的使用者找點樂子.
結論
在與多個使用者協同工作時,了解如何使用 sudo 命令和 sudoers 檔案至關重要。在本教學中,我們介紹了讀取和修改 sudoers 檔案的基本知識,以及可用於獲取 root 特權的各種方法。
請始終記住,特權分離是使 Linux 系統安全的原因。因此,不應將超級使用者特權授予一般使用者。僅分配特定使用者在系統中執行其特定任務所絕對必需的特權,而不是所有特權。
祝您使用愉快!
留言
目前尚無留言。成為第一個留言的人吧。