linux權限位的含義詳解

一、UNIX下關於文件權限的表示方法和解析

UNIX下關於文件權限的表示方法和解析

  SUID 是 Set User ID, SGID 是 Set Group ID的意思。

  UNIX下可以用ls -l 命令來看到文件的權限。用ls命令所得到的表示法的格式是類似這樣的:-rwxr-xr-x 。下面解析一下格式所表示的意思。這種表示方法一共有十位:

  9 8 7 6 5 4 3 2 1 0

  - r w x r - x r - x

  第9位表示文件類型,可以爲p、d、l、s、c、b和-:

  p表示命名管道文件

  d表示目錄文件

  l表示符號連接文件

  -表示普通文件

  s表示socket文件

  c表示字符設備文件

  b表示塊設備文件

  第8-6位、5-3位、2-0位分別表示文件所有者的權限,同組用戶的權限,其他用戶的權限,其形式爲rwx:

  r表示可讀,可以讀出文件的內容

  w表示可寫,可以修改文件的內容

  x表示可執行,可運行這個程序

  沒有權限的位置用-表示


  其實在UNIX的實現中,文件權限用12個二進制位表示,如果該位置上的值是

  1,表示有相應的權限:

  11 10 9 8 7 6 5 4 3 2 1 0

  S G T r w x r w x r w x

  第11位爲SUID位,第10位爲SGID位,第9位爲sticky位,第8-0位對應於上面的三組rwx位。

  11 10 9 8 7 6 5 4 3 2 1 0

  上面的-rwsr-xr-x的值爲: 1 0 0 1 1 1 1 0 1 1 0 1

  -rw-r-Sr--的值爲: 0 1 0 1 1 0 1 0 0 1 0 0

  給文件加SUID和SUID的命令如下:

  chmod u+s filename 設置SUID位

  chmod u-s filename 去掉SUID設置

  chmod g+s filename 設置SGID位

  chmod g-s filename 去掉SGID設置

  另外一種方法是chmod命令用八進制表示方法的設置。如果明白了前面的12位權限表示法也很簡單。

二、SUID和SGID的詳細解析

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因爲是程序在執行過程中擁有文件擁有者的權限,因此,它僅可用於二進制文件,不能用在批處理文件(shell腳本)上。這是因爲shell腳本只是將很多二進制執行文件調進來執行而已。所以SUID的權限部分,還是要看shell腳本調用進來的程序設置,而不是shell腳本本身。當然,SUID對目錄是無效的。這點要特別注意。

 

Set GID

 

進一步而言,如果s的權限是在用戶組,那麼就是Set GID,簡稱爲SGID。SGID可以用在兩個方面。

 

文件:如果SGID設置在二進制文件上,則不論用戶是誰,在執行該程序的時候,它的有效用戶組(effective group)將會變成該程序的用戶組所有者(group id)。

 

目錄:如果SGID是設置在A目錄上,則在該A目錄內所建立的文件或目錄的用戶組,將會是此A目錄的用戶組。

 

一般來說,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的介紹,我們會在第11章中再次提及,當前,先有簡單的概念即可。

SUID/SGID/SBIT權限設置

 

前面介紹過SUID與SGID的功能,那麼,如何打開文件使其成爲具有SUID與SGID的權限呢?這就需要使用數字更改權限了。現在應該知道,使用數字更改權限的方式爲“3個數字”的組合,那麼,如果在這3個數字之前再加上一個數字,最前面的數字就表示這幾個屬性了(注:通常我們使用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不是用在文件上)。

 

 

[root@linux ~]# cd /tmp
[root@linux tmp]# touch test
[root@linux tmp]# chmod 4755 test; ls -l test
-rwsr-xr-x 1 root root 0 Jul 20 11:27 test
[root@linux tmp]# chmod 6755 test; ls -l test
-rwsr-sr-x 1 root root 0 Jul 20 11:27 test
[root@linux tmp]# chmod 1755 test; ls -l test
-rwxr-xr-t 1 root root 0 Jul 20 11:27 test
[root@linux tmp]# chmod 7666 test; ls -l test
-rwSrwSrwT 1 root root 0 Jul 20 11:27 test

 

# 這個例子要特別小心。怎麼會出現大寫的S與T呢?不都是小寫的嗎?

# 因爲s與t都是取代x參數的,但是,我們是使用

# 7666。也就是說,user、group以及others都沒有x這個可執行的標誌

# (因爲666)。所以,S、T表示“空的”。

# SUID是表示“該文件在執行時,具有文件擁有者的權限”,但文件

# 擁有者都無法執行了,哪裏來的權限給其他人使用呢?當然就是空的

三、文件隱藏屬性

 

文件有隱藏屬性,隱藏屬性對系統有很大的幫助。尤其是在系統安全(Security)方面,非常重要。下面我們就來談一談如何設置與檢查這些隱藏的屬性。

 

chattr(設置文件隱藏屬性)

 

[root@linux ~]# chattr [+-=][ASacdistu] 文件或目錄名

 

參數:

+ : 增加某個特殊參數,其他原本存在的參數不動。

- : 刪除某個特殊參數,其他原本存在的參數不動。

= : 設置一定,且僅有後面接的參數

A : 當設置了A屬性時,這個文件(或目錄)的存取時間atime(access)將不可被修改,可避免例如手提電腦有磁盤I/O錯誤的情況發生。

S : 這個功能有點類似sync。就是將數據同步寫入磁盤中。可以有效地避免數據流失。

a : 設置a之後,這個文件將只能增加數據,而不能刪除,只有root才能設置這個屬性。

c : 這個屬性設置之後,將會自動將此文件“壓縮”,在讀取的時候將會自動解壓縮,但在存儲的時候,將會先進行壓縮後再存儲(對於大文件有用)。

d : 當執行dump(備份)程序的時候,設置d屬性將可使該文件(或目錄)具有轉儲功效。

i : i的作用很大。它可以讓一個文件“不能被刪除、改名、設置連接,也無法寫入或新增數據”。對於系統安全性有相當大的幫助。

j : 當使用ext3文件系統格式時,設置j屬性將會使文件在寫入時先記錄在journal中。但是,當文件系統設置參數爲data=journalled時,由於已經設置日誌了,所以這個屬性無效。

s : 當文件設置了s參數時,它將會從這個硬盤空間完全刪除。

u : 與s相反,當使用u來設置文件時,則數據內容其實還存在磁盤中,可以用來還原刪除.

 

注意:這個屬性設置上,比較常見的是a與i的設置值,而且很多設置值必須要root才能設置。

 

範例:

 

 

[root@linux ~]# cd /tmp
[root@linux tmp]# touch attrtest
[root@linux tmp]# chattr +i attrtest
[root@linux tmp]# rm attrtest
rm: remove write-protected regular empty file `attrtest'? y
rm: cannot remove `attrtest': Operation not permitted

 

# 看到了嗎?連root也沒有辦法刪除這個文件。趕緊解除設置。

[root@linux tmp]# chattr -i attrtest

 

這個命令很重要,尤其是在系統的安全性方面。由於這些屬性是隱藏的,所以需要用lsattr才能看到。筆者認爲,最重要的是 +i屬性,因爲它可以讓一個文件無法被更改,對於需要很高系統安全性的人來說,相當重要。還有相當多的屬性是需要root才能設置的。此外,如果是登錄文件,就更需要 +a參數,使之可以增加但不能修改與刪除原有的數據。將來提到登錄文件時,我們再來介紹如何設置它。

 

lsattr(顯示文件的隱藏屬性)

 

[root@linux ~]# lsattr [-aR] 文件或目錄

 

參數:

-a : 將隱藏文件的屬性也顯示出來。

-R : 連同子目錄的數據也一併列出來。

 

範例:

 

[root@linux tmp]# chattr +aij attrtest

[root@linux tmp]# lsattr

----ia---j--- ./attrtest

 

使用chattr設置後,可以利用lsattr來查看隱藏屬性。不過,這兩個命令在使用上必須要特別小心,否則會造成很大的困擾。例如,某天你心情好,突然將 /etc/shadow這個重要的密碼記錄文件設置爲具有i屬性,那麼,過了若干天之後,突然要新增用戶,卻一直無法新增。怎麼辦?將i的屬性去掉即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章