在 Linux 中設置 sudo 的十條 sudoers 實用配置
在 Linux 和其他的類 Unix 操作係統中,隻有 root 用戶可以運行所有的命令,才能在係統中執行那些需要鑒權的操作,比如安裝、升級和移除軟件包、創建用戶和用戶組、修改係統重要的配置文件等等。
然而,係統管理員,比如說 root 用戶,可以通過 sudo 命令 和一些配置選項來給普通用戶進行授權,從而讓該普通用戶可以運行某些命令已經上述的那些相當重要的係統級操作。
另外,係統管理員還可以分享 root 用戶密碼 (這個做法是不值得提倡的),這樣普通用戶就可以通過 su
命令來轉化為 root 用戶角色。.
sudo
允許已授權用戶按照指定的安全策略、以 root 用戶 (或者是其他的用戶角色) 權限來執行某個命令。
-
sudo
會讀取和解析/etc/sudoers
文件,查找調用命令的用戶及其權限。 - 然後提示調用該命令的用戶輸入密碼 (通常是用戶密碼,但也可能是目標用戶的密碼,或者也可以通過
NOPASSWD
標誌來跳過密碼驗證)。 - 這之後,
sudo
會創建一個子進程,調用 setuid() 來切換到目標用戶。 - 接著,它會在上述子進程中執行參數給定的 shell 或命令。
以下列出十個 /etc/sudoers
文件配置,使用 Defaults
項修改 sudo 命令的行為。
$ 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 ### 對任意主機登錄的所有用戶起作用
Defaults@Host_List parameter, parameter_list ### 對指定主機登錄的所有用戶起作用
Defaults:User_List parameter, parameter_list ### 對指定用戶起作用
Defaults!Cmnd_List parameter, parameter_list ### 對指定命令起作用
Defaults>Runas_List parameter, parameter_list ### 對以指定目標用戶運行命令起作用
在本文討論範圍內,我們下麵的將以第一個 Defaults
作為基準來參考。parameter 參數可以是標記 (flags)、整數值或者是列表 (list)。
值得注意的是,標記 (flag) 是指布爾類型值,可以使用 !
操作符來進行取反,列表 (list) 有兩個賦值運算符:+=
(添加到列表) 和 -=
(從列表中移除)。
Defaults parameter
或
Defaults parameter=值
或
Defaults parameter -=值
Defaults parameter +=值
或
Defaults !parameter
1、 安置一個安全的 PATH 環境變量
該 PATH
環境變量應用於每個通過 sudo
執行的命令,需要注意兩點:
- 當係統管理員不信任
sudo
用戶,便可以設置一個安全的PATH
環境變量。 - 該設置將 root 的 PATH 和用戶的 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 來運行一個惡意程序 (比如病毒或者惡意代碼),這種惡意程序可能會分叉出一個後台運行的進程,即使主程序完成執行,它仍能夠運行在用戶的終端設備上。
為了防止出現這樣的情況,你可以通過 use_pty
參數來設置 sudo
使用偽終端來運行其他命令,而不必管 I/O 日誌的開啟狀態。如下:
Defaults use_pty
4、 創建 sudo 日誌文件
默認下,sudo
通過 syslog(3) 來記錄到日誌。但是我們可以通過 logfile
參數來指定一個自定義的日誌文件。如下:
Defaults logfile="/var/log/sudo.log"
使用 log_host
和 log_year
參數可以對應記錄日誌主機名和 4 位數年份到自定義日誌文件。如下:
Defaults log_host, log_year, logfile="/var/log/sudo.log"
下麵是自定義 sudo 日誌文件的例示:
創建 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
記錄 sudo 命令的輸入/輸出
cat 命令 來查看該目錄的其餘部分。
6、 為 sudo 用戶提示命令用法
如下,使用 lecture
參數可以在係統中為 sudo
用戶提示命令的用法:
參數屬性值有三個選擇:
-
always
– 一直提示 -
once
– 用戶首次運行 sudo 時提示 (未指定參數屬性值時的默認值) -
never
– 從不提示
Defaults lecture="always"
此外,你還可以使用 lecture_file
參數類自定義提示內容,在指定的文件中輸入適當的提示內容即可:
Defaults lecture_file="/path/to/file"
為 sudo 用戶提示命令用法
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
增加 sudo 密碼嚐試限製次數
使用 passwd_timeout
參數設置密碼超時 (默認為 5 分鍾),如下:
Defaults passwd_timeout=2
9、 在輸錯密碼時讓 sudo 羞辱用戶
使用了 insults
參數之後,一旦你輸出了密碼,sudo 便會在命令窗口中顯示羞辱你的信息。這個參數會自動關閉 badpass_message
參數。
Defaults insults
原文發布時間為:2017-01-25
本文來自雲棲社區合作夥伴“Linux中國”
最後更新:2017-05-27 10:02:06