文件權限其實就是用戶和用戶組對文件或目錄進行操作的權力。
文件的屬性
上圖中顯示詳細信息文件的詳細屬性,以最后一行為例從左向右依次說明:
1、drwxr-xr-x.
左起第一位:表示文件的類型,其中包括以下類型:
-:普通文件
d:目錄
l:符號鏈接文件(軟鏈接)
c:字符設備
b:塊設備
p:命令管道
s:套接字文件
后面的9位:表示權限
. :表示文件有隱藏屬性;
可以使用命令lsattr來進行查看;
2、數字(2)
表示此文件被硬鏈接的次數;
3、第一個root
表示文件或目錄屬主;
4、第二個root
表示文件或目錄屬組;
5、數字(4096)
表示文件的大小,以字節為單位;
6、Feb 3 20:54
表示文件最近一次的修改時間;
7、最后一項(Downloads)
表示文件名;
文件的基本權限
文件的權限
上面這一串字符中,第一位是文件的類型,后面的9位是文件的權限,一共包括4種不同的權限,分別為:
r:表示讀權限;
w:表示寫權限;
x:表示執行權限;
-:表示沒有權限。
這9位的權限以三位為一組,共分成三組,分別代表屬主、屬組和其它用戶的權限;
d rwx r-x r-x
文件類型 屬主 屬組 其它用戶
屬主:表示文件或目錄的所有者;
屬組:表示文件或目錄的所有組;
其它用戶:表示既不是屬主,也不是屬組成員的用戶;
注意:root用戶不受權限的限制。
上例表示文件的屬主擁有讀寫執行的權限;文件的屬組和其它用戶擁有讀和執行的權限。
權限對于目錄和文件的不同意義
權限對于文件的影響
r:可讀取文件的內容;
w:可以編輯、修改文件的內容,但不能刪除文件本身;
x:可以被執行的權限,通常用于腳本。
對于文件來說,權限主要是針對文件的內容而定義的,直接影響的是文件內的數據,如果想要刪除文件則需要定義文件所在目錄的權限。
權限對于目錄的影響
r:可以瀏覽目錄下的文件名,也就是說可以使用ls命令來查看目錄中的內容;
w:可以更改目錄中的內容,其中包括以下操作:
新建文件和目錄;
刪除文件和目錄;
重命名文件和目錄;
移動文件和目錄。
x:表示用戶是否可以進入目錄作為工作目錄,也就是說是否能夠使用cd命令進入到目錄中。
下面舉例進行說明:
雖然test文件是用戶rot所擁有,但由于只有r權限,依然不能修改文件的內容;
這是test文件所在的目錄的權限,可以看到rot用戶對此目錄擁有讀、寫、執行的權限;
在test目錄中刪除test文件,可以正常刪除,說明文件寫(w)權限并不對文件本身的存在與否生效,如果我們將目錄的(w)權限去掉,看下是否可以刪除目錄中的文件;
現在目錄中的w權限已經全部去除;
再來刪除目錄中的文件,已經不能成功操作了。
我們將test目錄的r權限去除,如下圖:
可以查看目錄本身屬性,但是目錄的內容卻不能瀏覽了;此目錄擁有了x權限,也就是說可能切換到test目錄中,如下圖:
雖然已經進入了目錄,而且由于擁有了w權限,還可以在目錄中對文件進行操作,但還是無法瀏覽目錄中文件列表。
現在我們去掉x權限來看一下效果;
我們給予了除了x的所有權限,目錄已經無法進入了。
注意:如果要開放目錄給任何人瀏覽時,應用至少開放r和x權限,否則目錄將無法正常查看。
權限的匹配順序
當一個用戶訪問文件或目錄時,是依照以下順序進行權限匹配的:
1、如果此用戶為訪問文件或目錄的屬主,則匹配屬主的權限;否則
2、如果此用戶為屬組的組成唄,則匹配屬組的權限;否則
3、匹配其他用戶的權限。
修改文件的屬性與權限
通過以下命令來進行文件的屬主、屬組修改以及權限的修改。
chgrp:改變文件的屬組;
格式:chgrp [-R] 屬組名 文件名/目錄名
-R:遞歸修改;
chown:改變文件的屬主;
格式:chown [-R] 屬主名:屬組名 文件名/目錄名
此命令即可以單獨修改屬主或屬組,也可以同時修改屬主和屬組;
chmod:修改文件的權限;
文件權限的表現方法有兩種,一種是用字符表示(-rwxrwxrwx),另一種是使用數字來表示(777)。
格式:chmod [-R] 文件權限 文件名/目錄名
使用字符改變文件權限的方法:
權限共有9位,每3位為一組,共分為3組,分別表示屬主、屬組和其它用戶;使用字符來代表不同的用戶:
u:屬主
g:屬組
o:其他用戶
a:所有用戶
權限的操作符:
+:增加權限
-:去除權限
=:設置權限
使用數字改變權限的方法
權限還可以使用數字表示,分別對應為:
r:4
w:2
x:1
-:0
例如:-rwxr-xr-x所對應的數字為[4+2+1][4+1][4+1]=755
上面介紹的三個命令在進行設置時,還可以參考其它文件的屬性或權限進行設置。
–reference :參考其它文件的已有設置對文件進行設置。
格式:chgrp/chown/chmod –reference 源文件 目標文件
上例中是參考文件b的屬組來設置文件a的屬組。
上例則是參考文件b的屬主和屬組來設置文件a。
參考文件b的權限來設置文件a。
修改默認權限
當我們新建文件和目錄時,會發現文件和目錄的權限是不一樣的,如下圖
創建后并沒有做任何的修改,但文件的權限為644,而目錄的權限為755,這是什么原因造成的呢?
其實Linux系統默認情況下新建文件的默認權限為666,而目錄的默認權限為777,而我們創建文件和目錄的權限是經過默認權限與權限掩碼計算的結果;我們可通過命令來修改掩碼,調整默認權限。
umask:修改掩碼
此命令不帶參數使用時,直接以數字方式顯示出掩碼值
使用-S參數時,則會以字符形式顯示出權限
使用umask命令查看掩碼值為0022,我們只看后三位,即002,第一位的含義將在后面進行說明;文件和目錄的權限是通過默認權限減去掩碼值的結果,如文件的權限:666-022=644;目錄的權限:777-022=755
我們可以直接使用umask命令來修改掩碼值,如下圖:
不過在命令行使用umask命令進行的修改是臨時的設置,如果想要永久生效可以將umask命令可寫到/etc/bashrc或者~/.bashrc;
/etc/bashrc:全局配置,作用范圍為所有用戶;
~/.bashrc:用戶配置,作用范圍為當前用戶。
root用戶的默認umask值與普通用戶的umask不同,root用戶默認為022,而普通用戶默認為002。
注意:如果文件權限666-umask的值中了現執行權限,則對應的權限會被加1,并生成有效權限。
例如:umask=0003,那么新建的文件權限為663,此時系統會將663+1,即文件權限為664。
文件的特殊權限
SUID:Set UID
文件具有SUID的權限,那么此文件做為進程運行時,進程的有效身份不是發起者,而是文件自身的屬主;
下面舉例說明:
我們知道任何用戶都可以使用passwd命令來修改自己的密碼,先來看一下passwd命令的權限;
上圖中的"s”就表示此文件擁有SUID權限
用戶的密碼都是存儲在/etc/shadow文件中,來看一下這個文件的權限;
可以看到此文件沒有任何開放的權限;
使用普通用戶連查看的權限都沒有,而使用passwd命令卻可以修改密碼,這是因為當普通用戶使用passwd命令的時候,運行命令的身份并不是普通用戶本身,而是passwd文件的屬主root,而root用戶不受文件權限的限制,所以任何用戶都可以獲得root的身份來修改自己的密碼。
修改SUID權限
chmod u+s FILE
SGID:Set GID
將目錄的屬組設置SGID后,屬組中的組成員在此目錄中所創建的文件的屬組不要是用戶的基本組,而是目錄的屬組。
新建一個組t1,并將目錄test的屬組更改為t1;
將rot用戶加入到t1組中;
在不添加SGID權限時,用戶rot在目錄test中創建文件,可以看到文件的屬組為rot;
添加SGID權限后,再次創建文件發現屬組為t1。
修改SGID權限
chmod g+s FILE
格式與用法同SUID相同,不再給出實例。
SGID也可以針對文件來設置,其用法與SUID類似,設置了SGID的程序,在運行時獲得文件屬組的權限。
SGID通常使用在多人同時合作一個項目工作時,將項目組成員加入到同一個附加組中,這樣任何組成員創建的文件組內其他成員也同時具有訪問和修改的權限,但同時也會出現一個問題,由于SGID是設置在目錄上的權限,那么要在目錄中創建和修改文件就必須分配寫(w)權限,這樣刪除文件的權限也同時被授予的了組成員,造成安全隱患;我們可以通過設置沾滯位來解決這個問題。
SBIT:Sticky Bit
對目錄設置此權限后,用戶在目錄中只能刪除自己創建的文件和目錄,而無權刪除其它用戶所創建的文件和目錄。
對目錄test設置SBIT權限;
使用rot用戶在目錄test中創建文件;
目錄test的權限為777,所以任何用戶都可以在目錄中內容做添加、刪除操作,但是使用t4用戶卻無法刪除a1文件。
修改SBIT權限
格式:chmod o+t FILE
使用數字來表示特殊權限
在查看umask值時有4位數字,后三位為屬主、屬組、其它用戶的權限,第一位就是特殊權限位,其對應的數字如下:
SUID:4
SGID:2
SBIT:1
例如:權限為-rwsr-xr-x用數字表示為:4755
有一種情況,我們有時會看到特殊權限位使用大寫的S和T來表示,這是因為其缺少相對應的執行權限,如:
文件a 沒有任何的執行權限,那么此時加上特殊權限的話,會出現以下情況:
特殊權限的作用對象
SUID:文件
SGID:目錄和文件
SBIT:目錄
文件的隱藏屬性
上面我們在介紹文件屬性時,9位權限位后面有一個“.”表示文件有隱藏屬性,下面我們就來了解一下文件的隱藏屬性。
使用lsattr命令來查看文件的隱藏屬性;
使用chattr命令來修改文件的隱藏屬性;
chattr +屬性 文件名
常用屬性:
a:只能追加內容;
i:不可以修改;
u:不可以刪除;
A:不更改訪問時間戳。
下面舉例說明:
給文件a添加屬性a,如下圖:
向文件a中追加內容;
將文件a中的內容進行覆蓋;
修改文件中的內容是不被允許的。
此功能可用于設置日志文件,既可以保證日志的安全,又能夠滿足持續向日志文件進行寫操作的需求。
其它屬性此處不再進行演示,可以自行進行實驗查看效果。
FACL:文件訪問控制列表
用于提供除屬主、屬組、其它用戶的讀、寫、執行權限以外的具體權限的設置??梢葬槍我挥脩簟我晃募蚰夸泚磉M行讀、寫、執行的權限設置,對于有特殊要求的權限設置非常有幫助。
設置ACL
getfacl 文件名
查看文件或目錄的ACL信息。
上圖的顯示的了ACL的詳細信息,其中包括文件名、屬主、屬組、特殊權限(上圖中為SUID)、以及對應的權限。
setfacl [-bkRd] [ {-m|-x} acl參數 文件名
參數:
-b:刪除所有的ACL參數;
-k:刪除默認的ACL參數;
-R:遞歸設置;
-d:設置默認ACL參數;
-m:設定ACL參數;
-x:取消設定ACL參數。
acl的設定格式:
用戶:u:[用戶列表]:[rwx-]
設置用戶rot對于文件a有讀寫權限;
設置ACL后可以看到在權限位后出現一個“+”;
查看文件a的acl權限
測試acl權限
從上圖可以看到用戶rot在other權限為只讀的情況下依然可以向文件a中寫入數據;
而使用用戶t5只沒有寫權限
組:g:[組列表]:[rwx-]
用戶組與用戶的設置基本相同,此處不再詳述。
mask:m:[rwx-]
mask表示用戶或用戶組的權限必須要在mask的權限范圍內才能生效;
上圖中用戶和組都具有讀和寫的權限,但mask規定只能有讀的權限;
此時用戶rot再向文件a中寫入數據時就會提示沒有權限了。
不過在設置時為了避免造成混亂umask一般都設置為rwx。
設置默認acl:d:[ug]:用戶列表:[rwx-]
只能作用于目錄;
在test目錄中新建文件夾t5并查看acl,可以看到用戶t5的權限已被加到文件夾中。
-R參數:
對目錄rot進行遞歸授權,則不但目錄rot的權限被改變;
目錄中的文件的權限也被同時改變了。
遞歸授權與設置默認權限操作的區別在于,遞歸授權是對目錄中現有的文件或目錄進行操作,而對于新增的文件或目錄則沒有影響;默認權限則是對于目錄中新增的文件或目錄進行權限設置,而對于在設置默認權限時目錄中已經存在的文件或目錄沒有影響。
-x參數:
刪除指定的權限設置
刪除t4用戶的權限;
-k參數:
刪除默認權限的設置
-b參數:
刪除所有acl的權限設置;
應用ACL后權限的匹配模型:
1、訪問文件或目錄的用戶是否為文件的屬主,是則匹配屬主的權限,否則;
2、查找ACL中是否有此用戶的權限設定,有則匹配ACL中的權限,否則;
3、用戶是否為文件屬組的組成員,是則匹配屬組的權限,否則;
4、查找ACL中是否有用戶組的權限設定,有則查找用戶是否屬于此用戶組,有則匹配ACL中的權限,否則;
5、匹配其它用戶的權限。
原創文章,作者:petmaster,如若轉載,請注明出處:http://www.www58058.com/1227
內容知識點都很到位,但初看會給人亂的感覺,不容易保留用戶持久常駐。希望在下一篇的文章會有改進
@stanley:嗯呢 仔細讀了一遍 確實我些地方感覺自己也是一下子沒看懂 有時間我再修改一下 謝謝!
mark