檔案的權限以及通路控制清單貫穿在整個的Linux使用過程中。我們知道,在Linux 中一切皆檔案,因而檔案的權限,就自然而然地成為了Linux使用過程中需要頻繁接觸到的知識内容。而檔案權限這一部分地内容,又非常地複雜,因為我們将在這篇文章當中詳細地介紹檔案的權限,加深自己的了解,同時留作備忘。
1.檔案權限 主要介紹檔案的權限,以及每種權限代表着哪些含義。
2.修改檔案權限 介紹如何修改檔案的權限
3.Linux 系統上特殊檔案權限 介紹Linux 系統上的檔案的特殊權限,SUID,SGID,Sticky
4.通路控制清單 介紹了如何使用ACL(通路控制清單)來設定複雜權限。
關于檔案權限可參考如下示意圖,此圖中列舉出了檔案的中繼資料,我們接下來将針對檔案的權限進行詳細的描述。
檔案的權限主要針對三類對象進行定義: Owner: 屬主 u Group: 屬組 g Other: 其他 o 每個檔案針對每一類的通路者都設定了三種權限 r:Readable 讀 w:Writeable 寫 x:eXcutable 執行
檔案 r: 可以使用文本檢視類工具擷取其内容。 但是對root使用者不起作用。如果沒有權限,file 檔案将不可用,因為file檔案需要讀取檔案頭來擷取檔案資訊。 w: 可以修改其内容,但是對root使用者不起作用。 x: 可以将此檔案提請核心啟動一個程序。即二進制檔案,可執行。對root使用者有效。 目錄 r: 可以使用ls指令檢視目錄内的檔案清單。 w: 可以在此目錄中建立檔案,也可以删除此目錄中的檔案。 x: 可以使用ls -l 檢視此目錄中檔案清單,可以cd 進入此目錄。 X: 隻給目錄x權限,目錄内檔案,如果本身就有x權限,則給ugo加上x權限,如果本身不具備x權限,則不給檔案x權限。
由上,我們可以知道,一個使用者能否對某一個檔案進行删除,取決于該使用者在該檔案所在的目錄上的權限,而不取決于在該檔案上的權限。 如果使用者對目錄有寫權限,使用者就能夠删除該目錄下的檔案。
關于檔案權限的所有操作,我們将參考如下表格,這張表清晰的列舉了檔案權限相對應的操作。
表檔案權限
就目前而言,一個使用者對于檔案一共有三種身份,分别是屬主,屬組,和其他。我們可以通過最基本的方式來給一個使用者提供權限,就是修改檔案的屬主,屬組。
修改檔案的屬主:chown 選項 屬主:屬組 檔案 修改屬主: chown USERNAME FILE 修改屬組: chown :GROUPNAME FILE 修改屬主和屬組: chown USERNAME:GROUPNAME FILE 指令中的冒号可以使用 . 來替代 或者直接引用某個檔案的屬性來替換自己的中繼資料 chown [OPTION]… –reference=RFILE FILE… -R : 遞歸修改目錄内的檔案。
執行個體
修改檔案的屬組:chgrp 選項 屬組 檔案 修改屬組: chgrp GROUPNAME FILE 或者直接引用某個檔案的屬性來替換自己的中繼資料 chgrp [OPTION]… –reference=RFILE FILE…
具體執行個體可以參考修改檔案屬主的相關案例。
chmod 修改檔案權限 使用方法為: chmod u+wr,g-r,o=rw file chmod [OPTION]… –reference=RFILE FILE… 參考RFILE檔案的權限,将FILE的修改為同RFILE 也可以使用 -R 遞歸選項
從實驗五可以看出一點,就是X 權限隻給目錄x權限,目錄内檔案,如果本身就有x權限,則給ugo加上x權限,如果本身不具備x權限,則不給檔案x權限。
在表示權限修改的方法上還可以使用數字法來表示檔案的權限。可以參考表檔案權限操作。
總的來說,如果一個屬主,隻具備r權限,那麼該屬主的權限位使用二進制表示為100.換算成十進制就是4 .同理如果同時具備rw權限,那麼使用二進制可以表示為110.換算成十進制就是6.依次類推,我們知道可以使用數字4表示r,2表示w,1表示x,如果全部權限都具備的話,就是7。
下面我們将使用數字法重新實作模式法中的實驗。
通過數字法,我們可以發現,如果要設定單個權限的話,模式法更友善,可是如果要設定所有權限的話,使用數字法,會更加的友善快捷。
建立目錄和檔案的預設權限是由系統中umask值來決定的。 建立FILE權限:666-umask (對位相減) 由數字法賦權限的過程中,我們能夠發現,凡是奇數權限,總是包含執行權限的。而一個檔案如果預設就包含執行權限其實是非常危險的。是以如果所得結果中某位存在執行(奇數)權限,則将其權限加1. 建立DIR權限:777-umask 非特權使用者umask 是002 root的umask是022 設定umask: umask # ,比如 umask 022 umask -S 模式方式顯示 umask -p 輸出可被調用 全局設定: /etc/bashrc 使用者設定 ~/.bashrc
真正作用就是:将umask指定的權限從檔案或目錄的最大權限中減去。
為了便于了解,這裡再重複一下,就是說,檔案預設最大權限(666) 中,如果存在umask中指定的要删除的權限,就将該權限删掉,如果不存在,那就不用變化就好了。
普通權限在一般情況下應用是沒有問題。可是在一些特殊場景下,僅僅設定普通權限,并不能滿足實際生産需要。
如果一個檔案具有SUID,SGID,Sticky權限,那麼相應u,g,o 的x權限位會被替換成s權限。
SUID,SGID,權限是用來提升權限的。權限是累加的。也就是說,使用者本身的權限,加上SUID,SGID的權限。
我們先來看一個執行個體
我們能夠看到在,passwd 屬主的權限為: rws 這裡的s 就是特殊權限SUID。 它表現為,當任何使用者在使用passwd指令時,它的身份将臨時切換為root使用者,并具有root使用者的權限,而不用考慮該使用者對passwd的權限。也可以了解為,某二進制檔案如果具有SUID權限,則任何使用該二進制檔案的使用者,其權限将臨時內建該二進制檔案屬主的權限。
SUID特殊權限使用前提:程序有屬主和屬組;檔案有屬主和屬組 任何一個可執行程式檔案能不能啟動為程序,取決發起者對程式檔案是否擁有執行權限 啟動為程序之後,其程序的屬主為發起者,程序的屬組為發起者所屬的組 程序通路檔案時的權限,取決于程序的發起者 (a) 程序的發起者,同檔案的屬主:則應用檔案屬主權限 (b) 程序的發起者,屬于檔案屬組;則應用檔案屬組權限 (c) 應用檔案“其它”權限
任何一個可執行程式檔案能不能啟動為程序:取決發起者對程式檔案是否擁有執行權限 啟動為程序之後,其程序的屬主為原程式檔案的屬主 SUID隻對二進制可執行程式有效 SUID設定在目錄上無意義 權限設定: chmod u+s FILE… chmod u-s FILE…
SUID是一種特殊權限,用s 表示。如果一個二進制檔案具有SUID權限的話,其屬主x權限将被s替代。而且在使用數字法進行權限修改的時候,其數字位單獨用4表示。
啟動為程序之後,其程序的屬主為原程式檔案的屬組 權限設定:chmod g+s FILE… chmod g-s FILE…
預設情況下,使用者建立檔案時,其屬組為此使用者所屬的主組 一旦某目錄被設定了SGID,則對此目錄有寫權限的使用者在此目錄中建立的檔案所屬的組為此目錄的屬組 通常用于建立一個協作目錄 , 權限設定:chmod g+s DIR… chmod g-s DIR…
通過以上描述我們可以發現,如果我們給一個目錄設定了SGID權限,然後有多個使用者在該目錄下建立了不同的檔案,而這些檔案的屬組都是該目錄的屬組。此時問題出現了,在該目錄下的不同使用者可以互相删除對方的檔案。那麼此時,我們就需要使用另外一個特殊權限,來解決這個問題。
具有寫權限的目錄通常使用者可以删除該目錄中的任何檔案,無論該檔案的權限或擁有權 在目錄設定Sticky 位,隻有檔案的所有者或root可以删除該檔案 sticky 設定在檔案上無意義 權限設定:chmod o+t DIR… chmod o-t DIR…
我們首先來看一組執行個體
從上面的執行個體我們可以看出 SUID: user,占據屬主的執行權限位 s: 屬主擁有x權限 S:屬主沒有x權限
下面我們來看另外一組執行個體
從上面的執行個體中,我們可以看出 SGID: group,占據屬組的執行權限位 s: group擁有x權限 S:group沒有x權限
最後一組執行個體
通過上面的執行個體 Sticky: other,占據other的執行權限位 t: other擁有x權限 T:other沒有x權限
chattr +i 不能删除,改名,修改 chattr -i chattr +a 隻能追加内容 lsattr 顯示特定屬性
ACL:Access Control List ,實作靈活的權限管理 除了檔案的所有者,所屬組和其它人,可以對更多的使用者設定權限 CentOS7 預設建立的xfs和ext4檔案系統具有ACL功能 CentOS7 之前版本,預設手工建立的ext4檔案系統無ACL功能,需手動增加 tune2fs –o acl /dev/sdb1 mount –o acl /dev/sdb1 /mnt/test ACL生效順序:所有者,自定義使用者,自定義組,其他人
下面這些指令可以自己嘗試一下 setfacl -m u:wang:rwx file|directory setfacl -Rm g:sales:rwX directory //遞歸 setfacl -M file.acl file|directory //增權重限 setfacl -m g:salesgroup:rw file| directory setfacl -m d:u:wang:rx directory //設定目錄的預設權限 setfacl -x u:wang file |directory setfacl -X file.acl directory 删除權限
通過上面的執行個體可以看出,權限的修改是可以批量進行的,但是-X 并不能清除ACL的所有權限。
現在我們可以重新來梳理一下,一個檔案的權限通常涉及到哪幾類使用者。 屬主,屬組,自定義使用者,自定義組,Other,一共五類使用者。 而ACL就是對這五類使用者的權限進行控制 。 ACL檔案上的group權限是mask 值(自定義使用者,自定義組,擁有組的最大權限),而非傳統的組權限
設定mask值之後我們會發現,自定義使用者,自定義組,以及預設的屬組,都被mask值限定住了。 可以将mask值了解為最高權限,除了所有者,Other之外,其他的都在mask 的管轄之内。 getfacl 可看到特殊權限:flags 通過ACL賦予目錄預設x權限,目錄内檔案也不會繼承x權限 base ACL 不能删除 setfacl -k dir 删除預設ACL權限 setfacl –b file1清除所有ACL權限 getfacl file1 | setfacl –set-file=- file2 複制file1的acl權限給file2
mask隻影響除所有者和other的之外的人群組的最大權限Mask需要與使用者的權限進行邏輯與運算後,才能變成有限的權限(Effective Permission) 使用者或組的設定必須存在于mask權限設定範圍内才會生效 setfacl -m mask::rx file
–set選項會把原有的ACL項都删除,用新的替代,需要注意的是一定要包含UGO的設定,不能象-m一樣隻是添加ACL就可以 示例: setfacl –set u::rw,u:wang:rw,g::r,o::- file1 本文轉自Eumenides_s 51CTO部落格,原文連結: http://blog.51cto.com/xiaoshuaigege/1965097 ,如需轉載請自行聯系原作者