如何編輯 Sudoers 檔案

介紹

特權分離是在Linux和類Unix操作系統中實施的基本安全範式之一。普通用戶以有限特權運行,以減少其影響範圍僅限於自己的環境,而不是整個操作系統。

A special user, called root, has super-user privileges. This is an administrative account without the restrictions that are present on normal users. Users can execute commands with super-user or root privileges in a number of different ways.

在本文中,我們將討論如何正確且安全地獲取root特權,特別關注編輯/etc/sudoers文件。

我們將在Ubuntu 20.04服務器上完成這些步驟,但大多數現代Linux發行版,如Debian和CentOS,應以類似方式操作。

本指南假設您已完成此處討論的初始服務器設置。以普通非root用戶身份登錄您的服務器,然後繼續進行以下操作。注意:本教程詳細介紹了特權升級和sudoers文件。如果您只想為用戶添加sudo特權,請查看我們的如何創建新的Sudo-enabled用戶快速入門教程,針對UbuntuCentOS

注意: 本教程深入探討了權限提升以及sudoers文件。如果您只是想為用戶添加sudo權限,請查看我們的如何創建新的具有sudo權限的用戶快速入門教程,適用於UbuntuCentOS

如何獲取root權限

有三种基本方法可以獲得root權限,它們的複雜程度各不相同。

以root身份登錄

獲得root權限最簡單、最直接的方法是直接以root用戶身份登錄到您的服務器。

如果您正在登錄本地機器(或使用虛擬服務器上的帶外控制台功能),在登錄提示符處輸入root作為您的用戶名,並在詢問時輸入root密碼。

如果您透過SSH登入,請在IP地址或域名之前指定root用戶於您的SSH連接字串中:

  1. ssh root@server_domain_or_ip

如果您尚未為root用戶設置SSH密鑰,請在提示時輸入root密碼。

使用su成為Root

直接以root身份登入通常是不建議的,因為很容易開始使用系統進行非管理任務,這是危險的。

下一種獲得超級用戶權限的方式允許您在任何需要時成為root用戶。

我們可以通過調用su命令來做到這一點,該命令代表“替代用戶”。要獲得root權限,請輸入:

  1. su

系統將提示您輸入root用戶的密碼,之後,您將進入一個rootshell會話。

當您完成需要root權限的任務後,通過輸入以下命令返回您的正常shell:

  1. exit

使用sudo以Root身份執行命令

我們將討論的最後一種獲取root權限的方法是使用sudo命令。

sudo命令允許您以root權限執行一次性命令,而無需生成新的shell。它這樣執行:

  1. sudo command_to_execute

su不同,sudo命令將請求當前用戶的密碼,而不是root密碼。

由於其安全含義,sudo訪問權限不會默認授予用戶,並且必須在它正確運行之前進行設置。查看我們的如何創建新的sudo啟用用戶快速入門教程,了解如何在UbuntuCentOS上設置sudo啟用用戶。

在以下部分中,我們將更詳細地討論如何修改sudo配置。

什麼是Visudo?

sudo命令通過位於/etc/sudoers的文件進行配置。

警告:切勿使用普通文本編輯器編輯此文件!始終使用visudo命令!

由於在/etc/sudoers文件中不當的語法可能會導致系統損壞,使得無法獲得提升的權限,因此使用visudo命令來編輯該文件至關重要。

visudo命令像平常一樣打開一個文本編輯器,但在保存時會驗證文件的語法。這可以防止配置錯誤阻礙sudo操作,這可能是您獲得root權限的唯一方式。

傳統上,visudo使用vi文本編輯器打開/etc/sudoers文件。然而,Ubuntu已配置visudo使用nano文本編輯器。

如果您想將其更改回vi,請發出以下命令:

  1. sudo update-alternatives --config editor
Output
There are 4 choices for the alternative editor (providing /usr/bin/editor). Selection Path Priority Status ------------------------------------------------------------ * 0 /bin/nano 40 auto mode 1 /bin/ed -100 manual mode 2 /bin/nano 40 manual mode 3 /usr/bin/vim.basic 30 manual mode 4 /usr/bin/vim.tiny 10 manual mode Press <enter> to keep the current choice[*], or type selection number:

選擇與您想要做出的選擇相對應的數字。

在CentOS上,您可以通過將以下行添加到您的~/.bashrc來更改此值:

  1. export EDITOR=`which name_of_editor`

來源文件以實施更改:

  1. . ~/.bashrc

配置好visudo後,執行命令以訪問/etc/sudoers文件:

  1. sudo visudo

如何修改Sudoers文件

您將在所選的文本編輯器中看到/etc/sudoers文件。

I have copied and pasted the file from Ubuntu 20.04, with comments removed. The CentOS /etc/sudoers file has many more lines, some of which we will not discuss in this guide.

/etc/sudoers
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 ALL=(ALL) ALL
%sudo   ALL=(ALL:ALL) ALL

#includedir /etc/sudoers.d

讓我們來看看這些線條做了什麼。

預設線條

第一行,Defaults env_reset,將終端環境重置以移除任何用戶變量。這是一種安全措施,用於清除sudo會話中可能有害的環境變量。

第二行,Defaults mail_badpass,告訴系統將不良sudo密碼嘗試的通知郵件發送到配置的mailto用戶。默認情況下,這是root帳戶。

第三行,以Defaults secure_path=...開頭,指定將用於sudo操作的PATH(操作系統將在其中查找應用程序的文件系統位置)。這可以防止使用可能有害的用戶路徑。

用戶權限線條

第四行,規定了root用戶的sudo權限,與前面的線條不同。讓我們來看看不同字段的意思:

  • 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行

最後一行乍看之下可能像是一個註釋:

/etc/sudoers
. . .

#includedir /etc/sudoers.d

它確實是以#開頭,這通常表示一個註釋。然而,這行實際上表明位於/etc/sudoers.d目錄中的文件也將被讀取並應用。

該目錄中的文件遵循與/etc/sudoers文件本身相同的規則。任何不以~結尾且不包含.的文件都將被讀取並追加到sudo配置中。

這主要是為了讓應用程式在安裝時能夠修改sudo權限。將所有相關的規則放在/etc/sudoers.d目錄中的單一檔案內,可以方便地查看哪些權限與哪些帳戶相關聯,並且能夠輕鬆地撤銷憑證,而不必直接嘗試操縱/etc/sudoers檔案。

/etc/sudoers檔案本身一樣,您應該始終使用visudo編輯/etc/sudoers.d目錄內的檔案。編輯這些檔案的語法將是:

  1. sudo visudo -f /etc/sudoers.d/file_to_edit

如何給予用戶sudo權限

當用戶管理sudo權限時,最常想要完成的操作是授予新用戶一般sudo存取權。如果您想要給予帳戶完整的系統管理存取權,這會很有用。

在一個設置了通用管理組的系統上,例如本指南中的Ubuntu系統,實際上最簡單的方法是將問題用戶添加到該組中。

例如,在Ubuntu 20.04上,sudo組具有完整的管理員權限。我們可以通過將用戶添加到該組來授予他們相同的權限,如下所示:

  1. sudo usermod -aG sudo username

也可以使用gpasswd命令:

  1. sudo gpasswd -a username sudo

這兩種方法都會達到相同的效果。

在 CentOS 上,通常是 wheel 群組而不是 sudo 群組:

  1. sudo usermod -aG wheel username

或者,使用 gpasswd

  1. sudo gpasswd -a username wheel

在 CentOS 上,如果將用戶添加到群組後沒有立即生效,你可能需要編輯 /etc/sudoers 文件以取消註釋群組名稱:

  1. sudo visudo
/etc/sudoers
. . .
%wheel ALL=(ALL) ALL
. . .

如何設定自定義規則

現在我們已經熟悉了文件的一般語法,讓我們創建一些新規則。

如何創建別名

通過使用各種類型的“別名”,sudoers 文件可以更容易地組織起來。

例如,我們可以創建三個不同的用戶群組,並且有重疊的成員資格:

/etc/sudoers
. . .
User_Alias		GROUPONE = abby, brent, carl
User_Alias		GROUPTWO = brent, doris, eric,
User_Alias		GROUPTHREE = doris, felicia, grant
. . .

群組名稱必須以大寫字母開頭。然後,我們可以允許 GROUPTWO 的成員更新 apt 數據庫,方法是創建一個像這樣的規則:

/etc/sudoers
. . .
GROUPTWO	ALL = /usr/bin/apt-get update
. . .

如果我們沒有指定用戶/群組來運行,如上所述,sudo 默認為 root 用戶。

我們可以允許 GROUPTHREE 的成員關閉並重啟機器,方法是創建一個“命令別名”,並將其用於 GROUPTHREE 的規則中:

/etc/sudoers
. . .
Cmnd_Alias		POWER = /sbin/shutdown, /sbin/halt, /sbin/reboot, /sbin/restart
GROUPTHREE	ALL = POWER
. . .

我們創建了一個名為POWER的命令別名,其中包含關機和重啟機器的命令。然後我們允許GROUPTHREE的成員執行這些命令。

我們還可以創建“以…運行”別名,這可以替換規則中指定以哪個用戶執行命令的部分:

/etc/sudoers
. . .
Runas_Alias		WEB = www-data, apache
GROUPONE	ALL = (WEB) ALL
. . .

這將允許任何GROUPONE的成員以www-data用戶或apache用戶的身份執行命令。

請記住,當兩個規則之間存在衝突時,後面的規則將覆蓋前面的規則。

如何鎖定規則

有多種方法可以實現對sudo如何響應調用的更多控制。

mlocate包相關聯的updatedb命令在單用戶系統上相對無害。如果我們想允許用戶在root權限下不輸入密碼執行它,我們可以製定這樣的規則:

/etc/sudoers
. . .
GROUPONE	ALL = NOPASSWD: /usr/bin/updatedb
. . .

NOPASSWD是一個“標籤”,意味著不會要求輸入密碼。它有一個名為PASSWD的伴隨命令,這是默認行為。標籤對規則的其餘部分是相關的,除非被後面的“雙胞胎”標籤所覆蓋。

例如,我們可以有這樣一行:

/etc/sudoers
. . .
GROUPTWO	ALL = NOPASSWD: /usr/bin/updatedb, PASSWD: /bin/kill
. . .

另一個有用的標籤是NOEXEC,可用於防止某些程序中的危險行為。

例如,某些程序,如less,可以通過在其界面內輸入來啟動其他命令:

!command_to_run

這基本上是以與less相同的權限執行用戶給出的任何命令,這可能非常危險。

為了限制這一點,我們可以使用這樣一行:

/etc/sudoers
. . .
username	ALL = NOEXEC: /usr/bin/less
. . .

雜項信息

在處理sudo時,還有一些可能有用的信息。

如果您在配置文件中指定了要“以”某個用戶或組運行,則可以使用-u-g標誌分別以這些用戶身份執行命令:

  1. sudo -u run_as_user command
  2. sudo -g run_as_group command

為了方便,默認情況下,sudo將在一個終端中將您的身份驗證詳細信息保存一段時間。這意味著在該計時器運行之前,您不必再次輸入密碼。

出於安全考慮,如果您希望在運行管理命令後清除此計時器,可以運行:

  1. sudo -k

另一方面,如果您想“準備”sudo命令,以便稍後不會被提示,或者更新您的sudo租約,您總是可以輸入:

  1. sudo -v

您將被要求輸入密碼,該密碼將被緩存以供後續的sudo使用,直到sudo的時間框架到期。

如果您只是想知道您的用戶名定義了哪些權限,您可以輸入:

  1. sudo -l

這將列出/etc/sudoers文件中適用於您的用戶的所有規則。這讓您對您將能夠或將不能夠使用sudo作為任何用戶做什麼有一個很好的了解。

有很多時候,您將執行一個命令,它將因為您忘記在其前面加上sudo而失敗。為了避免不得不重新輸入命令,您可以利用一個bash功能,意思是“重複最後的命令”:

  1. sudo !!

雙重驚嘆號將重複最後的命令。我們在其前面加上sudo,以快速將未授權的命令更改為授權的命令。

為了好玩,您可以使用visudo將以下行添加到您的/etc/sudoers文件中:

  1. sudo visudo
/etc/sudoers
. . .
Defaults	insults
. . .

這將導致當用戶在sudo中輸入錯誤的密碼時,sudo返回一個愚蠢的侮辱。我們可以使用sudo -k清除先前緩存的sudo密碼來嘗試它:

  1. sudo -k
  2. sudo ls
Output
[sudo] password for demo: # enter an incorrect password here to see the results Your mind just hasn't been the same since the electro-shock, has it? [sudo] password for demo: My mind is going. I can feel it.

結論

您現在應該對如何閱讀和修改sudoers文件有一個基本的了解,並且對您可以使用的各種方法來獲取root權限有所掌握。

請記住,超級使用者權限不會輕易給予普通使用者,這是有原因的。了解您使用具有root權限執行的每個命令的功能至關重要。不要輕忽這份責任。學習如何在您的情況下最佳地使用這些工具,並鎖定不需要的任何功能。

Source:
https://www.digitalocean.com/community/tutorials/how-to-edit-the-sudoers-file