新聞中心
sudo 就是 aS other User to DOing somthing 的意思!

它讓你在某些安全策略下,以其他用戶(hù)身份運(yùn)行命令,通常是以普通用戶(hù)臨時(shí)運(yùn)行root用戶(hù)才可運(yùn)行的命令場(chǎng)景。
默認(rèn)的安全策略就是 /etc/sudoers安全策略
1. JSON 格式的日志記錄
我想介紹的第一個(gè)新功能是 JSON 格式的日志記錄。我是一個(gè)日志狂熱者(12 年前我就開(kāi)始在 syslog-ng 項(xiàng)目上工作),而這個(gè)功能是我在這里發(fā)表文章后引入的第一個(gè)功能。啟用后,sudo 記錄了更多的信息,并且以一種更容易解析的方式進(jìn)行。
傳統(tǒng)的 syslog 信息很短,只包含最小的必要信息量。這是由于舊的 syslog 實(shí)現(xiàn)的限制。超過(guò) 1k 大小的信息被丟棄或截?cái)唷?/p>
Jan 28 13:56:27 localhost.localdomain sudo[10419]: czanik : TTY=pts/0 ; PWD=/home/czanik ; USER=root ; COMMAND=/bin/bash1.
最近的 syslog 實(shí)現(xiàn)可以處理更大的信息量。syslog-ng 默認(rèn)接受 64k 大小的日志信息(當(dāng)然,它可以更小或更大,取決于實(shí)際配置)。
同樣的事件,如果以 JSON 格式記錄,就會(huì)包含更多的信息。更多并不意味著更難處理。JSON 格式的信息更容易被許多日志管理軟件應(yīng)用解析。下面是一個(gè)例子:
Jan 28 13:58:20 localhost.localdomain sudo[10518]: @cee:{"sudo":{"accept":{"uuid":"616bc9efcf-b239-469d-60ee-deb5af8ce6","server_time":{"seconds":1643374700,"nanoseconds":222446715,"iso8601":"20220128125820Z","localtime":"Jan 28 13:58:20"},"submit_time":{"seconds":1643374700,"nanoseconds":209935349,"iso8601":"20220128125820Z","localtime":"Jan 28 13:58:20"},"submituser":"czanik","command":"/bin/bash","runuser":"root","runcwd":"/home/czanik","ttyname":"/dev/pts/0","submithost":"localhost.localdomain","submitcwd":"/home/czanik","runuid":0,"columns":118,"lines":60,"runargv":["/bin/bash"],"runenv":["LANG=en_US.UTF-8","HOSTNAME=localhost.localdomain","SHELL=/bin/bash","TERM=xterm-256color","PATH=/home/czanik/.local/bin:/home/czanik/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin","MAIL=/var/mail/root","LOGNAME=root","USER=root","HOME=/root","SUDO_COMMAND=/bin/bash","SUDO_USER=czanik","SUDO_UID=1000","SUDO_GID=1000"]}}}1.
你可以在 sudoers 文件中啟用 JSON 格式的日志信息:
Defaults log_format=json1.
你可以從我的 syslog-ng 博客中了解更多關(guān)于如何從 sudo 中使用 JSON 格式的日志信息。
2. 使用 sudo_logsrvd 集中收集日志
1.9.4 中另一個(gè)與日志相關(guān)的功能是使用 sudo_logsrvd 收集所有 sudo 日志信息(包括失敗的)。以前,系統(tǒng)只在 sudo_logsrvd 實(shí)際進(jìn)行記錄時(shí)記錄成功的會(huì)話(huà)。最后仍然默認(rèn)通過(guò) syslog 進(jìn)行記錄。
為什么這很重要?首先,你可以在一個(gè)地方收集任何與 sudo 有關(guān)的東西。無(wú)論是會(huì)話(huà)記錄還是所有相應(yīng)的日志信息。其次,它還可以保證正確記錄所有與 sudo 有關(guān)的事件,因?yàn)槿绻?sudo_logsrvd 無(wú)法訪問(wèn),sudo 可以拒絕執(zhí)行命令。
你可以在 sudoers 文件中通過(guò)以下設(shè)置啟用 sudo_logsrvd 日志記錄(當(dāng)然要替換 IP 地址):
Defaults log_format=json1.
如果你想要 JSON 格式的日志信息,你需要在 sudo_logsrvd 配置的 [eventlog] 部分進(jìn)行如下設(shè)置:
log_format = json1.
否則,sudo_logsrvd 使用傳統(tǒng)的 sudo 日志格式,并作了簡(jiǎn)單的修改。它還包括日志來(lái)源的主機(jī)的信息:
Nov 18 12:40:16 centos8splunk.localdomain sudo[21028]: czanik : 3 incorrect password attempts ; HOST=centos7sudo.localdomain ; TTY=pts/0 ; PWD=/home/czanik ; USER=root ; COMMAND=/bin/bash
Nov 18 12:40:23 centos8splunk.localdomain sudo[21028]: czanik : HOST=centos7sudo.localdomain ; TTY=pts/0 ; PWD=/home/czanik ; USER=root ; TSID=00000A ; COMMAND=/bin/bash
Nov 18 12:40:30 centos8splunk.localdomain sudo[21028]: czanik : command rejected by I/O plugin ; HOST=centos7sudo.localdomain ; TTY=pts/0 ; PWD=/home/czanik ; USER=root ; COMMAND=/bin/bash1.2.3.
3. 中繼
當(dāng)最初引入 sudo_logsrvd(1.9.0 版)進(jìn)行會(huì)話(huà)記錄集中收集時(shí),客戶(hù)端只能直接發(fā)送記錄。1.9.7 版本引入了中繼的概念。有了中繼,你可以不直接發(fā)送記錄,而是將記錄發(fā)送到多級(jí)中間主機(jī),這些中間主機(jī)構(gòu)成你的網(wǎng)絡(luò)。
為什么這很重要?首先,中繼使收集會(huì)話(huà)記錄成為可能,即使集中主機(jī)由于網(wǎng)絡(luò)問(wèn)題或維護(hù)而不可用。默認(rèn)情況下,sudo 在無(wú)法發(fā)送記錄時(shí)拒絕運(yùn)行,所以中繼可以確保你可以全天候使用 sudo。
其次,它還允許你對(duì)網(wǎng)絡(luò)有更嚴(yán)格的控制。你不需要為所有的主機(jī)向中心的 sudo_logsrvd 開(kāi)放防火墻,而只需要允許你的中繼通過(guò)。
最后,它允許你從沒(méi)有直接互聯(lián)網(wǎng)接入的網(wǎng)絡(luò)中收集會(huì)話(huà)記錄,比如 AWS 私有網(wǎng)絡(luò),你可以在網(wǎng)關(guān)主機(jī)上以中繼模式安裝 sudo_logsrvd。
當(dāng)你使用中繼時(shí),sudo 客戶(hù)端和中心的 sudo_logsrvd 的配置保持不變。在中繼主機(jī)上,在 sudo_logsrvd.conf 的 [relay] 部分添加以下一行:
relay_host = 172.16.167.1611.
如果知道通往中心服務(wù)器的網(wǎng)絡(luò)連接有問(wèn)題,你可以配置中繼,在轉(zhuǎn)發(fā)記錄之前儲(chǔ)存它:
store_first = true1.
4. 記錄子命令
你是否曾經(jīng)想知道在通過(guò) sudo 啟動(dòng)的 shell 會(huì)話(huà)中發(fā)生了什么?是的,會(huì)話(huà)記錄是存在的,但是為了看幾個(gè)命令的執(zhí)行情況而看幾個(gè)小時(shí)的記錄是很無(wú)聊的,也是對(duì)時(shí)間的巨大浪費(fèi)。幸運(yùn)的是,1.9.8 版本引入了子命令日志?,F(xiàn)在,只需定期檢查你的日志信息,并在發(fā)生可疑情況時(shí)才觀看記錄。
你甚至不需要一個(gè)允許 shell 訪問(wèn)的規(guī)則,只需要訪問(wèn)一個(gè)編輯器就可以訪問(wèn) shell。大多數(shù)編輯器可以運(yùn)行外部命令。我最喜歡的編輯器是 JOE,這是我通過(guò) sudo 啟動(dòng)它時(shí)可以看到的情況:
Aug 30 13:03:00 czplaptop sudo[10150]: czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/usr/bin/joe1.
不用吃驚,就在一個(gè)編輯器里,我生成一個(gè) shell 并從該 shell 中刪除一些文件和分區(qū)?,F(xiàn)在讓我們看看當(dāng)你啟用對(duì)子命令記錄時(shí)會(huì)發(fā)生什么:
Aug 30 13:13:14 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/usr/bin/joe
Aug 30 13:13:37 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/bin/sh -c /bin/bash
Aug 30 13:13:37 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/bin/bash
Aug 30 13:13:37 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/usr/bin/readlink /proc/10889/exe
[...]
Aug 30 13:13:37 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/usr/bin/sed -r s@/*:|([^\\\\]):@\1\n@g;H;x;s@/\n@\n@
Aug 30 13:13:37 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/usr/bin/tty
Aug 30 13:13:42 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/usr/bin/id
Aug 30 13:13:56 czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/usr/bin/ls -A -N --color=none -T 0 /usr/share/syslog-ng/include/scl/1.2.3.4.5.6.7.8.9.
我省略了幾十行以節(jié)省一些空間,但你仍然可以看到我啟動(dòng)了一個(gè) shell,bash_profile 執(zhí)行的命令也可以在日志中看到。
你可以在 sudoers 文件中使用以下設(shè)置來(lái)啟用子命令日志:
`Defaults log_subcmds`1.
在傳統(tǒng)的 sudo 日志中,你可以從 sudo 進(jìn)程 ID 看到這些日志正是來(lái)自同一個(gè) sudo會(huì)話(huà)。如果你打開(kāi) JSON 格式的日志,如前面所示,sudo 在日志中記錄了更多的信息,使之更容易進(jìn)行分析。
5. 攔截子命令
記錄子命令可以消除 sudo 的大部分隱患,但在有些情況下,你不只是想觀察正在發(fā)生的事情,還想控制事件的流程。例如,你需要給一個(gè)用戶(hù)提供 shell 權(quán)限,但仍想阻止他們運(yùn)行一個(gè)特定的命令。在這種情況下,攔截是理想的選擇。當(dāng)然,也有一些限制,比如你不能限制 shell 的內(nèi)置命令。
比方說(shuō),who 命令很危險(xiǎn)。你可以分兩步啟用攔截。第一個(gè)步驟是啟用它,第二個(gè)步驟是配置它。在這種情況下,我的用戶(hù)不被允許運(yùn)行 who:
Defaults intercept
czanik ALL = (ALL) ALL, !/usr/bin/who1.2.
當(dāng)我通過(guò)sudo 啟動(dòng)一個(gè) root shell 會(huì)話(huà)并嘗試運(yùn)行 who 時(shí),會(huì)發(fā)生以下情況:
$ sudo -s
# who
Sorry, user czanik is not allowed to execute '/usr/bin/who' as root on czplaptop.
bash: /usr/bin/who: Permission denied1.2.3.4.
你可以很容易地完全禁用運(yùn)行 shell:
Defaults intercept
Cmnd_Alias SHELLS=/usr/bin/bash, /usr/bin/sh, /usr/bin/csh
czanik ALL = (ALL) ALL, !SHELLS1.2.3.
這意味著你不能通過(guò) sudo 啟動(dòng) shell 會(huì)話(huà)。不僅如此,你也不能從編輯器中執(zhí)行外部命令。當(dāng)我試圖從 vi 中啟動(dòng) ls 命令時(shí),就會(huì)出現(xiàn)這種情況:
$ sudo vi /etc/issue
Sorry, user czanik is not allowed to execute '/bin/bash -c /bin/ls' as root on czplaptop.
Cannot execute shell /bin/bash
Press ENTER or type command to continue
分享標(biāo)題:2022年Sudo新增加的5個(gè)功能
文章地址:http://m.fisionsoft.com.cn/article/djdgpie.html


咨詢(xún)
建站咨詢(xún)
