為什麼將 sudo vim 訪問權限授予普通使用者有風險?
我想創建一個新使用者並給他 sudo 訪問權限。具體來說,我希望他使用
sudo vim
和編輯 httpd.conf。我在 sudoers 中寫了這個:user ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf
然而,我聽說這可能是有風險的。為什麼這是有問題的?問題有多嚴重?
儘管您限制了命令行參數,但沒有什麼可以阻止使用者使用 vim打開、編輯和覆蓋任何以 root 身份執行的隨機文件。
使用者可以執行
sudo vim /etc/httpd/conf/httpd.conf
然後
- 清除編輯緩衝區中的所有文本
- 然後為方便獲取現有文件(儘管這甚至不是必需的):例如 sudo 配置
:r /etc/sudoers
注意:除非受 SELinux 限制,否則使用者可以通過這種方式讀取任何文件!
- 授予自己更多的 sudo 權限
user ALL=(ALL) NOPASSWD: ALL
- 覆蓋舊配置
:w /etc/sudoers
我可以想像你的使用者現在可以通過幾十種類似的方式訪問、修改或破壞你的系統。
您甚至不會有審計跟踪哪些文件以這種方式更改,因為您只會看到他在 sudo 日誌消息中編輯您的 Apache 配置。這是授予
sudo
任何編輯者權限的安全風險。這或多或少與授予 sudo root 級別權限等命令的原因相同,
tar
並且unzip
通常是不安全的,沒有什麼能阻止您在存檔中包含系統二進製文件或系統配置文件的替換。正如許多其他評論員所指出的那樣,第二個風險是
vim
允許shell 轉義,您可以在 vim 中啟動一個允許您****執行任意命令的子 shell 。在您的 sudo vim 會話中,這些將以 root 身份執行,例如 shell 轉義:
:!/bin/bash
會給你一個互動式的 root shell:!/bin/rm -rf /
會在酒吧里寫出好故事。該怎麼做?
您仍然可以使用它
sudo
來允許使用者以安全的方式編輯他們不擁有的文件。在您的 sudoers 配置中,您可以設置一個特殊的保留命令
sudoedit
,後跟使用者可以編輯的文件的完整(萬用字元)路徑名:user ALL=(ALL) sudoedit /etc/httpd/conf/httpd.conf /etc/httpd/conf.d/*.conf
然後,使用者可以
-e
在他們的 sudo 命令行中使用該開關或使用以下sudoedit
命令:sudo -e /etc/httpd/conf/httpd.conf sudoedit /etc/httpd/conf/httpd.conf
如手冊頁中所述:
該
-e (edit)
選項表示使用者希望編輯一個或多個文件,而不是執行命令。在查詢安全策略時,使用字元串“sudoedit”代替命令。如果使用者被策略授權,則執行以下步驟:
- 臨時副本由要編輯的文件製成,所有者設置為呼叫使用者。
- 執行策略指定的編輯器來編輯臨時文件。sudoers 策略使用 SUDO_EDITOR、VISUAL 和 EDITOR 環境變數(按此順序)。
sudoers
如果沒有設置 SUDO_EDITOR、VISUAL 或 EDITOR,則使用編輯器(5) 選項中列出的第一個程序。- 如果它們已被修改,則將臨時文件複製回其原始位置並刪除臨時版本。
如果指定的文件不存在,則會創建它。
請注意,與 sudo 執行的大多數命令不同,編輯器在呼叫使用者的環境未修改的情況下執行。如果由於某種原因,sudo 無法使用其編輯版本更新文件,使用者將收到警告,並且編輯後的副本將保留在臨時文件中。
該
sudoers
手冊還有一個完整的部分,它如何使用和選項提供有限的外殼逃逸保護。RESRICT``NOEXEC
restrict
避免讓使用者訪問允許使用者執行任意命令的命令。許多編輯器具有禁用 shell 轉義的受限模式,儘管 sudoedit 是通過 sudo 執行編輯器的更好解決方案。由於提供 shell 轉義的程序數量眾多,因此將使用者限制在不提供 shell 轉義的程序集通常是行不通的。和
noexec
許多支持共享庫的系統能夠通過將環境變數(通常是 LD_PRELOAD)指向備用共享庫來覆蓋預設庫函式。在此類系統上,sudo 的 noexec 功能可用於防止 sudo 執行的程序執行任何其他程序。注意,
... ...
要為命令啟用 noexec,請使用
NOEXEC
上面使用者規範部分中記錄的標記。這又是那個例子:
aaron shanty = NOEXEC: /usr/bin/more, /usr/bin/vi
這允許使用者 aaron 執行
/usr/bin/more
並/usr/bin/vi
啟用 noexec。這將防止這兩個命令執行其他命令(例如 shell)。