掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
在 linux 和其他的類 Unix 操作系統(tǒng)中,只有 root 用戶可以運行所有的命令,才能在系統(tǒng)中執(zhí)行那些需要鑒權(quán)的操作,比如安裝、升級和移除軟件包、創(chuàng)建用戶和用戶組、修改系統(tǒng)重要的配置文件等等。

然而,系統(tǒng)管理員,比如說 root 用戶,可以通過 sudo 命令 和一些配置選項來給普通用戶進行授權(quán),從而讓該普通用戶可以運行某些命令已經(jīng)上述的那些相當重要的系統(tǒng)級操作。
另外,系統(tǒng)管理員還可以分享 root 用戶密碼 (這個做法是不值得提倡的),這樣普通用戶就可以通過 su 命令來轉(zhuǎn)化為 root 用戶角色。.
sudo 允許已授權(quán)用戶按照指定的安全策略、以 root 用戶 (或者是其他的用戶角色) 權(quán)限來執(zhí)行某個命令。
sudo 會讀取和解析 /etc/sudoers 文件,查找調(diào)用命令的用戶及其權(quán)限。NOPASSWD 標志來跳過密碼驗證)。sudo 會創(chuàng)建一個子進程,調(diào)用 setuid() 來切換到目標用戶。以下列出十個 /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 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 ### 對以指定目標用戶運行命令起作用
在本文討論范圍內(nèi),我們下面的將以第一個 Defaults 作為基準來參考。parameter 參數(shù)可以是標記 (flags)、整數(shù)值或者是列表 (list)。
值得注意的是,標記 (flag) 是指布爾類型值,可以使用 ! 操作符來進行取反,列表 (list) 有兩個賦值運算符:+= (添加到列表) 和 -= (從列表中移除)。
Defaults parameter
或
Defaults parameter=值
或
Defaults parameter -=值
Defaults parameter +=值
或
Defaults !parameter
該 PATH 環(huán)境變量應(yīng)用于每個通過 sudo 執(zhí)行的命令,需要注意兩點:
sudo 用戶,便可以設(shè)置一個安全的 PATH 環(huán)境變量。exempt_group 組的用戶不受該設(shè)置的影響。可以添加以下內(nèi)容來設(shè)置:
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
該設(shè)置允許在一個真實的 tty 中進行調(diào)用 sudo,但不允許通過 cron 或者 cgi-bin 腳本等方法來調(diào)用。添加以下內(nèi)容來設(shè)置:
Defaults requiretty
少數(shù)情況下,攻擊者可以通過 sudo 來運行一個惡意程序 (比如病毒或者惡意代碼),這種惡意程序可能會分叉出一個后臺運行的進程,即使主程序完成執(zhí)行,它仍能夠運行在用戶的終端設(shè)備上。
為了防止出現(xiàn)這樣的情況,你可以通過 use_pty 參數(shù)來設(shè)置 sudo 使用偽終端來運行其他命令,而不必管 I/O 日志的開啟狀態(tài)。如下:
Defaults use_pty
默認下,sudo 通過 syslog(3) 來記錄到日志。但是我們可以通過 logfile 參數(shù)來指定一個自定義的日志文件。如下:
Defaults logfile="/var/log/sudo.log"
使用 log_host 和 log_year 參數(shù)可以對應(yīng)記錄日志主機名和 4 位數(shù)年份到自定義日志文件。如下:
Defaults log_host, log_year, logfile="/var/log/sudo.log"
下面是自定義 sudo 日志文件的例示:
創(chuàng)建 sudo 日志文件
log_input 和 log_output 參數(shù)可以讓 sudo 命令運行在偽終端,并可以對應(yīng)地記錄所有的用戶輸入和輸出到屏幕上。
默認的 I/O 日志目錄為 /var/log/sudo-io,如果存在會話序列號,它將被存儲到該目錄。你可以通過 iolog_dir 參數(shù)來指定一個目錄。
Defaults log_input, log_output
這其中支持轉(zhuǎn)義字符,像 %{seq} —— 以 36 為基數(shù)的單調(diào)遞增序列,比如 000001,這里每兩個數(shù)字都分別用來形成一個新目錄。請看下邊例示 00/00/01:
$ cd /var/log/sudo-io/
$ ls
$ cd 00/00/01
$ ls
$ cat log
記錄 sudo 命令的輸入/輸出
cat 命令 來查看該目錄的其余部分。
如下,使用 lecture 參數(shù)可以在系統(tǒng)中為 sudo 用戶提示命令的用法:
參數(shù)屬性值有三個選擇:
always – 一直提示once – 用戶首次運行 sudo 時提示 (未指定參數(shù)屬性值時的默認值)never – 從不提示Defaults lecture="always"
此外,你還可以使用 lecture_file 參數(shù)類自定義提示內(nèi)容,在指定的文件中輸入適當?shù)奶崾緝?nèi)容即可:
Defaults lecture_file="/path/to/file"
為 sudo 用戶提示命令用法
當某個用戶輸錯密碼時,會有一個對應(yīng)的信息顯示在屏幕上。默認是“抱歉,請重新嘗試。(sorry, try again)”,你可以通過 badpass_message 參數(shù)來修改該信息:
Defaults badpass_message="Password is wrong, please try again"
passwd_tries 參數(shù)用于指定用戶嘗試輸入密碼的次數(shù)。
默認為 3。
Defaults passwd_tries=5
增加 sudo 密碼嘗試限制次數(shù)
使用 passwd_timeout 參數(shù)設(shè)置密碼超時 (默認為 5 分鐘),如下:
Defaults passwd_timeout=2
使用了 insults 參數(shù)之后,一旦你輸出了密碼,sudo 便會在命令窗口中顯示羞辱你的信息。這個參數(shù)會自動關(guān)閉 badpass_message 參數(shù)。
Defaults insults
在輸錯密碼時讓 sudo 羞辱用戶
此外,欲了解更多 sudo 命令的配置,請自行閱讀:su 與 sudo 的差異以及如何配置 sudo。
文畢。你也可以在評論區(qū)分享其他有用的 sudo 配置或者 Linux 技巧。
譯者簡介:GHLandy —— 欲得之,則為之奮斗。If you want it, work for it.

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流