SetUID權限設置不當,會給 linux 系統造成重大安全隱患。
前面的例子中,我們試驗了將 passwd 命令取消 SUID 權限,這會導致 passwd 命令的功能失效。那么,如果我們手動給默認無 SetUID 權限的系統命令賦予 SetUID 權限,會出現什么情況呢?
比如說,我們嘗試給 Vim 賦予 SetUID 權限:
[root@localhost ~]# chmod u+s /usr/bin/vim
[root@localhost ~]# 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 權限的惡意篡改呢?這里,給大家提供以下幾點建議:
關鍵目錄要嚴格控制寫權限,比如 "/"、"/usr" 等。
用戶的密碼設置要嚴格遵守密碼規范。
對系統中默認應該有 SetUID 權限的文件制作一張列表,定時檢査有沒有列表之外的文件被設置了 SetUID 權限。
前面 2 點不再做過多解釋,這里就最后一點,給大家提供一個腳本,僅供參考。
首先,在服務器第一次安裝完成后,馬上查找系統中所有擁有 SetUID 和 SetGID 權限的文件,把它們記錄下來,作為掃描的參考模板。如果某次掃描的結果和本次保存下來的模板不一致,就說明有文件被修改了 SetUID 和 SetGID 權限。命令如下:
[root@localhost ~]# find / -perm -4000 -o -perm -2000 > /root/suid.list
#-perm安裝權限査找。-4000對應的是SetUID權限,-2000對應的是SetGID權限
#-o是邏輯或"or"的意思。并把命令搜索的結果放在/root/suid.list文件中
接下來,只要定時掃描系統,然后和模板文件比對就可以了。腳本如下:
[root@localhost ~]#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
#刪除臨時文件
[root@localhost ~]# chmod u+s /bin/vi
#手工給vi加入SetUID權限
[root@localhost ~]# ./suidcheck.sh
#執行檢測腳本
[root@localhost ~]# cat suid_log_2013-01-20
/bin/vi isn't in listfile!
#報錯了,vi不在模板文件中。代表vi被修改了SetUID權限
這個腳本成功的關鍵在于模板文件是否正常。所以一定要安裝完系統就馬上建立模板文件,并保證模板文件的安全。
注意,除非特殊情況,否則不要手工修改 SetUID 和 SetGID 權限,這樣做非常不安全。而且就算我們做實驗修改了 SetUID 和 SetGID 權限,也要馬上修改回來,以免造成安全隱患。
SetGID 特殊權限的相關內容,下節會做詳細介紹。
新聞熱點
疑難解答