Linux 檔案與目錄的特殊權限

其實檔案與目錄有所謂的特殊權限由於特殊權限會擁有一些"特權",因而用戶若無特殊需求,不應該啟用這些權限,避免安全方面出現嚴重漏洞。

s 或 S(SUID,Set UID):
可執行的文件搭配這個權限,便能得到特權,任意存取該文件的所有者能使用的全部系統資源請注意具備 SUID 權限的文件,黑客經常利用這種權限,以 SUID 配上 root 帳號擁有者,無聲無息的在系統中開啟後門,供日後進出使用

s 或 S(SGID,Set GID):
設置在文件上面,其效果與 SUID 相同,只不過將文件所有者換成群組,該文件就可以任意存取整個群組所能使用的系統資源

t 或 T(Sticky):
/tmp 和 /var/tmp 目錄供所有用戶暫時存取檔案,亦即每個用戶皆擁有完整的權限進入該目錄,瀏覽刪除和移動檔案

因為 SUID、SGID、Sticky 佔用 x 的位置來表示,所以在表示上會有大小寫之分。同時加入開啟執行權限和 SUIDSGID、Sticky,則權限表示符號是小寫的:

  1. -rwsr-sr-t 1 root root 4096 6月 23 08:17 conf

複製代碼

如果關閉執行權限,則權限表示符號是大寫的:

  1. -rwSr-Sr-T 1 root root 4096 6月 23 08:17 conf

複製代碼

如果要加上特殊權限,就必需使用 4 位數字才能表示特殊權限的對應數值為:

  1. s 或 S(SUID):對應數值 4
  2. s 或 S(SGID):對應數值 2。
  3. t 或 T:對應數值 1。
  4. 用同樣的方法修改文件權限就可以了
  5. [root@localhost ~]# chmod 7600 conkyrc.sample
  6. [root@localhost ~]# ls -l
  7. 總用量 368
  8. -rwS--S--T 1 root root 12172 8月 15 23:18 conkyrc.sample
  9. drwxr-xr-x 2 root root 48 9月 4 16:32 Desktop
  10. -r--r--r-- 1 root root 331844 10月 22 21:08 libfreetype.so.6
  11. drwxr-xr-x 2 root root 48 8月 12 22:25 MyMusic
  12. -rwxr-xr-x 1 root root 9776 11月 5 08:08 net.eth0
  13. -rwxr-xr-x 1 root root 9776 11月 5 08:08 net.eth1


鳥哥的 Linux 私房菜 - 檔案與目錄

資料來源:http://www.vbird.org/linux_basic/0220filemanager.php

我們前面一直提到關於檔案的重要權限,那就是 rwx 這三個讀寫、執行的權限。 但是,眼尖的朋友們一定注意到了一件事,那就是,怎麼我們的 /tmp 權限怪怪的? 還有,那個 /usr/bin/passwd 也怪怪的?怎麼回事啊?看看先:

  1. [root@linux ~]# ls -ld /tmp ; ls -l /usr/bin/passwd
  2. drwxrwxrwt 5 root root 4096 Jul 20 10:00 /tmp
  3. -r-s--x--x 1 root root 18840 Mar 7 18:06 /usr/bin/passwd


不是只有 rwx 嗎?還有其他的特殊權限啊?啊.....頭又開始昏了~ @_@ 呵呵,不要擔心啦,我們這裡先不談這兩個權限,只是先介紹一下而已。 因為要瞭解這幾個特殊的權限,必須要先具有帳號的 ID 概念,以及程式的程序 (process) 概念後, 才能夠進一步的瞭解這個特殊權限所代表的意義


Set UID
會製作出 s 與 t 的權限,是為了讓一般使用者在執行某些程式的時候, 能夠暫時的具有該程式擁有者的權限 舉例來說好了,我們知道帳號與密碼的存放檔案其實是 /etc/passwd 與 /etc/shadow 而 /etc/shadow 這個檔案的權限是什麼?是『-r--------』。且他的擁有者是 root 喔!在這個權限中,僅有 root 可以『強制』儲存,其他人是連看都沒有辦法看的吶!

但是偏偏鳥哥使用 dmtsai 這個一般身份使用者去更新自己的密碼時,使用的就是 /usr/bin/passwd 這個程式, 卻是可以更新自己的密碼的,也就是說, dmtsai 這個一般身份使用者可以存取 /etc/shadow 這個密碼檔! 但!怎麼可能?明明 /etc/shadow 就是沒有 dmtsai 可以存取的權限啊!呵呵~這就是 s 這個權限的幫助啦! 當 s 這個權限在 user 的 x 時,也就是類似上表的 -r-s--x--x ,稱為 Set UID ,簡稱為 SUID , 這個 UID 代表的是 User 的 ID ,而 User 代表的則是這個程式 (/usr/bin/passwd) 的擁有者 (root 啊!) 那麼由上面的定義中,我們知道了,當 dmtsai 這個使用者執行 /usr/bin/passwd 時,他就會『暫時』的得到檔案擁有人 root 的權限

SUID 僅可用在『二進位制檔案(binary file)』上, SUID 因為是程式在執行的過程中擁有檔案擁有者的權限,因此,他僅可用於 binary file , 不能夠用在批次檔 (shell script) 上面的!這是因為 shell script 只是將很多的 binary 執行檔叫進來執行而已!所以 SUID 的權限部分,還是得要看 shell script 呼叫進來的程式的設定, 而不是 shell script 本身當然,SUID 對於目錄也是無效的~這點要特別留意。


Set GID
進一步來說,如果 s 的權限是在 group 時,那麼就是 Set GID ,簡稱為 SGID SGID 可以用在兩個部分喔!
檔案:如果 SGID 是設定在 binary file 上面,則不論使用者是誰,在執行該程式的時候, 他的有效群組 (effective group) 將會變成該程式的群組所有人 (group id)


目錄:如果 SGID 是設定在 A 目錄上面,則在該 A 目錄內所建立的檔案或目錄的 group ,將會是 此 A 目錄的 group !
一般來說, SGID 應該是比較多用在特定的多人團隊的專案開發上, 在系統當中應該會比較少這個設定才對~


Sticky Bit
這個 Sticky Bit 目前只針對目錄有效,對於檔案已經沒有效果了 SBit 對於目錄的作用是:『在具有 SBit 的目錄下,使用者若在該目錄下具有 w 及 x 的權限, 則當使用者在該目錄下建立檔案或目錄時,只有檔案擁有者與 root 才有權力刪除』換句話說:當甲這個使用者於 A 目錄下是擁有 group 或者是 other 的項目,並且擁有 w 的權限, 這表示『甲使用者對該目錄內任何人建立的目錄或檔案均可進行 "刪除/更名/搬移" 等動作』 不過,如果將 A 目錄加上了 Sticky bit 的權限項目時, 則甲只能夠針對自己建立的檔案或目錄進行刪除/更名/移動等動作

舉例來說,我們的 /tmp 本身的權限是『drwxrwxrwt』, 在這樣的權限內容下,任何人都可以在 /tmp 內新增修改檔案,但僅有該檔案/目錄建立者與 root 能夠刪除自己的目錄或檔案。這個特性也是挺重要的啊!你可以這樣做個簡單的測試:
1. 以 root 登入系統,並且進入 /tmp 當中;
2. touch test,並且更改 test 權限成為 777 ;
3. 以一般使用者登入,並進入 /tmp;
4. 嘗試刪除 test 這個檔案!
更多關於 SUID/SGID/Sticky Bit 的介紹,我們會在 程序與資源管理 中再次提及的,目前,您先有個簡單的基礎概念就好了!當然,也可以參考鳥園討論區的這一篇討論: http://phorum.vbird.org/viewtopic.php?t=20256


SUID/SGID/SBIT 權限設定
前面介紹過 SUID 與 SGID 的功能,那麼如何開啟檔案使成為具有 SUID 與 SGID 的權限呢?! 這就需要剛剛的數字更改權限的方法了!現在你應該已經知道數字型態個更改權限方式為『三個數字』的組合, 那麼如果在這三個數字之前再加上一個數字的話,那最前的面數字就代表這幾個屬性了! ( 註:通常我們使用 chmod xyz filename 的方式來設定 filename 的屬性時,則是假設沒有 SUID, SGID 及 Sticky bit 啦! )
4 為 SUID
2 為 SGID
1 為 Sticky bit
假設要將一個檔案屬性改為『-rwsr-xr-x』時,由於 s 在使用者權限中,所以是 SUID ,因此, 在原先的 755 之前還要加上 4 ,也就是:『 chmod 4755 filename 』來設定!此外,還有大 S 與大 T 的產生喔!參考底下的範例啦!(注意:底下的範例只是練習而已, 所以鳥哥使用同一個檔案來設定,您必須瞭解 SUID 不是用在目錄上,而 SBIT 不是用在檔案上的喔!)

  1. [root@linux ~]# cd /tmp
  2. [root@linux tmp]# touch test
  3. [root@linux tmp]# chmod 4755 test; ls -l test
  4. -rwsr-xr-x 1 root root 0 Jul 20 11:27 test
  5. [root@linux tmp]# chmod 6755 test; ls -l test
  6. -rwsr-sr-x 1 root root 0 Jul 20 11:27 test
  7. [root@linux tmp]# chmod 1755 test; ls -l test
  8. -rwxr-xr-t 1 root root 0 Jul 20 11:27 test
  9. [root@linux tmp]# chmod 7666 test; ls -l test
  10. -rwSrwSrwT 1 root root 0 Jul 20 11:27 test
  11. # 這個例子就要特別小心啦!怎麼會出現大寫的 S 與 T 呢?不都是小寫的嗎?
  12. # 因為 s 與 t 都是取代 x 這個參數的,但是你有沒有發現阿,我們是下達
  13. # 7666 喔!也就是說, user, group 以及 others 都沒有 x 這個可執行的標誌
  14. # ( 因為 666 嘛! ),所以,這個 S, T 代表的就是『空的』啦!怎麼說?
  15. # SUID 是表示『該檔案在執行的時候,具有檔案擁有者的權限』,但是檔案
  16. # 擁有者都無法執行了,哪裡來的權限給其他人使用?當然就是空的啦! ^_^