1. 程式人生 > >Linux許可權管理 檔案特殊許可權

Linux許可權管理 檔案特殊許可權

除了我們前面介紹的rwx許可權外,Linux中還有另外三種特殊許可權:SUID,SGID,SBIT

  許可權    執行條件 執行示例
SUID

s出現在檔案所有者的x許可權上。

1. SUID只能用於二進位制可執行檔案,對目錄無效

2. 執行者若具有該檔案的x許可權,則將具有檔案所有者的許可權

3. 許可權只在檔案執行時有效,執行完畢不再擁有所有者許可權

chmod u+s test #為test檔案加上suid許可權

chmod 4777 test #為test檔案加上suid許可權

 

SGID

s出現在檔案所屬群組的x許可權上。

SGID和SUID不同,可以用於目錄

1. 使用者若有此目錄的x,w許可權,則可進入和修改此目錄

2. 使用者在此目錄下的群組將變成該目錄的群組,

    新建的檔案,群組是此目錄的群組。

SGID對於檔案來說

1. SGID只對二進位制可執行檔案有效

2. 執行者若具有該檔案的x許可權,則將具有檔案所屬群組的許可權

3. 許可權只在檔案執行時有效,執行完畢不再擁有所屬群組許可權

chmod g+s test #為test檔案加上sgid許可權

chmod 2777 test #為test檔案加上sgid許可權

SBIT

 t出現在檔案其他使用者的x許可權上。

1. 和SUID,SGID不同的是,只能用於目錄

2. 使用者在該目錄下,僅自己與root才有權力刪除新建的目錄或檔案

 

chmod o+t test #為test檔案加上sbit許可權

chmod 1777 test #為test檔案加上sbit許可權

使用SUID特殊許可權

在 Linux 系統中我們已經學習過 r(讀)、w(寫)、 x(執行)這三種檔案普通許可權,但是我們在査詢系統檔案許可權時會發現出現了一些其他許可權字母,比如:

[[email protected] ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10  2014 /usr/bin/passwd

可以看見在屬主本來應該寫 x(執行)許可權的位置出現了一個小寫 s,我們把這種許可權稱作 SetUID 許可權,也叫作SUID 的特殊許可權。

我們知道,在 Linux 系統中,每個普通使用者都可以更改自己的密碼,這是合理的設定。問題是,普通使用者的資訊儲存在 /etc/passwd 檔案中,使用者的密碼實際儲存在 /etc/shadow 檔案中,也就是說,普通使用者在更改自己的密碼時修改了 /etc/shadow 檔案中的加密密碼,但是,看下面的程式碼:

[[email protected] ~]# ll /etc/passwd
-rw-r--r--. 1 root root 2282 Nov  5 20:19 /etc/passwd
[[email protected] ~]# ll /etc/shadow
----------. 1 root root 1266 Nov  5 20:19 /etc/shadow

/etc/passwd 檔案的許可權是 644,意味著只有超級使用者 root 可以讀/寫,普通使用者只有只讀許可權。

/etc/shadow 檔案的許可權是 000,也就是沒有任何許可權。意味著只有超級使用者可以讀取檔案內容,並且可以強制修改檔案內容;而普通使用者沒有任何針對 /etc/shadow 檔案的許可權。

換句話說,普通使用者對這兩個檔案其實都是沒有寫許可權的,那為什麼普通使用者可以修改自己的許可權呢?

其實,普通使用者可以修改自己的密碼的祕密不在於 /etc/passwd 和 /etc/shadow 這兩個檔案,而在於 passwd 命令。我們再來看看 passwd 命令的許可權:

[[email protected] ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10  2014 /usr/bin/passwd

passwd 命令擁有特殊許可權 SetUID,也就是在屬主的許可權位的執行許可權上是 s。可以這樣來理解它:當一個具有執行許可權的檔案設定 SetUID 許可權後,使用者在執行這個檔案時將以檔案所有者的身份來執行。passwd 命令擁有 SetUID 許可權,所有者為 root(Linux 中的命令預設所有者都是 root),也就是說,當普通使用者使用 passwd 命令更改自己的密碼的時候,實際上是在用 passwd 命令所有者 root 的身份在執行 passwd 命令,root 當然可以將密碼寫入 /etc/shadow 檔案,所以普通使用者也可以修改 /etc/shadow 檔案,命令執行完成後,該身份也隨之消失。

舉個例子,有一個使用者 zhangsan,他可以修改自己的許可權,因為 passwd 命令擁有 SetUID 許可權;但是他不能査看 /etc/shadow 檔案的內容,因為査看檔案的命令(如 cat)沒有 SetUID 許可權。命令如下:

[[email protected] ~]# su - zhangsan
[[email protected] ~]$ passwd
更改使用者zhangsan的密碼。
為zhangsan更改STRESS密碼。
(當前)UNIX密碼:
新的密碼:
重新輸入新的密碼:
passwd:所有的身份驗證令牌已經成功更新
[[email protected] ~]$ cat /etc/shadow
cat:/etc/shadow:許可權不夠

 說明:passwd 是系統命令,可以執行,所以可以賦予 SetUID 許可權。

當zhangsan使用者執行passwd命令時:

           zhangsan使用者對 passwd 命令擁有 x(執行)許可權。

           zhangsan使用者在執行 passwd 命令的過程中,會暫時切換為 root 身份,所以可以修改 /etc/shadow 檔案。

           命令結束,zhangsan 使用者切換回自己的身份。

           cat 命令沒有 SetUID 許可權,所以就使用 zhangsan使用者身份去訪問 /etc/shadow 檔案,當然沒有相應許可權了。

如果把 /usr/bin/passwd 命令的 SetUID 許可權取消,普通使用者是不是就不能修改自己的密碼:

[[email protected] ~]# chmod u-s /usr/bin/passwd
[[email protected] ~]# ll /usr/bin/passwd
-rwxr-xr-x.1 root root 2289656 Jun 10  2014/usr/bin/passwd
[[email protected] ~]# su -zhangsan
[[email protected] ~]$ passwd
更改使用者zhangsan的密碼。
為zhangsan更改STRESS密碼。
(當前)UNIX密碼:
新的密碼:
重新輸入新的密碼:
passwd:鑑定令牌操作錯誤

最後提示passwd:鑑定令牌操作錯誤,所以最後密碼沒有生效

剛剛把系統命令本身擁有的 SetUID 許可權取消,這樣會導致命令本身可以執行的功能失效。但是如果給預設沒有 SetUID 許可權的系統命令賦予了 SetUID 許可權的話系統就會出現重大安全隱患,這種操作一定不要隨意執行,例如 給vim新增SetUID許可權

[[email protected] ~]# chmod u+s /usr/bin/vim
[[email protected] ~]# ll /usr/bin/vim
-rwsr-xr-x 1 root root 2289656 Jun 10  2014 /usr/bin/vim

當 vim 命令擁有了 SetUID 許可權後,任何普通使用者在使用 vim 命令時,都會暫時獲得 root 的身份和許可權,很多普通使用者本身不能査看和修改的檔案馬上就可以査看了,包括 /etc/passwdf 和 /etc/shadow 這兩個重要的使用者資訊檔案,這樣我就可以輕易地把自己的 UID 改為 0,升級為超級使用者了。如果我修改了系統重要的啟動檔案,比如 /etc/inittab 或 /etc/fstab,就可以輕易地導致系統癱瘓。

其實任何只有管理員可以執行的命令,如果被賦予了 SetUID 許可權,那麼普通使用者都可以執行它進行相應的操作。大家可以想象普通使用者可以隨時重啟伺服器、隨時關閉看得不順眼的服務。所以,SetUID 許可權不能隨便設定,同時要防止黑客的惡意修改 

使用SGID特殊許可權

當 s 標誌在屬主的 x 位置時是 SetUID, s 標誌在屬組的 x 位置時是 SetGID,簡稱為SGID。比如:

[[email protected] ~]# ll /usr/bin/locate
-rwx--s--x. 1 root slocate 40496 Jun 10  2014 /usr/bin/locate

 

和 passwd 命令類似,普通使用者在執行 locate 命令的時候,會獲取 locate 屬組的組身份。locate 命令是在系統中按照檔名査找符合條件的檔案的,不過它不是直接搜尋系統的,而是搜尋 /var/lib/mlocate/mlocate.db 這個資料庫的。我們來看看這個資料庫的許可權。

[[email protected] ~]# ll /var/lib/mlocate/mlocate.db
-rw-r-----. 1 root slocate 2514205 Nov 17 09:49 /var/lib/mlocate/mlocate.db

大家會發現,屬主許可權是 r、w,屬組許可權是 r,其他人的許可權是 0。

說明:

當zhangsan使用者執行locate命令時:

 1. /usr/bin/locate 是可執行二進位制程式,可以被賦予 SetGID 許可權。

2. 執行使用者 zhangsan 對 locate 命令擁有執行許可權。

3. 執行 locate 命令時,組身份會升級為 slocate 組,而 slocate 組對 /var/lib/mlocate/mlocate.db 資料庫擁有 r 許可權,所以普通使用者可以使用 locate 命令査詢 mlocate.db 資料庫。

4. 命令結束,zhangsan 使用者的組身份返回為 zhangsan 組。

使用SBIT特殊許可權

當 t 標誌在其他人的 x 位置時是 Stick BIT(粘著位),簡稱為SBIT。比如:

[[email protected] ~]# ll -d /tmp
drwxrwxrwt. 19 root root 4096 Nov 17 16:10 /tmp

預設系統中 /temp/ 目錄擁有 SBIT 許可權。在其他人的 x 許可權位,被 t 符號佔用了,代表 /tmp/ 目錄擁有 SBIT 許可權。我們使用 zhangsan 使用者在 /tmp/ 目錄中建立測試檔案 ftest,然後使用 lisi使用者嘗試刪除。如果沒有 SBIT 許可權,而 /tmp/ 目錄的許可權是 777,那麼 lisi使用者應該可以刪除 ftest 檔案。

但是/tmp目錄擁有了 SBIT 許可權,lisi 使用者不能刪除其他使用者建立的檔案:

[[email protected] ~]# useradd zhangsan
[[email protected] ~]# useradd lisi
[[email protected] ~]# su -zhangsan
[[email protected] ~]$ cd /tmp/
[[email protected] tmp]$ touch ftest
[[email protected] tmp]$ll ftest
-rw-rw-r-- 1 zhangsan zhangsan 11月20 06:36 ftest
[[email protected] tmp]$ su - lisi
密碼:
輸入lisi使用者的密碼
[lisi @localhost ~]$ cd /tmp/
[lisi @localhost tmp]$ rm -rf ftest
rm:無法刪除"ftest":不允許的操作

雖然/tmp/目錄的許可權是777,但是擁有SBIT許可權,所以 lisi 使用者不能刪除其他使用者建立的檔案

 

chmod 1777 test #為test檔案加上sbit許可權