返回部落格

設定 Linux Sudoers 檔案

設定 Linux Sudoers 檔案

簡介

您是否曾想過,為什麼您必須輸入 “sudo”,當您嘗試在 LinuxUnix 作業系統環境中執行某些指令時?Sudo 實際上是一個縮寫,代表 “super-user do”。當您使用 sudo 指令時,您可以使用另一個使用者的安全權限來執行程式和指令。

預設情況下,sudo 指令允許系統使用者以 超級使用者 的權限來執行指令。全新安裝的 Linux/Unix 作業系統會建立一個具有超級使用者權限的 root 帳戶。在進行 Linux/Unix 系統的初始伺服器設定時,系統管理員會使用 root 帳戶登入,並將系統權限分配給其他系統使用者。這些設定儲存在一個名為 sudoers 的檔案中。具有 root 權限的帳戶可以編輯 sudoers 檔案並修改其他使用者的權限。

在本教學中,我們將討論如何取得 root 權限並對 sudoers 檔案進行編輯。

先決條件

這是一個動手實作的教學,您需要測試這些指令以完整理解本教學。我們在本教學中將使用 Ubuntu 20.04 伺服器,然而,如果您使用的是任何現代 Linux 發行版,例如 DebianCentOS,您也可以照著步驟操作。您可以點選 此連結在 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 ,後面加上要執行的指令:

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

系統會提示您輸入密碼。而 susudo 指令之間的差別在於,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。現在,第一群組的成員可以以 apachewww-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 系統安全的原因。因此,不應將超級使用者特權授予一般使用者。僅分配特定使用者在系統中執行其特定任務所絕對必需的特權,而不是所有特權。

祝您使用愉快!

author

Manpreet Singh

作者 · CloudSigma

Preslav Dobrev 是 CloudSigma 的創意設計師,專注於透過傳統與創新行銷渠道建立一致的企業形象。他擅長將藝術願景與策略行銷相融合,創造具有影響力的品牌敘事。

留言

目前尚無留言。成為第一個留言的人吧。