1. 程式人生 > 實用技巧 >特殊許可權SUID、SGID和sticky功能的介紹及其應用

特殊許可權SUID、SGID和sticky功能的介紹及其應用

SUID的介紹

我們知道當我們以某一個使用者去執行二進位制程式時,就會相應的產生一個程序,而這個程序也有屬主和屬組,預設這個程序的屬主和屬組為當前使用者和當前使用者的基本組。

但是不知道有沒有人發現到/etc/shadow這個檔案的屬主和屬組都是root,但是這個檔案的許可權為rw-------,也就是說只有root使用者才有讀和寫的許可權,其他使用者什麼許可權也沒有。但是我們知道

/etc/shadow這個檔案裡面存放的是系統上所有使用者的密碼相關資訊,其它使用者卻可以使用passwd這個命令來為自身使用者修改密碼,並最終儲存在/etc/shadow這個檔案中。這又是怎麼回事呢?

wKiom1OoJ-jRc35pAAFIK3x9gqw309.jpg

由上圖可以看出/usr/bin/passwd這個檔案的許可權為rwsr-xr-x,那麼這個s代表的是什麼呢?

s代表的是一個特殊許可權位,當s出現在檔案屬主的執行許可權位上時,就表示為SUID;如果s出現在檔案屬組的執行許可權位上表示為SGID。那麼什麼是SUID和SGID呢?

SUID:就是當某使用者執行二進位制程式時,當前使用者或暫時獲取這個二進位制檔案屬主的許可權。

因此,當某一個二進位制檔案具有SUID許可權時,在執行該二進位制程式時,當前使用者將暫時具有這個二進位制檔案屬主的許可權。所以當我們使用passwd命令時,當前使用者將暫時獲得passwd這個二進位制檔案屬主的許可權,因此當前使用者可以將密碼寫入到/etc/shadow檔案中。

注意:當某個二進位制檔案的屬主和屬組的執行許可權位沒有時,使用了特殊許可權位就會顯示S;如果該許可權位上執行有許可權(x)時,則顯示為s.


如何給某個檔案加上特殊許可權位呢?
給某個檔案加上或減掉SUID許可權

chmod u[+|-]s FILE

給某個檔案加上或減掉SGID許可權

chmod g[+|-]s FILE

例如:

wKiom1OuIZChJ46tAAPIZUqqFfs024.jpg


關於SUID的功能總結:

1、SUID只對二進位制程式有效,對於一般檔案和目錄無效。

2、SUID許可權只在使用者執行該二進位制程式過程中有效。

3、使用SUID許可權時,當前使用者將會暫時擁有該二進位制程式本身屬主的許可權。

SGID介紹

接下來在介紹什麼是SGID?

SGID:當前使用者在執行二進位制程式的時候,其將獲得二進位制程式屬組的支援。

同樣的,如何給檔案加上或剪掉SGID的許可權呢?

chmod g[+|-] s FILE

對於二進位制程式使用SGID的使用不在此說明,原理同SUID。


從上面知道,SUID只對二進位制程式生效,而SGID既可以對二進位制檔案生效,也可以作用於目錄。

因此,可以將目錄設定具有SGID的許可權。

如果某個目錄具有SGID的許可權,那麼在該目錄下建立的檔案的屬組和父目錄的屬組一樣。

情景模擬:假設某一個開發團隊,有aa和bb這兩個使用者,這兩個使用者建立的檔案全部存放在/dir目錄下。設這個目錄的屬組為hello。如果設定這個目錄,使得aa和bb建立的檔案可以相互訪問和修改,並且不允許其他使用者的訪問?

1、修改/dir目錄的屬組為hello,且給這個目錄許可權設定為770。

# groupadd hello

# mkdir /dir

# chgrp hello /dir

# chmod 770 /dir

2、建立使用者aa和bb,且其附加組為hello

# useradd -G hello aa

# useradd -G hello bb

這樣aa和bb在/dir目錄下都可以建立檔案了。

3、給目錄/dir設定SGID許可權

# chmod g+s /dir
# ls -ld /dir
drwxrws---. 2 root hello 4096 Aug 31 00:27 /dir

4、使用aa使用者在/dir目錄下建立檔案為aa.txt

# su - aa

$cd /dir

$vim aa.txt

hello,aa

$ls -l aa.txt

-rw-rw-r--. 1 aa hello 9 Aug 31 00:34 aa.txt

//看看,建立的許可權為664,且屬組為hello。由於bb也是hello這個組的成員,因此使用者bb是可以對這個使用者進行編輯的。

5、使用使用者bb對aa.txt檔案進行編輯

# su - bb

$cd /dir

$vim aa.txt

hello,aa
hi,I am bb

$ cat aa.txt
hello,aa
hi,I am bb

同樣,使用使用者bb在/dir目錄下建立的檔案,也可以被使用者aa進行編輯,這樣就實現了aa和bb建立的檔案可以相互修改和訪問,且其他使用者不能訪問和修改。這就是利用目錄的SGID許可權來實現的。


關於SGID許可權的功能:

1、對於檔案具有SGID許可權而言:

只對二進位制程式有效。

SGID許可權只在二進位制程式執行過程中有效。

執行二進位制程式時,當前使用者將獲得該二進位制程式屬組的支援。

2、對於目錄具有SGID的許可權來說:

如果使用者對該目錄有r和x許可權,表示該使用者可以進入到此目錄下。

如果該使用者對此目錄有w許可權,則在該目錄下建立的檔案其屬組和當前目錄的屬組是一樣的。


sticky特性

從上面我們知道,當某一個目錄具有SGID的許可權後,在該目錄下的檔案使用者彼此之間可以相互訪問和修改,但是也可以刪除不是自己的檔案,如何防止別人刪除自己的檔案呢?(除root使用者除外)。

只要給目錄加上sticky特性即可。那什麼是sticky特性呢?

sticky:在一個公共目錄下,每一個使用者只能刪除自己的檔案,而不是刪除別人的檔案。

sticky特性設定在其他使用者的許可權位上(即other許可權位上)。那如何設定sticky特性呢?

chmod o[+|-]t directory

wKiom1OucFCBHoEHAALyszxuPiQ749.jpg

sticky特性只對目錄有效

如果other許可權位上面沒有x許可權時,如果使用了sticky功能,那麼顯示的將是T,而不是t。


既然SUID、SGID、sticky是一種特殊許可權,那麼必然也有和普通許可權位一樣,也會有一個八進位制位與之對應。

SUID:八進位制許可權位為4

SGID:八進位制許可權位為2

sticky:八進位制許可權位為1

注意:特殊許可權位一般在普通許可權位的前面

例如:chmod 5775 /test

最前面的5表示特殊許可權位,因此/test目錄同時具有SUID和sticky的特殊許可權。

轉載於:https://blog.51cto.com/xslwahaha/1429646