在Linux和其他類Unix操作系統中,只有root用戶可以運行所有命令並執行系統上的某些關鍵操作,例如安裝和更新、刪除軟件包、創建用戶和組、修改重要系統配置文件等。
然而,擔任root用戶角色的系統管理員可以通過sudo命令和一些配置,允許其他普通系統用戶運行一些命令以及執行一些重要的系統操作,包括上述提到的操作。
另外,系統管理員可以共享root用戶密碼(這不是一種推薦的方法),以便普通系統用戶通過su命令訪問root用戶帳戶。
sudo允許被授權的用戶按照安全策略的指定執行命令作為root(或其他用戶):
- 它讀取並解析/etc/sudoers,查找調用用戶及其權限,
- 然後提示調用用戶輸入密碼(通常是用戶的密碼,但也可以是目標用戶的密碼。或者可以使用NOPASSWD標籤跳過),
- 之後,sudo創建一個子進程,在其中調用setuid()切換到目標用戶
- 接下來,在上述子進程中執行一個shell或給定的命令作為參數。
以下是十個/etc/sudoers文件配置,用於修改sudo命令的行為,使用Defaults條目。
$ sudo cat /etc/sudoers
# # This file MUST be edited with the 'visudo' command as root. # # Please consider adding local content in /etc/sudoers.d/ instead of # directly modifying this file. # # See the man page for details on how to write a sudoers file. # Defaults env_reset Defaults mail_badpass Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" Defaults logfile="/var/log/sudo.log" Defaults lecture="always" Defaults badpass_message="Password is wrong, please try again" Defaults passwd_tries=5 Defaults insults Defaults log_input,log_output
Defaults條目類型
Defaults parameter, parameter_list #affect all users on any host Defaults@Host_List parameter, parameter_list #affects all users on a specific host Defaults:User_List parameter, parameter_list #affects a specific user Defaults!Cmnd_List parameter, parameter_list #affects a specific command Defaults>Runas_List parameter, parameter_list #affects commands being run as a specific user
對於本指南的範圍,我們將專注於以下形式的第一類Defaults。參數可以是標誌、整數值、字符串或列表。
您應該注意,標誌隱含為布爾值,可以使用'!'
運算符關閉,而列表有兩個額外的賦值運算符,+=
(添加到列表)和-=
(從列表中刪除)。
Defaults parameter OR Defaults parameter=value OR Defaults parameter -=value Defaults parameter +=value OR Defaults !parameter
1. 設置安全PATH
這是用於運行帶有sudo的每個命令的路徑,它有兩個重要性:
- 當系統管理員不信任sudo用戶具有安全的PATH環境變量時使用
- 將“根路徑”和“用戶路徑”分開,只有由exempt_group定義的用戶不受此設置影響。
要設置它,添加以下行:
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
2. 在TTY用戶登錄會話上啟用sudo
要啟用sudo從真實tty中調用,但不通過諸如cron或cgi-bin腳本等方法,添加以下行:
Defaults requiretty
3. 使用pty運行Sudo命令
A few times, attackers can run a malicious program (such as a virus or malware) using sudo, which would again fork a background process that remains on the user’s terminal device even when the main program has finished executing.
為了避免這種情況,您可以配置sudo僅從虛擬pty運行其他命令,使用use_pty
參數,無論I/O日誌記錄是否打開,如下所示:
Defaults use_pty
4. 創建一個Sudo日誌文件
預設情況下,sudo 通過 syslog(3) 進行記錄。但是,要指定自定義日誌文件,請使用如下的 logfile 參數:
Defaults logfile="/var/log/sudo.log"
要在自定義日誌文件中記錄主機名稱和四位數年份,分別使用 log_host 和 log_year 參數,如下所示:
Defaults log_host, log_year, logfile="/var/log/sudo.log"
以下是一個自定義 sudo 日誌文件的示例:

5. 記錄 Sudo 命令輸入/輸出
log_input 和 log_output 參數使 sudo 能夠在虛擬終端中運行命令,並分別記錄所有用戶輸入和所有輸出發送到屏幕。
默認的 I/O 日誌目錄是 /var/log/sudo-io,如果有會話序列號,則會存儲在此目錄中。您可以通過 iolog_dir 參數指定自定義目錄。
Defaults log_input, log_output
支持一些轉義序列,例如 %{seq},它會擴展為一個單調增加的基數 36 序列號,例如 000001,其中每兩位數用於形成一個新目錄,例如下面的示例中的 00/00/01:
$ cd /var/log/sudo-io/ $ ls $ cd 00/00/01 $ ls $ cat log

您可以使用 cat 命令查看該目錄中的其餘文件。
6. 講解 Sudo 用戶
要向系統中的 sudo 用戶講解密碼使用情況,請使用如下的 lecture 參數。
它有 3 個可能的值:
- always – 總是向用戶講解。
- 一次-僅在用戶第一次執行sudo命令時講解(當未指定值時使用)
- 永不-永不對用戶進行講解。
Defaults lecture="always"
此外,您可以使用lecture_file參數設置自定義講解文件,請在文件中輸入適當的消息:
Defaults lecture_file="/path/to/file"

7. 在輸入錯誤的sudo密碼時顯示自定義消息
當用戶輸入錯誤的密碼時,命令行上會顯示特定消息。默認消息為“對不起,請重試”,您可以使用badpass_message參數修改消息如下:
Defaults badpass_message="Password is wrong, please try again"
8. 增加sudo密碼嘗試次數限制
參數passwd_tries用於指定用戶可以嘗試輸入密碼的次數。
默認值為3:
Defaults passwd_tries=5

使用passwd_timeout參數設置密碼超時(默認為5分鐘),添加以下行:
Defaults passwd_timeout=2
9. 讓Sudo在輸入錯誤密碼時對您進行侮辱
如果用戶輸入錯誤密碼,sudo將在終端上顯示侮辱語句,這將自動關閉badpass_message參數。
Defaults insults

閱讀更多:讓Sudo在輸入不正確密碼時對您進行侮辱
10. 了解更多Sudo配置
此外,您可以通過閱讀:su 和 sudo 之間的區別以及如何在 Linux 中配置 sudo 來了解更多 sudo 命令配置。
就是這樣!您可以通過下面的評論部分與其他用戶分享其他有用的 sudo 命令配置或 Linux 的技巧和提示。
Source:
https://www.tecmint.com/sudoers-configurations-for-setting-sudo-in-linux/