無論是Linux還是其他類的UNIX系統,都只允許root用戶運行全部命令並執行軟件包的安裝、更新、移除以及其他一些會對系統造成重要修改的特定操作。
然而,也有部分系統管理員允許其他用戶正常使用sudo配置以運行此類重要命令並進行關鍵性系統操作。
也有一些系統管理員會共享root用戶密碼(這種作法並不推薦),這意味著普通系統用戶也能夠通過su命令訪問root用戶賬戶。另外,sudo也允許用戶作為root(或者其他用戶身份)執行命令,具體由安全策略指定:
- 讀取並解析/etc/sudoers,查看調用用戶及其權限。
- 而後提示該調用用戶輸入密碼(通常為該用戶的密碼,也可為目標用戶的密碼,或者以NOPASSWD標簽跳過此步驟)。
- 在此之後,sudo會創建一個名為setuid()的子進程,用以切換至該目標用戶。
- 而後,它執行一條shell或者命令,並配合子進程中給定的參數。
以下為10個/etc/sudoers文件配置,能夠對sudo命令的Defaults效果做出修改。
- $ sudo cat /etc/sudoers
/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類型。它的參數可以是標記、整數值、字符串或者列表。
需要注意的是,各標記為明確boolean且可利用'!'運算符進行關閉。另外,兩項賦值運算符分別為+=(添加至列表)與-=(移除自列表)。
- Defaults parameter OR Defaults parameter=value OR Defaults parameter -=value Defaults parameter +=value OR Defaults !parameter
1. 設置安全PATH
此為每一條命令配合sudo運行時所使用的路徑,其中包含兩項重點:
- 當系統管理員不信任sudo用戶掌握安全PATH環境變量時使用。
- 用於劃分root path與user path,用戶通過exempt_group定義時不受此設置影響。
欲完成設置,請你添加以下行:
- Defaults
- secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
2. 在TTY用戶登錄會話上啟用sudo
用於通過真實tty調用sudo,而非使用cron或者cgi-bin腳本等方法:
- Defaults requiretty
3.利用pty運行sudo命令
有時候,攻擊者會利用sudo運行惡意程序(例如病毒或者惡意軟件),它會在主程序停止執行後繼續在用戶終端設備上fork一個後台進程。
為了避免此類問題,大家可以利用use_pty參數配置sudo以要求它僅可通過psuedo-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得以在pseudo-tty中運行命令,同時分別記錄全部用戶的輸入與輸出結果。
默認I/O日志目錄為/var/log/sudo-io,如果其中存在一條會話序列號,則將被存儲在該目錄中。大家可以通過iolog_dir參數指定您需要的目錄。
- Defaults log_input, log_output
%{seq}等轉義序列也受到支持,它會將序列號單調遞增為base-36序列號,例如000001,其中每兩位數字用於生成一個新的目錄,如00/00/01。具體示例如下:
- $ cd /var/log/sudo-io/ $ ls $ cd 00/00/01 $ ls $ cat log
6.引導sudo用戶
為了引導sudo用戶在系統上使用密碼,我們可以使用lecture參數。它可設定為三種值:
- always – 始終引導用戶。
- once – 僅在用戶初次執行sudo命令時進行引導(不指定值時默認為此設置)。
- never – 永遠不引導用戶。
- Defaults lecture="always"
另外,大家也可以利用lecture_file參數設置一個定制lecture文件,在此文件中輸入適當信息:
- Defaults lecture_file="/path/to/file"
Lecture Sudo Users
7.在輸入錯誤sudo密碼時顯示定制信息
當用戶輸入錯誤密碼時,可在命令行中顯示特定信息。它的默認信息為“sorry,try again”,大家可以使用badpass_message參數對內容進行修改:
- Defaults badpass_message="Password is wrong, please try again"
8.增加sudo密碼嘗試次數
參數passwd_tries用於指定用戶能夠嘗試輸入密碼的次數。
它的默認值為3:
- Defaults passwd_tries=5
要設置密碼超時(默認為5分鐘),可使用passwd_timeout參數,具體如下:
- Defaults passwd_timeout=2
9.當輸入錯誤密碼時,讓sudo顯示侮辱性內容
當用戶輸入錯誤密碼時,sudo將通過insults參數顯示侮辱性內容。它會自動關閉badpass_message參數。
- Defaults insults
10.了解更多sudo配置
另外,感興趣的朋友也可以參閱以下鏈接來了解更多sudo命令配置選項:su與sudo間的區別以及如何在Linux中配置sudo(英文原文)。
原文標題:10 Useful Sudoers Configurations for Setting ‘sudo’ in Linux,作者:Aaron Kili