在Solaris中,文件除了讀、寫、執行權限外,還有一些特殊權限。Setuid和setgid是其中的一類。它與Solaris系統的安全關系緊密。 Setuid是指設置程序的有效的執行用戶身份(uid)為該文件的主人,而不是調用該程序的進程的uid。Setgid與之類似。Setuid和setgid用1s-1顯示出來為s權限,存在於主人和屬組的執行權限的位置上。 這種權限的設置方法如下: 只設setuid:chmod 4xxx filename(xxx為一般讀、寫、執行權限) 只設setgid:chmod 2xxx filename 同時設setuid 和setgid:chmod 6xxx filename 取消兩種權限:chmod 0xxx filename 這種權限怎麼用? 舉個例子來說,假如某一命令(程序)的主人是root用戶,並且該文件有setuid屬性,但是該文件的讀、寫、執行權限的屬性表明普通用戶user1可以執行該命令,那麼就表示:當user1執行該命令時,他具有root的執行身份,並獲得相應的權限。一旦該命令執行完成,root身份也隨之消失。 為什麼系統中需要有這樣的權限呢?請執行以下操作: 1 $1s-1*etc/shadow /bin/passwd -r-sr-sr-x 3 root sys 99792 1999 2月12 /bin/passwd -r-------- 1 root sys 261 1月3 13:12 /etc/shadow /etc/shadow文件由於存有用戶的加密口令信息,對系統的安全至關重要,因此權限很嚴,只有root憑其對系統的至高無上的權限才得以對/etc/shadow可讀可寫。但是系統必須允許普通用戶也能修改自己的口令。要讓他們對/etc/shadow可寫,又不能可讀,而且可寫又不能允許他們改別人的口令,怎麼辦?系統就采取這樣一個辦法:做一個程序,也就是/bin/passwd,通過它可以在不顯示文件內容的情況下直接修改/etc/shadow文件,可這個程序怎麼能有這樣的權限?因為系統賦予它setuid權限,而且它屬於root.這樣,用戶在使用/bin/passwd改口令時就有root權限,由於/bin/passwd命令本身功能的局限性,用戶並不能用它做更多的不利於系統安全的事。 2用普通用戶身份修改口令 $ passwd Enter login passWord:**** New password:****** Re-enter new password:****** Passwd (SYSTEM):passwd sUCcessfully changed for xxx. 可以成功。 3 用超級用戶修改/bin/passwd # chmod 0555 /bin/passwd 4 再重復2,是否還成功?當然不。 5把/bin/passwd的權限恢復原狀。 # chmod 6555 /bin/passwd 對此可以打一個生動的比喻:有一個絕密機關,不得已必須有一些不能見這些秘密的人進來做一些事情。於是授權一些特殊的"車輛"(沒有窗戶,門緊閉,所以看不到外面。只有一個小洞允許乘坐的人伸出一只手臂),帶著所乘坐的人開到要去的地方,允許它辦完事情馬上帶他出來。這樣是不是很安全?不一定。如果"車輛"沒有經過精挑細選而是有很多"門窗",那系統可就危險了。 這種安全威脅在Solaris中也有可能出現。 比如做一下下面這個實驗: 6$ vi/etc/shadow /etc/shadow: Permission denied. 7用超級用戶身份 # chmod 6555 /bin/vi # chown root /bin/vi 8這次再用普通用戶身份試一試第6步,有什麼結果?這次你能以普通用戶身份修改/etc/shadow了!!但是 $ more/etc/shadow仍然不成功,說明在執行/bin/passwd時有超級用戶權限,平均仍是普通用戶身份。 再來看一下令人不安的情況: 9用超級用戶身份 # chmod 6555 /bin/ksh # chown root /bin/ksh 10用普通用戶身份 $ ksh # 發生了什麼情況?普通用戶不需要root口令就變成了root!!! 好可怕。如果有一個用戶曾有一次獲得超級用戶權限,並通過類似的方式給自己設置了後門(也可能放了一個類似的文件在他自己的家目錄中),以後他就可以隨時變成超級用戶了。 怎麼能避免setuid的不安全影響,又利用其方便的地方?這裡有幾點建議: 1關鍵目錄應嚴格控制寫權限。比如/,/usr等。 2對不管是root帳號還是普通用戶帳號的保密都有足夠的重視。最好不要設置類似於guest、public、test之類公用的容易猜出口令的帳號。 3對系統中應該具有setuid權限的文件作一列表,定時檢查有沒有這之外的文件被設置了setuid權限。 下面有一個自己編的小程序與大家分享。 程序功能描述:檢查有沒有/usr/secu/masterlist文件記錄之外的其它文件被設置了setuid權限。 事先要求:在系統調試完成,所有需要安裝的軟件安裝好以後,執行下面命令生成檢查對照文件。 #mkdir -p / usr/secu #find / -perm -4000 -print>/usr/secu/masterlist 程序: cd /tmp [-f secrcheck] && rm secrcheck find / -perm -4000 -print>secrcheck for f in'catsecrcheck' do grep -w$ f /usr/secu/masterlist>/dev/null if ["$ ?"! = "0"];then echo $ f is not in list fi done rm secrcheck 在需要對系統做檢查時,執行本shell程序。也可以放在定時進程中定時檢查。程序由於需要在整個文件系統中做查找操作,需要比較長的時間。