← Back to blog

設定 Linux Sudoers 檔案

Category
設定 Linux Sudoers 檔案

簡介

您是否曾想過,為什麼您必須輸入 “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 位址:

當您在終端機中輸入上述指令時,如果您尚未設定 SSH 金鑰,系統會提示您提供密碼;如果您已設定 SSH 金鑰,則會提示您輸入 SSH 金鑰的密碼。提供正確的憑證後,您將成功登入。請參考此 指南,以取得如何在 Ubuntu 中使用 SSH 連線到遠端伺服器的逐步說明.

使用 su 變更為 root

您可以使用 root 以外的任何其他帳戶登入 Linux 系統,這通常是執行非管理任務時的推薦方式。每當您想取得 root 權限時,只需在終端機上輸入 su 即可:

系統會提示您輸入 root 密碼,之後您將進入 root shell 工作階段。在此 shell 工作階段中,您可以執行所有管理任務,而當您想返回一般的 shell 時,只需按下 Ctrl + D。或者,您也可以在終端機上輸入 exit 並按下 Enter 鍵。

使用 sudo 執行具有 root 權限的指令

在本教學開頭稍微介紹過的 sudo 指令,允許您執行單行指令,而不需要 root 權限的 shell。您只需輸入 sudo ,後面加上要執行的指令:

例如,要更新您的系統,您可以輸入以下內容:

系統會提示您輸入密碼。而 su 與 sudo 指令之間的差別在於,su 會要求輸入 root 密碼,而 sudo 則是要求輸入目前使用者的密碼。預設情況下不會向使用者授予 sudo 存取權限,因為這對系統安全有很大的影響。我們將在以下章節中對此進行更多討論。

使用 Visudo 編輯 sudoers 檔案

Sudo 權限是在 sudoers 檔案 中設定的,該檔案位於 /etc/sudoers。這些權限是任何使用者存取 Linux 系統所必需的。任何語法錯誤都會阻止使用者登入系統,從而導致系統損壞。

Visudo 指令會使用特殊的編輯器開啟檔案,該編輯器會在儲存時檢查檔案的語法。因此,請務必僅使用 visudo 指令來開啟檔案,以防止您的伺服器系統變得無法使用。預設情況下,visudo 設定為使用 (vi) 開啟文字編輯器 vim。然而,Ubuntu 已將 visudo 設定為使用 nano 文字編輯器。在 Debian 或 Ubuntu 上,您可以透過輸入以下指令來切換到不同的編輯器:

它會顯示一個編輯器列表,您可以從中選擇預設編輯器,如螢幕截圖所示。選擇您偏好的編輯器對應的號碼:

displays a list of editors

在 CentOS Linux 發行版上,編輯 /etc/sudoers 並新增以下行:

輸入以下指令。請記得替換 your_editor_of_choice 的名稱:

該指令會將該行新增至 ~/.bashrc 檔案中。在終端機中輸入以下內容以套用變更:

現在您的 visudo 已設定完成,您可以透過輸入以下指令來開啟位於 /etc/sudoers 的檔案:

編輯 Sudoers 檔案

當您執行上一個指令時,該檔案將在您設定的主編輯器中開啟。以下是該檔案的內容:

註解非常詳細,但我們將在下面討論這些行所代表的含義。

預設行
  • Defaults env_reset – 重設終端機環境變數以移除任何使用者變數。因此,它會清除 sudo 工作階段中潛在的有害變數。
  • Defaults mail_badpass – 指示系統將 sudo 密碼嘗試失敗的通知郵寄給設定的 mailto 使用者,通常是 root 帳戶。
  • Defaults secure_path – 包含檔案系統中的多個路徑,sudo 操作在執行時會尋找這些路徑中的應用程式來使用,以防止使用其他可能對系統造成危險的使用者定義路徑。
使用者權限規格行
此行與其他行不同,它指定了 root 使用者的權限。以下是該行中每個標記所代表的意義:

  1. root ALL=(ALL:ALL) ALL – 第一個欄位指定該規則適用的使用者名稱。在此案例中,它是 root 使用者。
  2. root ALL=(ALL:ALL) ALL – 第一個 ALL 指定該規則將適用於所有主機。
  3. root ALL=(ALL:ALL) ALL – 第二個 ALL 指定此規則適用的使用者(即 root)可以以所有使用者的身份執行指令。
  4. root ALL=(ALL:ALL) ALL – 第三個 ALL 指定此規則適用的使用者(即 root)可以以所有群組的身份執行指令。
  5. 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 指令進行編輯。以下是語法,請記住在指令中替換您要編輯的檔案名稱:

為使用者分配 Sudo 權限

當您授予新使用者一般的 sudo 存取權限時,這意味著您已給予該使用者帳戶對系統的完整管理存取權限。這是系統管理員在建立其他具有 sudo 權限的非 root 使用者時的常見工作。

在像 Ubuntu 20.04 這樣已經擁有通用管理群組的系統中,我們可以透過將使用者新增到該群組來輕鬆為其分配 sudo 權限。如在 /etc/sudoers 檔案中所見,sudo 群組具有完整的管理權限,我們可以透過輸入以下指令將使用者名稱新增到該群組中:

或者,您可以使用 gpasswd 指令來達到相同的目的:

在 CentOS 上,具有 sudo 權限的預設群組名稱為 wheel,因此您可以使用以下指令來分配權限:

或者,使用 gpasswd 指令,您可以使用以下指令來達到相同的目的:

在某些情況下,wheel CentOS 上的群組可能會在 /etc/sudoers 檔案中被註解掉。要啟用它,請使用 visudo 打開該檔案,並取消註解包含該群組名稱的那一行。您可以透過刪除行首的 # 來完成此操作:%wheel ALL=(ALL) ALL.

建立自訂規則

憑藉您目前對 sudoers 一般語法的了解,是時候來設定一些規則了。

建立別名

別名允許您透過將項目分組到各種「別名」下來組織您的 sudoers 檔案。我們將在本節中討論三個指令:User_Alias 用於建立使用者/群組別名,Cmnd_Alias 用於建立指令別名,以及Runas_Alias 用於允許其他使用者以另一個使用者的身份執行。

例如,使用 User_Alias,在您的 /etc/sudoers 檔案中,您可以新增以下程式碼片段來建立三個不同的使用者群組。某些使用者可能屬於多個群組:

請注意,所有群組名稱都以大寫字母開頭。在 /etc/sudoers 檔案中新增上述群組別名後,您可以將更新 apt 資料庫的權限分配給 GROUPTWO,方法是在 /etc/sudoers 檔案中新增以下規則:

請注意,在未指定要執行的使用者/群組的情況下,sudo 指令將始終預設為 root 使用者。

以下是 Cmnd_Alias 的範例,我們在其中建立了一個用於關機和重新啟動系統的指令別名。然後將該規則分配給 GROUPTHREE。在 /etc/sudoers 檔案中新增以下行即可實現此目的:

在上面的程式碼片段中,第一行建立了一個名為 POWER 的指令別名,其中包含關機和重新啟動的指令。第二行允許 GROUPTHREE 的成員執行此指令。

以下是 Runas_Alias 的範例,我們在其中建立了一個別名,允許一組使用者以另一個使用者的身份執行:

在上面的程式碼片段中,第一行建立了一個名為 WEB 的別名,指定該別名將以 apache 使用者或 www-data 使用者的身份執行。第二行將該別名分配給 GROUPONE。現在,第一群組的成員可以以 apache 或 www-data 使用者的身份執行指令。

鎖定規則

在本節中,您將學習控制 sudo 如何回應呼叫的各種方法。某些指令在單一使用者系統上相對無害。在這種情況下,您可以允許使用者以 root 權限執行它們,而無需輸入 root 密碼。例如,您可以建立一條規則,允許 GROUPONE 中的使用者在不輸入密碼的情況下執行 updatedb 指令,方法是在 /etc/sudoers 檔案中新增以下內容:

標籤 NOPASSWD 意味著不需要密碼。與 NOPASSWD 標籤對應的標籤是 PASSWD,這是預設行為。這意味著必須在提示字元下提供密碼。

標籤適用於規則,除非它被其對應標籤覆蓋,例如:

在此規則中,GROUPTWO 中的使用者可以執行 updatedb 命令而無需輸入密碼。然而,他們在執行 kill 命令之前必須提供密碼。

在某些情況下,您可能希望限制使用者執行某些命令,以防止一些危險的執行。這就是 NOEXEC 標籤發揮作用的地方。某些程式可以從其介面內執行其他命令。此類程式的一個範例是 less。如果您在 less 介面中輸入具有以下語法的命令,它將會執行,從而導致一些非預期的行為。

為了防止此類行為,您可以將以下規則新增至 /etc/sudoers 檔案中,以限制由 username:

其他資訊

在本節中,我們包含了一些您在操作 sudo 時可能會發現有必要了解的其他資訊、指令和命令。

如果您在設定中使用了 Runas_Alias,指定某個使用者或群組可以作為另一個使用者執行,則您可以透過對使用者使用 -u 旗標以及對群組使用 -g 旗標,來以這些使用者的身分執行命令。語法如下:

每個命令都會提示您輸入相關的密碼。為了方便起見,sudo 會將密碼儲存一段時間,這樣您就不必在每次使用 sudo 執行命令時都重複輸入。當您完成 sudo 特權命令的操作後,您可能希望透過輸入以下命令來清除該快取時間:

如果您有更多需要 sudo 特權執行的任務,並且希望延長密碼請求前的時間,或者希望避免 sudo 命令稍後提示輸入密碼,您可以透過輸入以下命令來更新時間:

該命令會提示您輸入密碼,並將其快取以供稍後使用 sudo 時使用。

要列出為您的名稱定義的 sudo 特權,您可以輸入以下命令:

該命令會列出 /etc/sudoers 檔案中設定的所有適用於您使用者名稱的規則。從這些規則中,您可以大致了解您的使用者名稱在系統上可以執行哪些任務。以下是範例螢幕截圖:

screenshot

在某些情況下,您執行的命令可能會因為忘記在前面加上 sudo 而失敗。在這種情況下,您可能必須重新輸入以 sudo 開頭的命令。為了避免重新輸入命令,您可以利用 bash 的「重複上一個命令」功能。其語法是雙驚嘆號。您可以透過輸入以下內容來執行您在終端機上執行的上一個命令:

最後,重要的是要了解 sudo 只是將要執行的命令提升為具有 sudo 特權。如需其他資訊,您可以按照 此連結來和您的使用者找點樂子.

結論

在與多個使用者協同工作時,了解如何使用 sudo 命令和 sudoers 檔案至關重要。在本教學中,我們介紹了讀取和修改 sudoers 檔案的基本知識,以及可用於獲取 root 特權的各種方法。

請始終記住,特權分離是使 Linux 系統安全的原因。因此,不應將超級使用者特權授予一般使用者。僅分配特定使用者在系統中執行其特定任務所絕對必需的特權,而不是所有特權。

祝您使用愉快!

Manpreet Singh

Author · CloudSigma

Comments

No comments yet. Be the first.