我們在前面曾經提到過s u i d和g u i d。這種權限位近年來成為一個棘手的問題。很多系統供應商不允許實現這一位,或者即使它被置位,也完全忽略它的存在,因為它會帶來安全性風險。那么人們為何如此大驚小怪呢?
s u i d意味着如果某個用戶對屬於自己的s h e l l腳本設置了這種權限,那么其他用戶在執行這一腳本時也會具有其屬主的相應權限。於是,如果根用戶的某一個腳本設置了這樣的權限,那么其他普通用戶在執行它的期間也同樣具有根用戶的權限。同樣的原則也適用於g u i d,執行相應腳本的用戶將具有該文件所屬用戶組中用戶的權限。
為什么要使用這種類型的腳本?這里有一個很好的例子。我管理着幾個大型的數據庫系統,而對它們進行備份需要有系統管理權限。我寫了幾個腳本,並設置了它們的g u i d,這樣我指定的一些用戶只要執行這些腳本就能夠完成相應的工作,而無須以數據庫管理員的身份登錄,以免不小心破壞了數據庫服務器。通過執行這些腳本,他們可以完成數據庫備份及其他管理任務,但是在這些腳本運行結束之后,他們就又回復到他們作為普通用戶的權限。
有相當一些U N I X命令也設置了s u i d和g u i d。如果想找出這些命令,可以進入/ b i n或/ s b i n目錄,執行下面的命令:
$ ls -l | grep '^...s'
上面的命令是用來查找s u i d文件的;
$ ls -l | grep '^...s..s'
上面的命令是用來查找s u i d和g u i d的。
現在我們明白了什么是s u i d,可是如何設置它呢?下面就來介紹這個問題。如果希望設置s u i d,那么就將相應的權限位之前的那一位設置為4;如果希望設置g u i d,那么就將相應的權限位之前的那一位設置為2;如果希望兩者都置位,那么將相應的權限位之前的那一位設置為4+2。
一旦設置了這一位,一個s將出現在x的位置上。記住:在設置s u i d或g u i d的同時,相應的執行權限位必須要被設置。例如,如果希望設置g u i d,那么必須要讓該用戶組具有執行權限。
如果想要對文件l o g i n設置s u i d,它當前所具有的權限為rwx rw- r-- (741),需要在使用c h m o d命令時在該權限數字的前面加上一個4,即chmod 4741,這將使該文件的權限變為r w srw- r - -。
$ chmod 4741 logit
設置suid/guid的例子
下面給出幾個例子:
表1-7 設置s u i d / g u i d
還可以使用符號方式來設置s u i d / g u i d。如果某個文件具有這樣的權限: rwx r-x r- x,那么可以這樣設置其s u i d:
chmod u+s <filename>
於是該文件的權限將變為: rws r-x r-x
在查找設置了s u i d的文件時,沒准會看到具有這樣權限的文件:rwS r-x r- x,其中S為大寫。
它表示相應的執行權限位並未被設置,這是一種沒有什么用處的s u i d設置,可以忽略它的存在。
注意,c h m o d命令不進行必要的完整性檢查,可以給某一個沒用的文件賦予任何權限,但chmod 命令並不會對所設置的權限組合做什么檢查。因此,不要看到一個文件具有執行權限,就認為它一定是一個程序或腳本。