1. 程式人生 > >linux中SUID,SGID和SBIT的奇妙用途

linux中SUID,SGID和SBIT的奇妙用途

     linux對檔案的許可權管理簡直是讓人歎為觀止,又回顧了一下SUID,SGID和SBIT的作用,總結一下。

     SUID是Set UID的簡稱,翻譯過來是設定使用者ID,感覺很彆扭,還是覺得SUID最為簡煉。它會出現在檔案擁有者許可權的執行位上,具有這種許可權的檔案會在其執行時,使呼叫者暫時獲得該檔案擁有者的許可權。例如,使用如下命令:

ls -l /usr/bin/passwd

我們會得到如下的結果:
-rwsr-xr-x 1 root root 42824 Sep 13  2012 /usr/bin/passwd

可以看到,在檔案擁有者的執行位上出現為s而不是x,所以說passwd這個程式是具有SUID許可權的。我們直到在修改使用者密碼的時候,用的就是passwd這個命令,而我們又知道在linux下面,使用者密碼是儲存在/etc/shadow這個檔案裡面的。首先檢視一下/etc/shadow這個檔案的許可權:
ls -l /etc/shadow

返回的結果如下:
-rw-r----- 1 root shadow 1138 Dec 13 20:00 /etc/shadow

由上面的結果,我們知道只有root可以往shadow檔案中寫入資料,其他使用者連檢視的許可權都沒有。那我們平時是怎麼修改密碼呢?沒錯,就是和SUID有關。當我們使用passwd命令時,就獲得了passwd的所有者即root的許可權,進而可以對shadow檔案進行寫入操作。使用SUID肯定滿足一下幾點:
1.SUID只對二進位制檔案有效
2.呼叫者對該檔案有執行權
3.在執行過程中,呼叫者會暫時獲得該檔案的所有者許可權
4.該許可權只在程式執行的過程中有效

《鳥哥的linux私房菜》中,有一張圖特別能表示這個意思:

     SGID即Set GID的縮寫,它出現在檔案所屬組許可權的執行位上面,它對普通二進位制檔案和目錄都有效。當它作用於普通檔案時,和SUID類似,在執行該檔案時,使用者將獲得該檔案所屬組的許可權。當SGID作用於目錄時,意義就非常重大了。當用戶對某一目錄有寫和執行許可權時,該使用者就可以在該目錄下建立檔案,如果該目錄用SGID修飾,則該使用者在這個目錄下建立的檔案都是屬於這個目錄所屬的組。

     SBIT即Sticky Bit,它出現在其他使用者許可權的執行位上,它只能用來修飾一個目錄。當某一個目錄擁有SBIT許可權時,則任何一個能夠在這個目錄下建立檔案的使用者,該使用者在這個目錄下所建立的檔案,只有該使用者自己和root可以刪除,其他使用者均不可以。例如:

ls -ld /tmp

可以得到以下結果:
drwxrwxrwt 12 root root 12288 Dec 17 16:33 /tmp

可以看到最後一位為t,這說明/tmp檔案就是這種檔案。

     那麼,如何設定上面所說的三種許可權呢?首先來介紹一點預備的知識,用數字來表示許可權:

4表示SUID
2表示SGID
1表示SBIT

如果兩個或三個許可權同時存在時,就將者寫許可權的值相加就是需要的結果了。利於SUID和SGID同時存在,則為6。下面可以看一下修改的例子:
chmod 4777 test

使test檔案具有SUID許可權,你可能已經看明白了,就是在普通檔案許可權前面再加上這些特殊許可權值就可以了。