介紹
特權分離是在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
特權,請查看我們的
如何獲取root權限
有三种基本方法可以獲得root權限,它們的複雜程度各不相同。
以root身份登錄
獲得root權限最簡單、最直接的方法是直接以root用戶身份登錄到您的服務器。
如果您正在登錄本地機器(或使用虛擬服務器上的帶外控制台功能),在登錄提示符處輸入root
作為您的用戶名,並在詢問時輸入root密碼。
如果您透過SSH登入,請在IP地址或域名之前指定root用戶於您的SSH連接字串中:
如果您尚未為root用戶設置SSH密鑰,請在提示時輸入root密碼。
使用su
成為Root
直接以root身份登入通常是不建議的,因為很容易開始使用系統進行非管理任務,這是危險的。
下一種獲得超級用戶權限的方式允許您在任何需要時成為root用戶。
我們可以通過調用su
命令來做到這一點,該命令代表“替代用戶”。要獲得root權限,請輸入:
系統將提示您輸入root用戶的密碼,之後,您將進入一個rootshell會話。
當您完成需要root權限的任務後,通過輸入以下命令返回您的正常shell:
使用sudo
以Root身份執行命令
我們將討論的最後一種獲取root權限的方法是使用sudo
命令。
sudo
命令允許您以root權限執行一次性命令,而無需生成新的shell。它這樣執行:
與su
不同,sudo
命令將請求當前用戶的密碼,而不是root密碼。
由於其安全含義,sudo
訪問權限不會默認授予用戶,並且必須在它正確運行之前進行設置。查看我們的如何創建新的sudo啟用用戶快速入門教程,了解如何在Ubuntu和CentOS上設置sudo
啟用用戶。
在以下部分中,我們將更詳細地討論如何修改sudo
配置。
什麼是Visudo?
sudo
命令通過位於/etc/sudoers
的文件進行配置。
警告:切勿使用普通文本編輯器編輯此文件!始終使用visudo
命令!
由於在/etc/sudoers
文件中不當的語法可能會導致系統損壞,使得無法獲得提升的權限,因此使用visudo
命令來編輯該文件至關重要。
visudo
命令像平常一樣打開一個文本編輯器,但在保存時會驗證文件的語法。這可以防止配置錯誤阻礙sudo
操作,這可能是您獲得root權限的唯一方式。
傳統上,visudo
使用vi
文本編輯器打開/etc/sudoers
文件。然而,Ubuntu已配置visudo
使用nano
文本編輯器。
如果您想將其更改回vi
,請發出以下命令:
OutputThere 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
來更改此值:
來源文件以實施更改:
配置好visudo
後,執行命令以訪問/etc/sudoers
文件:
如何修改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.
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行
最後一行乍看之下可能像是一個註釋:
. . .
#includedir /etc/sudoers.d
它確實是以#
開頭,這通常表示一個註釋。然而,這行實際上表明位於/etc/sudoers.d
目錄中的文件也將被讀取並應用。
該目錄中的文件遵循與/etc/sudoers
文件本身相同的規則。任何不以~
結尾且不包含.
的文件都將被讀取並追加到sudo
配置中。
這主要是為了讓應用程式在安裝時能夠修改sudo
權限。將所有相關的規則放在/etc/sudoers.d
目錄中的單一檔案內,可以方便地查看哪些權限與哪些帳戶相關聯,並且能夠輕鬆地撤銷憑證,而不必直接嘗試操縱/etc/sudoers
檔案。
與/etc/sudoers
檔案本身一樣,您應該始終使用visudo
編輯/etc/sudoers.d
目錄內的檔案。編輯這些檔案的語法將是:
如何給予用戶sudo權限
當用戶管理sudo
權限時,最常想要完成的操作是授予新用戶一般sudo
存取權。如果您想要給予帳戶完整的系統管理存取權,這會很有用。
在一個設置了通用管理組的系統上,例如本指南中的Ubuntu系統,實際上最簡單的方法是將問題用戶添加到該組中。
例如,在Ubuntu 20.04上,sudo
組具有完整的管理員權限。我們可以通過將用戶添加到該組來授予他們相同的權限,如下所示:
也可以使用gpasswd
命令:
這兩種方法都會達到相同的效果。
在 CentOS 上,通常是 wheel
群組而不是 sudo
群組:
或者,使用 gpasswd
:
在 CentOS 上,如果將用戶添加到群組後沒有立即生效,你可能需要編輯 /etc/sudoers
文件以取消註釋群組名稱:
. . .
%wheel ALL=(ALL) ALL
. . .
如何設定自定義規則
現在我們已經熟悉了文件的一般語法,讓我們創建一些新規則。
如何創建別名
通過使用各種類型的“別名”,sudoers
文件可以更容易地組織起來。
例如,我們可以創建三個不同的用戶群組,並且有重疊的成員資格:
. . .
User_Alias GROUPONE = abby, brent, carl
User_Alias GROUPTWO = brent, doris, eric,
User_Alias GROUPTHREE = doris, felicia, grant
. . .
群組名稱必須以大寫字母開頭。然後,我們可以允許 GROUPTWO
的成員更新 apt
數據庫,方法是創建一個像這樣的規則:
. . .
GROUPTWO ALL = /usr/bin/apt-get update
. . .
如果我們沒有指定用戶/群組來運行,如上所述,sudo
默認為 root 用戶。
我們可以允許 GROUPTHREE
的成員關閉並重啟機器,方法是創建一個“命令別名”,並將其用於 GROUPTHREE
的規則中:
. . .
Cmnd_Alias POWER = /sbin/shutdown, /sbin/halt, /sbin/reboot, /sbin/restart
GROUPTHREE ALL = POWER
. . .
我們創建了一個名為POWER
的命令別名,其中包含關機和重啟機器的命令。然後我們允許GROUPTHREE
的成員執行這些命令。
我們還可以創建“以…運行”別名,這可以替換規則中指定以哪個用戶執行命令的部分:
. . .
Runas_Alias WEB = www-data, apache
GROUPONE ALL = (WEB) ALL
. . .
這將允許任何GROUPONE
的成員以www-data
用戶或apache
用戶的身份執行命令。
請記住,當兩個規則之間存在衝突時,後面的規則將覆蓋前面的規則。
如何鎖定規則
有多種方法可以實現對sudo
如何響應調用的更多控制。
與mlocate
包相關聯的updatedb
命令在單用戶系統上相對無害。如果我們想允許用戶在root權限下不輸入密碼執行它,我們可以製定這樣的規則:
. . .
GROUPONE ALL = NOPASSWD: /usr/bin/updatedb
. . .
NOPASSWD
是一個“標籤”,意味著不會要求輸入密碼。它有一個名為PASSWD
的伴隨命令,這是默認行為。標籤對規則的其餘部分是相關的,除非被後面的“雙胞胎”標籤所覆蓋。
例如,我們可以有這樣一行:
. . .
GROUPTWO ALL = NOPASSWD: /usr/bin/updatedb, PASSWD: /bin/kill
. . .
另一個有用的標籤是NOEXEC
,可用於防止某些程序中的危險行為。
例如,某些程序,如less
,可以通過在其界面內輸入來啟動其他命令:
!command_to_run
這基本上是以與less
相同的權限執行用戶給出的任何命令,這可能非常危險。
為了限制這一點,我們可以使用這樣一行:
. . .
username ALL = NOEXEC: /usr/bin/less
. . .
雜項信息
在處理sudo
時,還有一些可能有用的信息。
如果您在配置文件中指定了要“以”某個用戶或組運行,則可以使用-u
和-g
標誌分別以這些用戶身份執行命令:
為了方便,默認情況下,sudo
將在一個終端中將您的身份驗證詳細信息保存一段時間。這意味著在該計時器運行之前,您不必再次輸入密碼。
出於安全考慮,如果您希望在運行管理命令後清除此計時器,可以運行:
另一方面,如果您想“準備”sudo
命令,以便稍後不會被提示,或者更新您的sudo
租約,您總是可以輸入:
您將被要求輸入密碼,該密碼將被緩存以供後續的sudo
使用,直到sudo
的時間框架到期。
如果您只是想知道您的用戶名定義了哪些權限,您可以輸入:
這將列出/etc/sudoers
文件中適用於您的用戶的所有規則。這讓您對您將能夠或將不能夠使用sudo
作為任何用戶做什麼有一個很好的了解。
有很多時候,您將執行一個命令,它將因為您忘記在其前面加上sudo
而失敗。為了避免不得不重新輸入命令,您可以利用一個bash功能,意思是“重複最後的命令”:
雙重驚嘆號將重複最後的命令。我們在其前面加上sudo
,以快速將未授權的命令更改為授權的命令。
為了好玩,您可以使用visudo
將以下行添加到您的/etc/sudoers
文件中:
. . .
Defaults insults
. . .
這將導致當用戶在sudo
中輸入錯誤的密碼時,sudo
返回一個愚蠢的侮辱。我們可以使用sudo -k
清除先前緩存的sudo
密碼來嘗試它:
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