首頁 > 軟體

Linux許可權管理詳解

2020-06-16 17:06:04

目錄

1.檔案許可權介紹
2.修改許可權:chmod
3.新建目錄檔案的預設許可權
4.特殊許可權
5.存取控制列表

1.檔案許可權介紹

檔案的許可權主要針對三類物件,分別是:owner:u:所屬使用者;group:g:所屬組;other:o:其他人
每個檔案針對每類存取者都定義了三種許可權:r=4:可讀,能否檢視內容和確定檔案型別;w=2:可寫,能否新增修改刪除內容;x=1:可執行,是否可執行
目錄隨說檔案的一種,但目錄是資料夾,所以這裡目錄和檔案在許可權方面還有些不同。
針對目錄來說:r:可以檢視目錄內的檔案列表;w:可建立刪除目錄內的檔案,但必須有x許可權才可真正執行;x:可以進入目錄內;X:只給目錄x許可權,不給檔案x許可權,但若檔案本身就帶x許可權,則會給其他所有位加上x許可權
針對檔案來說:r:可檢視內容和後設資料;w:可修改內容;x:可以執行,對root也有效
注意
檔案是目錄的內容,刪除許可權是檔案所在目錄的許可權決定,若目錄沒有x許可權,就不可刪除檔案。但修改許可權是檔案本身決定的,也就是即使刪除不了,也可以使對檔案進行修改破壞。
任何使用者無執行許可權將無法執行,而root使用者在u、g、o上沒有執行許可權時也不例外,但一旦任何一個上有x許可權那麼root就可以有x許可權。
時刻記住root為超級管理員,系統對root的約束力不大,很多規則都不能約束root。
檔案目錄的許可權是按照順序檢查的:u,g,o。

2.修改許可權:chmod

chmod - 修改檔案許可權
用法:
chmod [option]... mode[,mode]... file...
chmod [option]... octal-mode file...
chmod [option]... --reference=rfile file...
[option]
-f:錯誤資訊不顯示
-R:遞回修改許可權
-v:顯示詳細修改許可權過程
-c:和-v一樣,但只有出現改變時才顯示
[mode]和[octal-mode]
{u|ug|ugo|go|uo}{=|-|+}{rwxX|421}:任意組合的u,g,o可以直接=或-或+許可權,許可權也可以使用rwx,也可以使用對於的數位
[--reference=rfile]
這是可以參考rfile檔案的許可權,來將file的許可權修改與rfile的許可權相同

這裡舉些範例方便理解:
chmod -R g+rwX /testdir
chmod 600 file
chmod u+wx,g-r,o=rx file

3.新建目錄檔案的預設許可權

當我們建立一個目錄或檔案時,系統會自動給其分配一個許可權,這個許可權是怎麼來的?實際上,新建目錄或檔案的許可權是系統根據所設定的umask的值來計算出來的。
umask有個預設值放在/etc/profile檔案中。當使用者uid在0-199之內時,umask=022;當使用者uid大於199時,umask=002。
預設許可權是怎麼來的呢?新建檔案的預設許可權為666-umask的值,且如果所得的結果某位存在執行許可權也就是奇數是,則將其位上許可權+1;新建目錄的預設許可權為777-umask的值所得。當然上面計算方法,本質上是對位將最大許可權的umask的相應位許可權去除,來得到預設許可權;也就是說umask為0的位,不去除對位,umask為1的位,去除對位,對位是0還是0,對位是1就去為0。
umask還是個命令:

umask-顯示和設定umask值
umask [-p] [-S] [mode]
-p:輸出umask值,可以作為標准輸入用
-S:輸入u=,g=,o=
umask mode:設定umask值,但只是暫時的,重新啟動機器後就會失效。

要想永久保留自己設定的umask值可以儲存在:~/.bashrc,這個使用者自己用;/etc/bashrc,這個大家一起用。

4.特殊許可權

檔案除了一般許可權外,還在執行位x上還有特殊許可權。對於所有者u來說特殊許可權稱為SUID,對於所屬組來說特殊許可權為SGID,對於其他人來說特殊許可權為STICKY

1.SUID

任何一個可執行程式檔案能不能啟動為進程,取決於發起者即所有者u對程式檔案是否擁有執行許可權;啟動為進程後,其進程的所有者為原程式檔案的所有者。
SUID作用在所有者u的可執行許可權x上,就是用於繼承程式所有者的許可權,來使所有人都可以暫借這個執行許可權來執行這個檔案。SUID只對二進位制可執行程式有效,而設定在目錄上無意義。
許可權的設定為:

chmod u{+|-}s file...:給檔案新增或去除suid許可權

2.SGID

預設情況下,使用者建立檔案或目錄時其所屬組為此使用者的所屬組g。
SGID作用在二進位制檔案上時,會使屬於這個組g的人都繼承檔案的執行許可權。
SGID作用在目錄上時,會使目錄內新建的檔案的所屬組自動繼續目錄的所屬組。
許可權的設定為:

chmod g{+|-}s {dir|file}...:給目錄或檔案新增或去掉sgid許可權

3.STICKY

具有寫許可權的目錄,使用者可以刪除該目錄中的任何檔案。
STICKY作用在目錄上後,只有檔案的所有者或root可以刪除該檔案。且STICKY設定在檔案上無意義。
許可權的設定為:
chmod o{+|-}t dir...:給目錄新增或去掉sticky許可權

4.特殊許可權的數位法和許可權位的對映

特殊許可權位用數值表示就是:suid=4;sgid=2;sticky=1
特殊許可權設定時,要放在普通許可權的前面,如chmod 4777 /tmp/a.txt
SUID佔據所有者u的執行許可權位時,ux許可權時表示su沒有x許可權時表示S。
SGID佔據所屬組g的執行許可權位時,gx許可權時表示su沒有x許可權時表示S。
STICKY佔據其他人o的執行許可權位時,ox許可權時表示to沒有x許可權時表示T。

5.存取控制列表

1.存取控制列表介紹

存取控制列表(Access Control List,ACL),又稱存取控制串列,是使用以存取控制矩陣為基礎的存取控制方法,每個物件對應一個串列主體。ACL描述每個物件各自的存取控制,並記錄可對此物件進行存取的所有主體物件的許可權。
ACL的主要功能:為了更好的管理使用者許可權,可以自由的設定使用者的存取檔案的許可權,實行有效的管理。對某些組成或使用者有特殊許可權的設定。除了檔案的所有者,所屬組和其他人,可以對更多的使用者設定許可權。
CentOS7預設建立xfs和ext4檔案系統具有ACL功能,而之前的版本,預設手工建立的ext4檔案系統沒有ACL功能,需要手動增加:tune2fs -o acl /dev/sd?

上面就是ACL生效的順序,也就是許可權優先順序是從上往下的,所有者,自定義使用者,所屬主組,自定義組,其他人。且mask是個限定線,除了所有者和其他人,其餘的都不能超過這個限定線。

2.getfacl

getfacl - 取得並顯示檔案的存取控制列表
getfacl [-aceEsRLPtpndvh] {file|-} ...
-a, --access:顯示檔案的ACL
-d, --default:僅顯示預設的ACL
-c, --omit-header:不顯示帶有#的資訊
-e, --all-effective:顯示所有有效的許可權
-E, --no-effective:顯示無效的許可權
-s, --skip-base:跳過只有基礎詞目的檔案
-R, --recursive:遞回
-L, --logical:logical walk, follow symbolic links
-P, --physical:physical walk, do not follow symbolic links
-t, --tabular:使用列表輸出格式
-n, --numeric:列印數值形式的使用者或組身份
-p, --absolute-names:不要剝去“/”在路徑上

getfacl得到的顯示如下:

       The output format of getfacl is as follows:
               1:  # file: somedir/
               2:  # owner: lisa
               3:  # group: staff
               4:  # flags: -s-
               5:  user::rwx
               6:  user:joe:rwx               #effective:r-x
               7:  group::rwx                 #effective:r-x
               8:  group:cool:r-x
               9:  mask::r-x
              10:  other::r-x
              11:  default:user::rwx
              12:  default:user:joe:rwx       #effective:r-x
              13:  default:group::r-x
              14:  default:mask::r-x
              15:  default:other::---
3.setfacl

setfacl - 設定檔案存取控制列表
setfacl [-bkndRLPvh] [{-m|-x} acl_spec] [{-M|-X} acl_file] file ...
-m, --modify=acl:修改當前檔案的ACL
-M, --modify-file=file:讀取acl_file的ACL來修改file的ACL
-x, --remove=acl:移除ACL許可權
-X, --remove-file=file:讀取acl_file的ACL來移除file的ACL
-b, --remove-all:移除所有ACL
-k, --remove-default:移除預設的ACL
--set=acl:設定ACL來代替當前的ACL
--set-file=file:從檔案上讀取ACL來進行設定
--mask:重新計算有效的mask值
-n, --no-mask:不重新計算有效的mask值
-d, --default:對所有新建立的檔案都設定ACL
-R, --recursive:只對已經存在的檔案進行設定ACL
-L, --logical:logical walk, follow symbolic links
-P, --physical:physical walk, do not follow symbolic links
--restore=file:恢復 ACLs (inverse of getfacl -R')--test:測試許可權,ACL不被修改acl_spec:[d:] [u|g|o|m]:[uid|gid|]:[許可權] ,d為default,m為mask。acl_file`:是帶有ACL許可權的檔案

這裡列些例子大家可以試試:

setfacl -{m|x} u:wang:rwx {filed|directory}
setfacl -Rm g:sales:rwX directory
setfacl -{M|X} file.acl {file|directory}
setfacl -m d:u:wang:rx directory == setfacl -m -d u:wang:rx directory

4.補充

ACL檔案上的組許可權位上是mask的值,而非傳統的組許可權。
通過ACL賦予目錄預設的x許可權時,目錄內的檔案也不會繼承x許可權的。
mask只影響除所用者和other之外的人和組的最大許可權,使用者或組的設定必須存在於mask許可權設定的範圍內才可生效。一旦設定了ACL,mask許可權就是顯示在組許可權位上。mask需要與使用者的許可權進行邏輯與執行後,才能變成有效的許可權。
備份ACL:主要的檔案操作命令cpmv都支援ACL,只是cp命令需要加上-p選項,所以可以使用cp來備份。而tar等常見備份工具是不會保留目錄和檔案的ACL資訊的。使用重定向也可以把ACL許可權備份下來用來恢復:getfacl -R /tmp/dir1 > acl.txt
恢復ACL:cp的話是整個檔案,複製到所需的地方就可。如上所寫,/tmp/dir1的ACL許可權丟失的話,怎麼恢復?可以:setfacl -R --set-file=acl.txt /tmp/dir1 ; setfacl --restore=acl.txt ;getfacl -R /tmp/dir1

以上就是我所知道的有關許可權管理的相關資訊,這裡就沒有舉多少例子,畢竟寫再多也沒有自己動手學的快。若發現有錯誤的地方,請大家幫忙提出糾正,謝謝!

本文永久更新連結地址http://www.linuxidc.com/Linux/2017-10/147272.htm


IT145.com E-mail:sddin#qq.com