Linux系統中文件的ACL權限

管理員的工作中,相當重要的一環就是“管理賬號”。因爲整個系統都是你在管理,並且所有一般用戶的賬號申請必須要經過你的協助。在前兩篇博客中,我們分別介紹文件的基礎權限和特殊權限,也一直在強調權限的重用性,但是傳統的權限僅有三種身份(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

謝謝閱讀


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章