管理員的工作中,相當重要的一環就是“管理賬號”。因爲整個系統都是你在管理,並且所有一般用戶的賬號申請必須要經過你的協助。在前兩篇博客中,我們分別介紹文件的基礎權限和特殊權限,也一直在強調權限的重用性,但是傳統的權限僅有三種身份(ower、group、others)搭配讀、寫、執行(r、w、x)三種權限,並不能單純針對某一個用戶或某一個組來設置特定的權限需求,這時我沒就不得不使用ACL(訪問控制列表)了。
一、什麼是 ACL
ACL是 Access Control List 的縮寫,主要是目的是提供除屬主、屬組、其他人基本權限之外的具體權限設置。ACL 可以針對單一用戶、單一文件或目錄來進行r、w、x權限的設置,對於需要特殊權限的使用情況非常有用。ACL 主要針對以下幾個情況:
用戶(user):可針對用戶來設置權限;
用戶組(group):可針對用戶組來設置權限;
默認屬性(mask):可設置該目錄下新建新文件、目錄時設置新數據的默認權限;
二、啓動 ACL
上面介紹了ACL權限的設置對象及設置場景,那麼如何讓你的文件支持ACL呢,接下來帶大家看看。
由於 ACL 是傳統的UNIX-like(類UNIX)操作系統權限的額外支持項目,因此要使用 ACL 必須要有文件系統的支持才行。目前絕大部分的文件系統都有支持 ACL 權限的功能,最新的CentOS 7 操作系統默認創建分區並寫入文件系統時會附加 ACL 屬性,CentOS 6 中新建的分區並寫入文件系統默認不會添加acl屬性。
查看 ACl 屬性
查看分區是否就有 acl 權限我們可以使用 tune2fs 命令:
[root@centos7 /]# [root@centos7 /]# mount /dev/sdb3 /mnt # 查看時,必須將分區掛載起來 [root@centos7 /]# tune2fs -l /dev/sdb3 tune2fs 1.42.9 (28-Dec-2013) Filesystem volume name: <none> Last mounted on: <not available> Filesystem UUID: 9a9bac28-da60-4351-a21f-c6529385e944 # 分區UUID號碼,唯一表示符 Filesystem magic number: 0xEF53 Filesystem revision #: 1 (dynamic) Filesystem features: has_journal ext_attr resize_inode ...後面省略 # 文件系統特性 Filesystem flags: signed_directory_hash Default mount options: user_xattr acl # 具有acl權限 ...中間省略... Journal backup: inode blocks [root@centos7 /]#
使用tune2fs命令可以查看文件是否具有acl屬性,但對於自身默認沒有附加acl的分區,我們如何添加權限並查看呢?tune2fs其實查看的是分區超級塊的信息。
#.*.---------mount命令查看掛載屬性-----------.*.# [root@centos7 /]# mount ...省略... /dev/sdc1 on /app type xfs (rw) # 沒有acl權限,即默認掛載時不攜帶acl權限 ...省略... #.*.---------mount臨時添加acl權限-----------.*.# [root@centos7 /]# mount -o remount,acl /dev/sda3 # 給/dev/sdc3這個新分區添加acl權限 [root@centos7 /]# mount ...省略... /dev/sdc1 on /app type xfs (rw,acl) # 添加acl權限成功,這裏只是臨時生效, ...省略... [root@centos7 /]# #.*.---------acl屬性永久有效-----------.*.# [root@centos7 /]# vim /etc/fstab 在文件最後追加以下條目並保存退出: UUID=939ea6b9-9aa5-421c-908f-73691670ab75 /mnt/sdc1 ext4 defaults 0 0 [root@centos7 /]# mount -a # 重新加載/etc/fstab文件中的掛載信息,這樣下次啓動就生效了 [root@centos7 /]#
說明:
用mount單純的取查閱不見得能看到實際的選項,由於目前新的distributions經常會加入某些默認的功能
mount -o remount(acl,rw,ro,nodev...) :表示重新掛載並添加屬性,具體會在後續的磁盤管理中說明
/etc/fstab 是掛載條目的配置文件:從左到右的每段含義分別是:
設備名(UUID、/dev/sd*、卷標名) 掛載目錄 文件系統類型 權限 備份頻率 是否開機檢查
分區格式化後就會給分配一個UUID,他能唯一標識該分區;可使用命令blkid查看
三、ACL的設置
保證了文件系統啓用了ACL支持之後,接下來便是如何設置ACL屬性了,ACL屬性的設置主要包括添加ACL屬性和讀取ACL權限,以及ACL的備份與恢復。
1、設置acl
設置ACL即添加ACL權限,使用 setfacl 命令來實現,下面看看 setfacl 的用法
[root@centos7 /]# setfacl -[mbkdR... ][-m|-x acl參數 ] file(目標文件)
選項:
-m : 設置後續的 acl 參數給文件使用,不可與 -x 一起使用
-b : 刪除說有 acl 設置參數
-x : 刪除後續的 acl 參數,不可與 -m 合併
-k : 刪除默認的 acl 參數
-d : 設置默認的 acl 參數,只對目錄有效,在該目錄新建的數據會引用此默認選項
-R : 遞歸設置 acl,子目錄都會繼承該屬性
我們知道ACL的設置有很多種,包括單一用戶ACL設置、組ACL設置、以及目錄ACL設置;其具體用法如下:
#.*.---------單一用戶設置ACL-----------.*.# [root@centos7 ~]# cd /app [root@centos7 app]# touch 1.txt # 創建一個文件1.txt [root@centos7 app]# ll 1.txt -rw-r--r--. 1 root root 0 Aug 10 14:41 1.txt # 查看文件屬性爲基本屬性 [root@centos7 app]# setfacl -m u:harry:rx 1.txt # 設置harry用戶在該文件上的權限爲rx [root@centos7 app]# ll 1.txt -rw-r-xr--+ 1 root root 0 Aug 10 14:41 1.txt # 再次查看文件,權限部分多了個 + ,而且組權限發生了改變 #.*.---------所有用戶設置ACL-----------.*.# [root@centos7 app]# setfacl -m u::rwx 1.txt [root@centos7 app]# ll 1.txt -rwxr-xr--+ 1 root root 0 Aug 10 14:41 1.txt [root@centos7 app]# #.*.------------組設置ACL-----------.*.# [root@centos7 app]# set -m g:t1:rx 1 # 設置 t1 組在該文件上的ACl權限爲ro(只讀) [root@centos7 app]# ll 1.txt -rw-r-xr--+ 1 root root 0 Aug 10 14:41 1.txt # 發現看不出什麼變化 [root@centos7 app]#
說明:上述設置文件的ACL屬性,我們只能宏觀的看到,組權限發生了改變,並且在權限位後面多了一個 + ,但我們確不能詳細的看到具體的 ACL 權限。
2、讀取acl
讀取一個文件的 ACL 權限,我們使用命令 getfacl ,該命令能詳細的查看文件的 ACL 信息。getfacl 的用法幾乎和setfacl相同,我們以實例來理解:
[root@centos7 app]# getfacl 1.txt # 獲取1.txt文件的 ACL 信息 # file: 1.txt # 文件名 # owner: root # 文件的屬主 # group: root # 文件的屬組 user::rwx # 用戶列表爲空,代表文件屬主的權限 user:harry:r-x # 針對用戶harry的權限設置爲rx group::r-- # 組列表爲空,代表文件屬組的權限 group:t1:r-- # 上面設置過 t1 組的權限,所以在這裏顯示出來了 mask::r-x # 此文件默認的有效權限,此選項可控制權限的上限 other::r-- # 其他人擁有的權限 [root@centos7 app]#
說明:通過getfacl命令查閱到的文件的 ACL 屬性 ,更加詳細。數據前面帶 # 的,表示該文件的默認屬性,包括文件名、文件屬主、文件屬組。而未加 # 的行則代表不同用戶、用戶組的有效權限。
3、mask值含義及作用
ACL屬性中的mask值定義了自定義用戶、自定義組,擁有組能夠使用的最大屬性,相當於一個限高線,該mask值與文件屬組的權限是由關係的,當你改變mask值時,文件的屬組權限也會做相應的改變。
[root@centos7 app]# setfacl -m mask:r 1.txt # 設置mask值爲r [root@centos7 app]# getfacl 1.txt # 查看ACL屬性 # file: 1.txt # owner: root # group: root user::rwx user:harry:r-x #effective:r-- # harry組最高權限爲r group::r-- mask::r-- other::r-- [root@centos7 app]# setfacl -m mask:- 1.txt # 設置mask值爲空 [root@centos7 app]# getfacl 1.txt # file: 1.txt # owner: root # group: root user::rwx user:harry:r-x #effective:--- # 由於mask值爲空,所以有效的權限也就爲空,即不具有任何權限 group::r-- #effective:--- mask::--- other::r-- [root@centos7 app]# ll 1.txt -rwx---r--+ 1 root root 0 Aug 10 14:41 1.txt # 查看文件的屬性,發現屬組的權限也發生了相應改變 [root@centos7 app]#
說明
harry用戶的權限和mask的值的交集爲 r ,因此 harry 用戶只有 r (讀)權限
mask值規定可最大有有效權限,這樣可以避免不小心開放某些權限個其他用戶或用戶組
個人建議可以給mask的只爲rwx ,這樣只用對用戶或用戶組單獨設置ACL屬性即可
4、acl的備份和恢復
acl權限的備份和恢復主要是通過複製,移動、重定向來實現的。但需要注意的是:主要的文件操作命令cp和mv都支持ACL,但是使用cp命令時需要加上-p參數。像tar等常見的備份工具是不會保留目錄和文件的acl信息的。
#.*.------------備份ACL-----------.*.# [root@centos7 app]# getfacl -R 1.txt >acl.bak # 獲得1.txt文件的ACL信息重定向到acl.bak文件中 [root@centos7 app]# cat acl.bak # 查看acl.bak內容,其結果和 getfacl 1.txt 結果一致,說明備份成功 # file: 1.txt # owner: root # group: root user::rwx user:harry:r-x #effective:--- group::r-- #effective:--- mask::--- other::r-- #.*.-----------恢復ACL-----------.*.# [root@centos7 app]# setfacl -R -b 1.txt # 備份前先清空文件的ACL信息 [root@centos7 app]# getfacl 1.txt # 再次查看,發現ACL權限回到了原始狀態 # file: 1.txt # owner: root # group: root user::rwx group::--- other::r-- [root@centos7 app]# setfacl -R --set-file=acl.bak 1.txt # 用acl.bak文件恢復1.txt的ACL信息 [root@centos7 app]# getfacl 1.txt # 再次查看,權限又重新迴歸 # file: 1.txt # owner: root # group: root user::rwx user:harry:r-x #effective:--- group::r-- #effective:--- mask::--- other::r-- [root@centos7 app]#
說明:恢復文件ACL屬性的方法不僅侷限於上述實例中的方法,還可以使用:
setfacl --restore acl.txt
謝謝閱讀!