SetUID, SetGID, Sticky bit 與 file 指令

发表于:2007-07-04来源:作者:点击数: 标签:
这三个东东有些时候很困扰人,今天我折腾了半天才搞明白是怎么回事,现在拿上来和大家分享具体划分. SUID 與 SGID: 其實,說到這裡之前,應該先說明一下 UID (user ID)與 GID (Groupt ID)的!基本上, Linux 認得的帳號只是一堆數字而已!而由於我們每個檔案

这三个东东有些时候很困扰人,今天我折腾了半天才搞明白是怎么回事,现在拿上来和大家分享具体划分.

  • SUID 與 SGID:
    其實,說到這裡之前,應該先說明一下 UID (user ID)與 GID (Groupt ID)的!基本上, Linux 認得的帳號只是一堆數字而已!而由於我們每個檔案中同時含有『使用者』與『使用者群組』的屬性,因此,就有所謂的 UID 與 GID 囉! UID 代表我們的使用者『代號』而 GID 則是群組的『代號』。你可以使用『 more /etc/passwd 』這個指令來看一下你的系統當中的所有帳號,然後你會注意到每行的第三、四個欄位(以 : 分隔)為數字,那個就是 UID 與 GID 了,您更會注意到的是, root 的 UID 與 GID 都是 0 !因此,當你建立了一個帳號,而你將該帳號的 UID 與 GID 都改為零,呵呵!那個帳號的使用者就具有 root 的身份囉!
     
    那麼什麼是 SUID 與 SGID 呢?!在說明之前我們先來以一般身份使用者 ( 還記得安裝的時候曾經增加一個 test 帳號的一般身份使用者嗎?對啦!用他!然後呢?直接在鍵盤上按下 [Alt] + [Ctrl] + [F2] 到第二個終端機呀!) test 的身份登入,再來看一個檔案的內容:
     
    [test@test test]$ ls -l /usr/bin/passwd 
    -r-s--x--x    1 root     root        13476 Aug  7  2001 /usr/bin/passwd 
     
    看到了 /usr/bin/passwd 檔案的前面屬性了嗎?怎麼會有 s 的屬性在原本的 x 呀!?那個就是所謂的 SUID 了!如果是『 -r-xr-s--x 』時,那麼 s 就成為所謂的 SGID 了!
     
      當一個檔案具有 SUID 的時候,同時 other 的群組具有可執行的權限,那麼當 others 群組執行該程式的時候, other 將擁有該檔案的 owner 的權限!』。
      
    [test@test test]$ ls -l /usr/bin/passwd /etc/shadow 
    -r-s--x--x    1 root     root        13476 Aug  7  2001 /usr/bin/passwd 
    -rw-------    1 root     root         2423 Jun 25 14:29 /etc/shadow 
     
    我們以帳號的密碼檔來說明好了!注意上面的範例囉!可以看到的是, /etc/shadow 的權限是『只有 root 才能存取』呦!那麼你會不會覺得很奇怪?明明我的一般使用者可以自己修改密碼呀!對不對?那麼修改密碼一定跟 /etc/shadow 這個檔案有關,那麼怎麼回事呀!?使用者是如何修改 /etc/shadow 這個檔案的呢?嗯!沒錯!就是使用 SUID 的功能啦!上面的例子說明了, /usr/bin/passwd 這個檔案具有 SUID 的屬性,那麼當使用者使用 /usr/bin/passwd 這個執行檔時,在執行 pass word 修改的期間就具有 /usr/bin/passwd 這個檔案的擁有者 root 的所屬權限囉!所以,所以當一般使用者執行 passwd 的時候,將具有 root 的權限,所以他們也可以更改 /etc/shadow 的內容囉!那麼由此也可以知道,由於這個 Set UID ( SUID ) 的主要功能是在『某個檔案執行的期間具有檔案擁有者的權限』,因此, s 就是替代上面提到的 x 這個可執行的位置囉!那萬一該檔案並沒有 x 的屬性呢?哈哈!問的好!那麼該檔案的屬性就會將小寫的 s 變成大寫的 S 啦! ( 這裡即使暫時不瞭解也沒有關係,等到過一陣子再回來看一看,你就會瞭解啦! )
     
    不過,由此也知道 SUID 與 SGID 的問題所在,沒錯!就是太不安全!如果你有一個檔案具有 root 的權限,那麼當開啟了 SUID 的時候,嘿嘿!夠你瞧的了!!因此上,在變更一個檔案成為具有 SUID 或 SGID 的情況時,必須要特別小心呢!知道乎!?
     
  • Sticky bit:
    OK!接著下來,我們要來看一下,既然有 SUID 與 SGID ,那麼為什麼沒有在最末位出現 s 取代 x 呢?呵呵!這當然沒有必要啦!因為那是屬於 others 的權限,你的檔案如果是任何人皆可執行的話,那麼本來他們就具有權限啦!幹嘛還要設定 s 的屬性!?不過,這裡卻真的有另一個屬性出現了,那就是 Sticky bit 的屬性 ( t ) !這個屬性的最大用處在於『具有 sticky bit 屬性的該”目錄”下的檔案,其檔案或目錄只有檔案擁有者及 root 才有權力刪除!』這樣是否可以瞭解了呢?嘿嘿!沒錯!在我們系統裡面本來就預設有一個啦!那就是 /tmp 這個目錄!
      
    [test@test test]$ ls -l / 
    drwxrwxrwt    2 root     root         4096 Jul 18 13:08 tmp 
     
    如何,發現了吧!雖然該目錄具有所有人皆可讀寫的權限,但是確有一個 t 出現了,那就是所謂的 sticky bit 囉!在該目錄裡面雖然你可以建立與修改任何檔案,但是卻僅能刪除自己建立的檔案呢!除非你是 root !你可以這樣試試看囉:
     
      1. 以 root 登入系統,並且進入 /tmp 當中;
      2. touch test,並且更改 test 權限成為 777 ;
      3. 以一般使用者登入,並進入 /tmp;
      4. 嘗試刪除 test 這個檔案!
     
    如何!?發現了吧!!
     
  • SUID, SGID, Sticky bit 的設定方法:
    前面介紹過 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 的產生喔!參考底下的範例啦!
     
    [root@test tmp]# touch test
    [root@test tmp]# ll
    total 0
    -rw-r--r--    1 root     root            0 Feb  6 23:08 test
    [root@test tmp]# chmod 4755 test
    [root@vbird tmp]# ll
    total 0
    -rwsr-xr-x    1 root     root            0 Feb  6 23:08 test*
    [root@test tmp]# chmod 6755 test
    [root@test tmp]# ll
    total 0
    -rwsr-sr-x    1 root     root            0 Feb  6 23:08 test*
    [root@test tmp]# chmod 1755 test
    [root@test tmp]# ll
    total 0
    -rwxr-xr-t    1 root     root            0 Feb  6 23:08 test*
    上面的三個例子應該都很好說明啊!就是直接將 x 以 s 或者是 t 來取代就是了!也就是分別為 SUID, SGID 及 sticky bit 的設定方法啦!

    [root@test tmp]# chmod 7666 test
    [root@test tmp]# ll
    total 0
    -rwSrwSrwT    1 root     root            0 Feb  6 23:08 test
    這個例子就要特別小心啦!怎麼會出現大寫的 S 與 T 呢?不都是小寫的嗎?因為 s 與 t 都是取代 x 這個參數的,但是你有沒有發現阿,我們是下達 7666 喔!也就是說, user, group 以及 others 都沒有 x 這個可執行的標誌 ( 因為 666 嘛! ),所以,這個 S, T 代表的就是『空的』啦!怎麼說? SUID 是表示『該檔案在執行的時候,具有檔案擁有者的權限』,但是檔案擁有者都無法執行了,哪裡來的權限給其他人使用?當然就是空的啦! ^_^

     
  • file
    語法
    [root @test /root ]# file [檔名] 
    clearcase/" target="_blank" >cc">參數說明: 
    範例: 
    [root @test /root]# file ~/.bashrc 
    /root/.bashrc: ASCII text  <==表示這個檔案是 ASCII 純文字檔 

    [root @test /root]# file /usr/bin/passwd
    /usr/bin/passwd: setuid ELF 32-bit LSB executable, Intel 80386, version 1, dynamically linked (uses shared libs), stripped
    嘿!還可以看到是否具有 SUID 的權限呢!

    說明
    file 這個指令也蠻好用的,可以用來查看這個檔案的類型,例如 ASCII 格式檔,或者是 binary 的檔案等等,還可以用來觀看檔案是否被加入 SUID 等等的資訊!並且,也同時提供了是否有使用動態函式庫的資訊!相當的好用!
  • 原文转自:http://www.ltesting.net