SetUID(SUID)千萬不要胡亂使用!

2020-07-16 10:04:46
SetUID許可權設定不當,會給 Linux 系統造成重大安全隱患。

前面的例子中,我們試驗了將 passwd 命令取消 SUID 許可權,這會導致 passwd 命令的功能失效。那麼,如果我們手動給預設無 SetUID 許可權的系統命令賦予 SetUID 許可權,會出現什麼情況呢?

比如說,我們嘗試給 Vim 賦予 SetUID 許可權:

[[email protected] ~]# chmod u+s /usr/bin/vim
[[email protected] ~]# ll /usr/bin/vim
-rwsr-xr-x. 1 root root 1847752 Apr 5 2012 /usr/bin/vim

此時你會發現,即便是普通使用者使用 vim 命令,都會暫時獲得 root 的身份和許可權,例如,很多原本普通使用者不能檢視和修改的檔案,竟然可以檢視了,以 /etc/passwd 和 /etc/shadow 檔案為例,普通使用者也可以將自己的 UID 手動修改為 0,這意味著,此使用者升級成為了超級使用者。除此之外,普通使用者還可以修改例如 /etc/inittab 和 /etc/fstab 這樣重要的系統檔案,可以輕易地使系統癱瘓。

其實,任何只有管理員可以執行的命令,如果被賦予了 SetUID 許可權,那麼後果都是災難性的。普通使用者可以隨時重新啟動伺服器、隨時關閉看得不順眼的服務、隨時新增其他普通使用者的伺服器,可以想象是什麼樣子。所以,SetUID 許可權不能隨便設定。

有讀者可能會問,如何防止他人(例如駭客)對 SetUID 許可權的惡意篡改呢?這裡,給大家提供以下幾點建議:
  1. 關鍵目錄要嚴格控制寫許可權,比如 "/"、"/usr" 等。
  2. 使用者的密碼設定要嚴格遵守密碼規範。
  3. 對系統中預設應該有 SetUID 許可權的檔案製作一張列表,定時檢査有沒有列表之外的檔案被設定了 SetUID 許可權。

前面 2 點不再做過多解釋,這裡就最後一點,給大家提供一個指令碼,僅供參考。

首先,在伺服器第一次安裝完成後,馬上查詢系統中所有擁有 SetUID 和 SetGID 許可權的檔案,把它們記錄下來,作為掃描的參考模板。如果某次掃描的結果和本次儲存下來的模板不一致,就說明有檔案被修改了 SetUID 和 SetGID 許可權。命令如下:

[[email protected] ~]# find / -perm -4000 -o -perm -2000 > /root/suid.list
#-perm安裝許可權査找。-4000對應的是SetUID許可權,-2000對應的是SetGID許可權
#-o是邏輯或"or"的意思。並把命令搜尋的結果放在/root/suid.list檔案中
接下來,只要定時掃描系統,然後和模板檔案比對就可以了。指令碼如下:
[[email protected] ~]#vi suidcheck.sh
#!/bin/bash
find / -perm -4000 -o -perm -2000 > /tmp/setuid.check
#搜尋系統中所有擁有SetUID和SetGID許可權的檔案,並儲存到臨時目錄中
for i in $(cat /tmp/setuid.check)
#迴圈,每次回圈都取出臨時檔案中的檔名
do
    grep $i /root/suid.list > /dev/null
    #比對這個檔名是否在模板檔案中
    if ["$?"!="o"]
    #檢測測上一條命令的返回值,如果不為0,則證明上一條命令報錯
    then
        echo "$i isn't in listfile! " >>/root/suid_log_$(date +%F)
        #如果檔名不在模板檔案中,則輸出錯誤資訊,並把報錯寫入紀錄檔中
    fi
done
rm -rf/tmp/setuid.check
#刪除臨時檔案
[[email protected] ~]# chmod u+s /bin/vi
#手工給vi加入SetUID許可權
[[email protected] ~]# ./suidcheck.sh
#執行檢測指令碼
[[email protected] ~]# cat suid_log_2013-01-20
/bin/vi isn't in listfile!
#報錯了,vi不在模板檔案中。代表vi被修改了SetUID許可權

這個指令碼成功的關鍵在於模板檔案是否正常。所以一定要安裝完系統就馬上建立模板檔案,並保證模板檔案的安全。

注意,除非特殊情況,否則不要手工修改 SetUID 和 SetGID 許可權,這樣做非常不安全。而且就算我們做實驗修改了 SetUID 和 SetGID 許可權,也要馬上修改回來,以免造成安全隱患。

SetGID 特殊許可權的相關內容,下節會做詳細介紹。