鸟哥的关于 suid sgid sbit 这些特殊权限 (一)

鸟哥文章很多,偶尔看到些,没觉得什么特别的。 今天看到这篇, 觉得太棒了,收藏、转贴了。

原文地址:  http://linux.vbird.org/linux_basic/0220filemanager.php#suid_sgid_sbit 


檔案特殊權限: SUID, SGID, SBIT

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

[root@www ~]# ls -ld /tmp ; ls -l /usr/bin/passwd
drwxrwxrwt 7 root root 4096 Sep 27 18:23 /tmp
-rwsr-xr-x 1 root root 22984 Jan  7  2007 /usr/bin/passwd

不是應該只有 rwx 嗎?還有其他的特殊權限( s 跟 t )啊?啊.....頭又開始昏了~ @_@ 因為 s 與 t 這兩個權限的意義與系統的帳號 (第十四章)系統的程序(process, 第十七章)較為相關, 所以等到後面的章節談完後你才會比較有概念!底下的說明先看看就好,如果看不懂也沒有關係, 先知道s放在哪裡稱為SUID/SGID以及如何設定即可,等系統程序章節讀完後,再回來看看喔!


  • Set UID

當 s 這個標誌出現在檔案擁有者的 x 權限上時,例如剛剛提到的 /usr/bin/passwd 這個檔案的權限狀態:『-rwsr-xr-x』,此時就被稱為 Set UID,簡稱為 SUID 的特殊權限。 那麼SUID的權限對於一個檔案的特殊功能是什麼呢?基本上SUID有這樣的限制與功能:

  • SUID 權限僅對二進位程式(binary program)有效;
  • 執行者對於該程式需要具有 x 的可執行權限;
  • 本權限僅在執行該程式的過程中有效 (run-time);
  • 執行者將具有該程式擁有者 (owner) 的權限。

講這麼硬的東西你可能對於 SUID 還是沒有概念,沒關係,我們舉個例子來說明好了。 我們的 Linux 系統中,所有帳號的密碼都記錄在 /etc/shadow 這個檔案裡面,這個檔案的權限為:『-r-------- 1 root root』,意思是這個檔案僅有root可讀且僅有root可以強制寫入而已。 既然這個檔案僅有 root 可以修改,那麼鳥哥的 vbird 這個一般帳號使用者能否自行修改自己的密碼呢? 你可以使用你自己的帳號輸入『passwd』這個指令來看看,嘿嘿!一般使用者當然可以修改自己的密碼了!

唔!有沒有衝突啊!明明 /etc/shadow 就不能讓 vbird 這個一般帳戶去存取的,為什麼 vbird 還能夠修改這個檔案內的密碼呢? 這就是 SUID 的功能啦!藉由上述的功能說明,我們可以知道

  1. vbird 對於 /usr/bin/passwd 這個程式來說是具有 x 權限的,表示 vbird 能執行 passwd;
  2. passwd 的擁有者是 root 這個帳號;
  3. vbird 執行 passwd 的過程中,會『暫時』獲得 root 的權限;
  4. /etc/shadow 就可以被 vbird 所執行的 passwd 所修改。

但如果 vbird 使用 cat 去讀取 /etc/shadow 時,他能夠讀取嗎?因為 cat 不具有 SUID 的權限,所以 vbird 執行 『cat /etc/shadow』 時,是不能讀取 /etc/shadow 的。我們用一張示意圖來說明如下:

SUID程式執行的過程示意圖
圖4.4.1、SUID程式執行的過程示意圖

另外,SUID 僅可用在binary program 上, 不能夠用在 shell script 上面!這是因為 shell script 只是將很多的 binary 執行檔叫進來執行而已!所以 SUID 的權限部分,還是得要看 shell script 呼叫進來的程式的設定, 而不是 shell script 本身。當然,SUID 對於目錄也是無效的~這點要特別留意。


  • Set GID

當 s 標誌在檔案擁有者的 x 項目為 SUID,那 s 在群組的 x 時則稱為 Set GID, SGID 囉!是這樣沒錯!^_^。 舉例來說,你可以用底下的指令來觀察到具有 SGID 權限的檔案喔:

[root@www ~]# ls -l /usr/bin/locate
-rwx--s--x 1 root slocate 23856 Mar 15  2007 /usr/bin/locate

與 SUID 不同的是,SGID 可以針對檔案或目錄來設定!如果是對檔案來說, SGID 有如下的功能:

  • SGID 對二進位程式有用;
  • 程式執行者對於該程式來說,需具備 x 的權限;
  • 執行者在執行的過程中將會獲得該程式群組的支援!

舉例來說,上面的 /usr/bin/locate 這個程式可以去搜尋 /var/lib/mlocate/mlocate.db 這個檔案的內容 (詳細說明會在下節講述), mlocate.db 的權限如下:

[root@www ~]# ll /usr/bin/locate /var/lib/mlocate/mlocate.db
-rwx--s--x 1 root slocate   23856 Mar 15  2007 /usr/bin/locate
-rw-r----- 1 root slocate 3175776 Sep 28 04:02 /var/lib/mlocate/mlocate.db

與 SUID 非常的類似,若我使用 vbird 這個帳號去執行 locate 時,那 vbird 將會取得 slocate 群組的支援, 因此就能夠去讀取 mlocate.db 啦!非常有趣吧!

除了 binary program 之外,事實上 SGID 也能夠用在目錄上,這也是非常常見的一種用途! 當一個目錄設定了 SGID 的權限後,他將具有如下的功能:

  • 使用者若對於此目錄具有 r 與 x 的權限時,該使用者能夠進入此目錄;
  • 使用者在此目錄下的有效群組(effective group)將會變成該目錄的群組;
  • 用途:若使用者在此目錄下具有 w 的權限(可以新建檔案),則使用者所建立的新檔案,該新檔案的群組與此目錄的群組相同。

SGID 對於專案開發來說是非常重要的!因為這涉及群組權限的問題,您可以參考一下本章後續情境模擬的案例,應該就能夠對於 SGID 有一些瞭解的!^_^


  • Sticky Bit

這個 Sticky Bit, SBIT 目前只針對目錄有效,對於檔案已經沒有效果了。 SBIT 對於目錄的作用是:

  • 當使用者對於此目錄具有 w, x 權限,亦即具有寫入的權限時;
  • 當使用者在該目錄下建立檔案或目錄時,僅有自己與 root 才有權力刪除該檔案

換句話說:當甲這個使用者於 A 目錄是具有群組或其他人的身份,並且擁有該目錄 w 的權限, 這表示『甲使用者對該目錄內任何人建立的目錄或檔案均可進行 "刪除/更名/搬移" 等動作。』 不過,如果將 A 目錄加上了 SBIT 的權限項目時, 則甲只能夠針對自己建立的檔案或目錄進行刪除/更名/移動等動作,而無法刪除他人的檔案。

舉例來說,我們的 /tmp 本身的權限是『drwxrwxrwt』, 在這樣的權限內容下,任何人都可以在 /tmp 內新增、修改檔案,但僅有該檔案/目錄建立者與 root 能夠刪除自己的目錄或檔案。這個特性也是挺重要的啊!你可以這樣做個簡單的測試:

  1. 以 root 登入系統,並且進入 /tmp 當中;
  2. touch test,並且更改 test 權限成為 777 ;
  3. 以一般使用者登入,並進入 /tmp;
  4. 嘗試刪除 test 這個檔案!

由於 SUID/SGID/SBIT 牽涉到程序的概念,因此再次強調,這部份的資料在您讀完第十七章關於程序方面的知識後,要再次的回來瞧瞧喔! 目前,你先有個簡單的基礎概念就好了!文末的參考資料也建議閱讀一番喔!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值