Linux中國

2022 年 5 個新 sudo 功能

當你想授予你的一些用戶管理許可權,同時控制和檢查他們在你的系統上做什麼時,你會使用 sudo。然而,即使是 sudo',也有相當多不可控的地方,想想給予 shell 許可權的情況就知道了。最近的 sudo 版本增加了一些功能,可以讓你看到這些問題,甚至控制它們。例如,你可以啟用更詳細、更容易處理的日誌信息,並記錄 shell 會話中執行的每個命令。

這些功能中有些是全新的。有些是出現在 1.9.0 甚至更早的版本中的功能。例如,sudo 可以記錄終端上發生的一切,即使是在 1.8 版本。然而,系統將這些記錄保存在本地,它們很容易被刪除,特別是那些記錄最有用的地方:Shell 會話。1.9.0 版本增加了會話記錄集中收集,因此記錄不能被本地用戶刪除,最近的版本還增加了中繼功能,使收集功能更加強大。

如果你只知道 sudo 的基礎知識,或者以前只使用過 1.8 版本,我建議你閱讀我以前的 文章

1、JSON 格式的日誌記錄

我想介紹的第一個新功能是 JSON 格式的日誌記錄。我是一個日誌狂熱者(12 年前我就開始在 syslog-ng 項目上工作),而這個功能是我在這裡發表文章後引入的第一個功能。啟用後,sudo 記錄了更多的信息,並且以一種更容易解析的方式進行。

傳統的 syslog 信息很短,只包含最小的必要信息量。這是由於舊的 syslog 實現的限制。超過 1k 大小的信息被丟棄或截斷。

Jan 28 13:56:27 localhost.localdomain sudo[10419]: czanik : TTY=pts/0 ; PWD=/home/czanik ; USER=root ; COMMAND=/bin/bash

最近的 syslog 實現可以處理更大的信息量。syslog-ng 默認接受 64k 大小的日誌信息(當然,它可以更小或更大,取決於實際配置)。

同樣的事件,如果以 JSON 格式記錄,就會包含更多的信息。更多並不意味著更難處理。JSON 格式的信息更容易被許多日誌管理軟體應用解析。下面是一個例子:

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"]}}}

你可以在 sudoers 文件中啟用 JSON 格式的日誌信息:

Defaults log_format=json

你可以從我的 syslog-ng 博客中了解更多關於如何從 sudo 中使用 JSON 格式的日誌信息。

2、使用 sudo_logsrvd 集中收集日誌

1.9.4 中另一個與日誌相關的功能是使用 sudo_logsrvd 收集所有 sudo 日誌信息(包括失敗的)。以前,系統只在 sudo_logsrvd 實際進行記錄時記錄成功的會話。最後仍然默認通過 syslog 進行記錄。

為什麼這很重要?首先,你可以在一個地方收集任何與 sudo 有關的東西。無論是會話記錄還是所有相應的日誌信息。其次,它還可以保證正確記錄所有與 sudo 有關的事件,因為如果 sudo_logsrvd 無法訪問,sudo 可以拒絕執行命令。

你可以在 sudoers 文件中通過以下設置啟用 sudo_logsrvd 日誌記錄(當然要替換 IP 地址):

Defaults log_servers=172.16.167.150

如果你想要 JSON 格式的日誌信息,你需要在 sudo_logsrvd 配置的 [eventlog] 部分進行如下設置:

log_format = json

否則,sudo_logsrvd 使用傳統的 sudo 日誌格式,並作了簡單的修改。它還包括日誌來源的主機的信息:

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/bash

3、中繼

當最初引入 sudo_logsrvd(1.9.0 版)進行會話記錄集中收集時,客戶端只能直接發送記錄。1.9.7 版本引入了中繼的概念。有了中繼,你可以不直接發送記錄,而是將記錄發送到多級中間主機,這些中間主機構成你的網路。

為什麼這很重要?首先,中繼使收集會話記錄成為可能,即使集中主機由於網路問題或維護而不可用。默認情況下,sudo 在無法發送記錄時拒絕運行,所以中繼可以確保你可以全天候使用 sudo

其次,它還允許你對網路有更嚴格的控制。你不需要為所有的主機向中心的 sudo_logsrvd 開放防火牆,而只需要允許你的中繼通過。

最後,它允許你從沒有直接互聯網接入的網路中收集會話記錄,比如 AWS 私有網路,你可以在網關主機上以中繼模式安裝 sudo_logsrvd

當你使用中繼時,sudo 客戶端和中心的 sudo_logsrvd 的配置保持不變。在中繼主機上,在 sudo_logsrvd.conf[relay] 部分添加以下一行:

relay_host = 172.16.167.161

如果知道通往中心伺服器的網路連接有問題,你可以配置中繼,在轉發記錄之前儲存它:

store_first = true

4、記錄子命令

你是否曾經想知道在通過 sudo 啟動的 shell 會話中發生了什麼?是的,會話記錄是存在的,但是為了看幾個命令的執行情況而看幾個小時的記錄是很無聊的,也是對時間的巨大浪費。幸運的是,1.9.8 版本引入了子命令日誌。現在,只需定期檢查你的日誌信息,並在發生可疑情況時才觀看記錄。

你甚至不需要一個允許 shell 訪問的規則,只需要訪問一個編輯器就可以訪問 shell。大多數編輯器可以運行外部命令。我最喜歡的編輯器是 JOE,這是我通過 sudo 啟動它時可以看到的情況:

Aug 30 13:03:00 czplaptop sudo[10150]:   czanik : TTY=pts/1 ; PWD=/home/czanik ; USER=root ; COMMAND=/usr/bin/joe

不用吃驚,就在一個編輯器里,我生成一個 shell 並從該 shell 中刪除一些文件和分區。現在讓我們看看當你啟用對子命令記錄時會發生什麼:

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@/*:|([^\\]):@1n@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/

我省略了幾十行以節省一些空間,但你仍然可以看到我啟動了一個 shell,bash_profile 執行的命令也可以在日誌中看到。

你可以在 sudoers 文件中使用以下設置來啟用子命令日誌:

`Defaults log_subcmds`

在傳統的 sudo 日誌中,你可以從 sudo 進程 ID 看到這些日誌正是來自同一個 sudo會話。如果你打開 JSON 格式的日誌,如前面所示,sudo 在日誌中記錄了更多的信息,使之更容易進行分析。

5、攔截子命令

記錄子命令可以消除 sudo 的大部分隱患,但在有些情況下,你不只是想觀察正在發生的事情,還想控制事件的流程。例如,你需要給一個用戶提供 shell 許可權,但仍想阻止他們運行一個特定的命令。在這種情況下,攔截是理想的選擇。當然,也有一些限制,比如你不能限制 shell 的內置命令。

比方說,who 命令很危險。你可以分兩步啟用攔截。第一個步驟是啟用它,第二個步驟是配置它。在這種情況下,我的用戶不被允許運行 who

Defaults intercept
czanik ALL = (ALL) ALL, !/usr/bin/who

當我通過sudo 啟動一個 root shell 會話並嘗試運行 who 時,會發生以下情況:

$ sudo -s
# who
Sorry, user czanik is not allowed to execute '/usr/bin/who' as root on czplaptop.
bash: /usr/bin/who: Permission denied

你可以很容易地完全禁用運行 shell:

Defaults intercept
Cmnd_Alias SHELLS=/usr/bin/bash, /usr/bin/sh, /usr/bin/csh
czanik ALL = (ALL) ALL, !SHELLS

這意味著你不能通過 sudo 啟動 shell 會話。不僅如此,你也不能從編輯器中執行外部命令。當我試圖從 vi 中啟動 ls 命令時,就會出現這種情況:

$ 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

接下來是什麼?

我希望讀了我的文章後,自己嘗試一下這些新功能。你可以通過你的軟體包管理器在許多 Linux 發行版和 UNIX 變種上安裝最新的 sudo,或者使用 Sudo 網站 上的二進位安裝程序。

這篇文章只是為你提供了一個新的可能性的概述。如果你想了解更多關於這些功能的信息,請訪問網站,那裡有手冊頁面,也有 Sudo 博客

via: https://opensource.com/article/22/2/new-sudo-features-2022

作者:Peter Czanik 選題:lujun9972 譯者:wxy 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國