CentOS檔案許可權管理
目錄
檔案屬性
chown更改所有者
chgrp更改所屬組
檔案許可權rwx
chmod修改許可權
預設許可權umask
許可權判定的順序
特殊許可權SUID,SGID,sticky
隱藏許可權chattr,lstattr
ACL
在說許可權之前,我們應該簡單的瞭解檔案的屬性,和如何更改檔案屬性:
通過我們上面的圖片我們可以看出來檔案的一些基本屬性,有許可權,連結數,所有者和所屬組,檔案大小,修改時間,檔名等,我們先來介紹兩個用來更改所有者和所屬組的命令,然後對許可權的管理展開討論。
修改檔案所有者
命令:chown
格式:chown [option] newuser filename
選項:
-R 遞迴更改
--reference source target
對於chown來說,既可以更改所有者其實也可以更改所屬組,我們可以利用chown user:group filename直接更改所有者和所屬組,或者chown :group filename來更改所屬組,只不過,前者只能由root來完成,後者可以是普通使用者,但是使用者必須是檔案的所有者,並且還要是已經加入了目標組才可以。我們做一個簡單的演示:
接下來是chgrp用來修改所屬組的,這個命令是所有使用者都可以使用的,但是,使用者必須是檔案的所有者,並且屬於目標組才可以,否者不能更改,基本和上圖一樣,不在做演示。
修改所屬組
命令:chgrp
格式:chgrp [option] group filename
選項:
-R 遞迴更改
--reference source target 參照source修改target
接下來才是最重要的,許可權!我們知道每個檔案都有所有者,所屬組和其他人,而每一位都是有對應的許可權的,這樣的設計目的試問了保證隱私和檔案的安全,所有者對應的是u,所屬組對應的是g,其他人對應的是o,而每個檔案針對每一類訪問者都有三種基本許可權:r:Readable;w:Writable;x:eXcutable,我們通過對三類訪問者設定不同的rwx值就可以控制訪問者對檔案的許可權。
無論是對於檔案還是目錄,都是有rwx許可權,但是,目錄的rwx許可權卻和檔案的rwx許可權是不一樣的,此外對於目錄的設定還有一個X
--- 000 0
--x 001 1
-w- 010 2
-wx 011 3
r-- 100 4
r-x 101 5
rw- 110 6
rwx 111 7
在一般情況下,我們會選擇使用數字來更改許可權,例如742 = -rwxr--w-;621 = -rw--w---x
有許可權,自然可以修改許可權,下面我們來說一個更改檔案許可權的命令chmod。
修改檔案許可權
命令:chmod
格式:chmod [option] mode[,mode] filename
格式:
mode:修改一類許可權
u= g= o= ug= uo= go= ugo=
mode:修改一些使用者的某個許可權
u+ u- g+ g- o+ o-
--reference source target參照source修改target
-R遞迴修改許可權
我們可以通過上面的方式對檔案許可權進行修改,為了方便,我們也可以通過使用數字來對許可權進行修改,比如:chmod 744 test1.txt。
我們剛才說,還有一個針對於目錄的大X許可權,這是啥嘞,這是由於我們我們會修改目錄許可權至少為x,但是,我們如果進行遞迴修改的話,會把檔案也設定成x許可權,由於x對於檔案來說是可執行許可權,很不安全,所以我們在遞迴修改目錄許可權時,可以使用X許可權,這樣就不會將目錄下面的檔案加上x許可權了,可是如果我們目錄下的某一個檔案無論所有者所屬組還是其他人只有有一個用於x許可權,使用X修改目錄許可權時依然會將此檔案所有者所屬組和其他人都加上x許可權。但是一般情況下我們可以不用X許可權的,因為給目錄的預設許可權是有x許可權的,什麼是預設許可權,我們在下面來講。
我們無論是新建檔案還是目錄,當我們建好後都會有一些預設的許可權,(root的預設許可權和普通使用者的不同),這些預設許可權是哪裡來的呢,為什麼要這樣設定預設許可權?首先我們先說哪裡來的,我們可以使用umask檢視當前使用者的預設許可權,如果你是一般使用者,你會發現預設許可權是0002 root使用者是0022,後三位是普通許可權位,第一位是特殊許可權位,我們先來說普通許可權位。當umask中全部是偶數時,可以直接減,當umask中包含奇數時,對於目錄直接減,對於檔案,在奇數所在的位減完後加一。預設全域性配置檔案在/etc/bashrc中:(個人配置在~/.bashrc)
這時候我們會感覺很奇怪,為啥呢,以root使用者來說,我們預設的許可權是022,但是我們的建立的目錄許可權是755:rwxr-xr-x,這是為啥嘞,我們先說一下,檔案的最高許可權是666,即:rw-rw-rw-,目錄的最高許可權是777即:rwxrwxrwx,當我們用777-755 我們發現正好是022,正好是預設許可權,預設許可權正是最高許可權-實際許可權的。
接下來,我們來說作用於目錄和檔案的許可權都有什麼作用:
普通檔案
r: 可以讀取檔案的內容
cat less more nano vim 執行指令碼
w: 可以修改檔案的內容
nano vim > >> tee gedit
x: 可以執行該檔案
執行指令碼
目錄檔案
r: 使用者可以列出目錄下有哪些檔案(不能檢視檔案的詳細資訊)
w: 只有w無意義。
x: 使用者可以進入該目錄(如果知道檔名,且有相對應的檔案許可權 ,可以執行對應的操作)
rx: 使用者可以進入目錄,且可以長列出。
rw:等於只有r
wx: 能進入,能建立能刪除,不能列出。故使用者能否刪除檔案與檔案自身許可權無關。
rwx: 全部許可權。
---:null
我們可以看出,檔案和目錄的許可權的作用是有很大區別的,我們即便對檔案有全許可權,如果對它的目錄沒有足夠的許可權的話,我們還是無法對檔案進行增刪查改,更何況他們還是有所有者,所屬組和其他人的區別。比如:當我們想檢視一個目錄下的某一個檔案內容時,我們至少要對目錄有什麼許可權,對檔案有什麼許可權?由我們上面的總結我們知道,我們對目錄至少有一個x許可權,對檔案至少有r許可權,這樣雖然我們無法看到目錄下有什麼檔案,但是我們知道有一個我們知道的檔案就在該目錄下,我們依舊可以使用工具檢視:
許可權判斷的順序
先判斷是否是檔案的所有人,如果是,則執行所屬人的許可權後結束,如果不是所有人,則判斷是否所屬組(可以是主組也可以是輔助組),如果是,則執行所屬組的許可權後結束,如果不是則執行其他人的許可權後結束。
所有人->所有組->其他人
特殊許可權
除了普通許可權外,我們的檔案還是有特殊許可權的,比如我們常見的檔案/etc/shadow檔案,我們發現它的許可權是---------,可是我們作為普通使用者還是可以進行修改自己的密碼,這就意味著我們修改了shadow的內容,這是為什麼呢,我們知道root這個大變態即便對檔案沒有任何許可權,依舊可以修改檢視它,所以,這會不會和root有關呢?我們在修改密碼時不是直接對檔案修改,而是使用命令passwd對shadow進行修改的,而passwd這個程式所屬組和所有者都是root,這是意味著我們可能是臨時借用了root這個上帝之手對我們的密碼進行修改的,我們在看看passwd的許可權:
我們看到了什麼東西?在root所有者的x位居然變成了s,這是什麼呢,這就是特殊許可權之一SUID許可權。suid 當對一個可執行的二進位制檔案作用了SUID許可權之後,任何擁有執行該檔案許可權的人,在執行的過程時都臨時擁有該檔案所屬人的許可權。這下我們就該知道為什麼我們可以用passwd命令修改對於我們沒有任何許可權的shadow了吧。因為我們臨時獲取了passwd的root所有者的許可權,我們是在以root的身份在修改我們的密碼呀!!!
除了SUID還有SGID。sgid 當對一個可執行的二進位制檔案作用了SGID許可權之後,任何擁有執行該檔案許可權的人,在執行的過程時都臨時擁有該檔案所屬組的許可權。 當對一個目錄作用了SGID許可權之後,任何對該目錄有wx許可權的使用者在該目錄下建立的檔案及目錄的所有屬均為該目錄的所有組。對於第二個作用,我們做一個測試:
Html目錄屬於HTML組,而redhat使用者也有HTML附加組,然後我們在HTML中建立檔案:
此時我們發現如果僅作為一個組使用者進入改組,建立的檔案所屬組依然是自己的,作為同組的其他使用者還是無法修改,接下來我們加上SGID許可權chmod 2770 html:
這時候我們發現,Redhat使用者建立的檔案所屬組變成了HTML,這就是SGID的作用之一,作為同組的人員,我們可以對此檔案進行修改,團隊合作起來更方便。
接下來我們看特殊許可權的最後一個sticky,它的作用是當對一個目錄使用了sticky之後(只限制組使用者,目錄的owner不受影響),該目錄下的檔案僅其所屬人才能刪除。屬於這個組的其他成員可以對目錄下的檔案檢視,修改,就是無法刪除。
我們之前說預設許可權有4位比如root的預設許可權是0022,最前面的那個是特殊許可權,由於特殊許可權預設是什麼都沒有,所以是0,我們剛剛的演示其實也可以看出,設置特殊許可權是SUID對應的是4,SGID對應的2,sticky對應的是1,還有就是我們發現特殊許可權居然有大寫的,這是為什麼呢,我們可以看到,三個特殊許可權都是在x位上,為了區分許可權,如果在某一位有x許可權,對應的特殊許可權就是小寫的,如果沒有x許可權,對應的特殊許可權就是大寫的,三個許可權分別是sS,sS,tT。
隱藏許可權
對於隱藏許可權,我們不會說太多,說兩個我們平時最常用的選項:
設定:
命令:chattr
格式:chattr [option] filename
格式:
+i不能刪除不能改
+a不能刪除,只能追加
這設定就厲害了,就連我們的root也無法改變,其實他就是為了防止root誤操作而刪除檔案的,我們還可以利用lsattr進行檢視:
ACL許可權管理
為了滿足我們對細化許可權的設定,在linux系統中添加了ACL許可權,用於對單個使用者或者單個組進行經典的rwx許可權設定,在centOS6中建立了新的分割槽後需要我們單獨進行ACL功能的新增才可以使用,我們也不能將一個具有ACL許可權的檔案或目錄拷貝到還沒有使用ACL的分割槽上面,centOS7的xfs檔案系統時自動啟動ACL功能的。
ACL許可權的設定與取消
如何設定ACL許可權,我們需要知道ACL是針對於使用者和組進行設定的,對其他人無效,並且ACL目標是檔案或目錄。
對於使用者設定,我們使用的命令是:setfacl –m u:username:rwx /path/filename,在我們針對目錄或檔案設定完ACL許可權以後,我們可以通過getfacl命令檢視我們設定的ACL許可權。
我們可由上圖看到,在設定完ACL許可權時,其他人的許可權位後多了有個“+”,這就是ACL許可權的標誌。在我們顯示出的tty.txt的ACL許可權裡,我們看到#號後面的是我們本檔案的原本資訊,並且,設定完ACL許可權以後,mask就會佔領g位,所以我們要是直接設定
setfacl –m g::rw filename的話其實就是在設定mask,所以,當我們在設定完ACL許可權後,除非我們刪除全部的ACL許可權,否則,無法在對使用者的g位設定任何許可權。
我們在針對某一目錄設定完ACL許可權之後,能不能在目錄下建立檔案讓它也具有相同的ACL許可權呢?我們看一下:
我們以實際行動說明了使用setfacl –m u:username:rwx /path/filename設定完許可權後,我們對其目錄一下的檔案都不能繼承父目錄的ACL許可權,咋辦?好辦,我們可以使用setfacl –mR d:u:username:rw /path/filename來對目錄設定這個許可權,這樣的話,目錄下面的檔案和新目錄也能繼承父目錄的ACL許可權了,但是有一點需要注意,我們使用setfacl –m u:username:rwx /path/filename和設定它下面的檔案的ACL許可權是有一點不一樣的,因為我們需要進入目錄後檢視修改子檔案,所有我們在設定目錄的ACL許可權時,一定要注意,如果需要進入目錄的話ACL許可權應該加上x;
對使用者的ACL許可權設定我們已經看到了,對組的ACL設定同樣是如此:
setfacl –m g:username:rwx /path/filename
setfacl –mR g:u:username:rw /path/filename
ACL許可權判斷的順序
先判斷是否是檔案的OWNER,如果是,則執行OWNER的許可權後結束,如果不是OWNER,則判斷是否是ACL的USER,如果是則執行USER許可權後結束,如果不是ACL的USER, 則判斷是否屬於GROUP或ACL GROUP,如果是,則取最大許可權。如果不屬於任何GROUP,則執行OTHER。
所有人->所有組->其他人
還有剛才那個mask,他是對最大許可權的設定,我們一般不會管他,我們在設定ACL許可權時,它是預設隨著我們ACL許可權的設定而變化的,保證我們設定的每個許可權都能生效,如果我們想限定最大許可權,我們可以在設定完所有ACL許可權時,對它進行設定。
設定命令:setfacl -m mask:rwx f1
ACL許可權的其他引數和取消設定
base ACL 不能刪除
setfacl -k dir 刪除預設ACL許可權
setfacl --set u::rw,u:wang:rw,g::r,o::- file1
setfacl -M acl.txt f1[dir1]
acl.txt 內容來自getfacl f1 > acl.txt,如下
# file: fstab
# owner: root
# group: root
user::rw-
user:zhangfei:rwx
group::r--
mask::rwx
other::r—
setfacl -x u:liubei f1單獨去除一條ACL許可權
setfacl -X aclrm.txt f1[ f2 f3 *]
aclrm.txt 內容如下
u:liubei
g:shuguo
setfacl -b f1 去除該檔案上ACL屬性。
備份和恢復ACL
主要的檔案操作命令cp和mv都支援ACL,只是cp命令需要加上-p 引數。但是tar等常見的備份工具是不會保留目錄和檔案的ACL資訊
備份ACL許可權資訊
getfacl -R /tmp/dir1 > acl.txt
setfacl -R -b /tmp/dir1(刪除ACL許可權)
還原ACL許可權資訊
setfacl -R --set-file=acl.txt /tmp/dir1
setfacl --restore acl.txt