ACL(Access Control List)即訪問控制列表。主要是針對單一用戶,單一文件或目錄進行rwx權限的細部設定。可以針對用戶(User)、群組(Group)、默認屬性掩碼(mask)進行設置。
ACL是Linux系統權限額外支持的一項功能,需要文件系統的支持,例如:ReiserFS , EXT2 , EXT3 , EXT4 , JFS , XFS等都支持ACL功能。
*擁有ACL功能:
- [root@rhel6 ~]# mount -o acl /dev/iscsi/sharedisk /data/
- [root@rhel6 ~]# mount | grep sharedisk
- /dev/mapper/iscsi-sharedisk on /data type ext4 (rw,acl)
- 注:如果是用tune2fs命令啟用分區的ACL功能,用mount命令是看不到的.
- [root@rhel6 ~]# tune2fs -o acl /dev/iscsi/sharedisk
- [root@rhel6 ~]# tune2fs -l /dev/iscsi/sharedisk | grep -i "default mount option"
- Default mount options: acl
- [root@rhel6 ~]# umount /data/
- [root@rhel6 ~]# mount /dev/iscsi/sharedisk /data/
- [root@rhel6 ~]# mount | grep sharedisk
- /dev/mapper/iscsi-sharedisk on /data type ext4 (rw)
ACL相關設置命令
getfacl:獲取文件或目錄的ACL設置信息.
setfac:設置文件或目錄的ACL設置信息.
chacl:同setfacl,也是用來設定ACL設置信息(不常用).
- [root@rhel6 data]# setfacl --help
- setfacl 2.2.49 -- set file access control lists
- Usage: setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...
- -m, --modify=acl 更改文件或目錄的ACL規則
- -M, --modify-file=file 從一個文件讀入ACL設置信息並以此為模版修改當前文件或目錄的ACL規則
- -x, --remove=acl 刪除文件或目錄指定的ACL規則
- -X, --remove-file=file 從一個文件讀入ACL設置信息並以此為模版刪除當前文件或目錄的ACL規則
- -b, --remove-all 刪除文件或目錄所有的ACL規則
- -k, --remove-default 刪除文件或目錄默認的ACL規則
- --set=acl 設置當前文件的ACL規則
- --set-file=file 從文件讀入ACL規則來設置當前文件或目錄的ACL規則
- --mask 重新計算有效權限,即使ACL mask被明確指定
- -n, --no-mask 不要重新計算有效權限。setfacl默認會重新計算ACL mask,除非mask被明確的制定
- -d, --default 設置目錄默認的ACL規則(只對目錄有效)
- -R, --recursive 遞歸處理
- -L, --logical logical walk, follow symbolic links
- -P, --physical physical walk, do not follow symbolic links
- --restore=file restore ACLs (inverse of `getfacl -R')
- --test test mode (ACLs are not modified)
注:設置了ACL的目錄或文件,在屬性的最後一位會出現一個“+”號,查看文件或目錄所屬群組的准確權限應該使用getfacl命令。
- 目錄:
- [root@rhel6 data]# mkdir acl_dir
- [root@rhel6 data]# ll -d acl_dir
- drwxr-xr-x. 2 root root 1024 Mar 24 10:29 acl_dir/
- [root@rhel6 data]# getfacl acl_dir/
- # file: acl_dir
- # owner: root "基本規則"
- # group: root
- user::rwx
- group::r-x "缺省規則"
- other::r-x
- [root@rhel6 data]# su - user1
- [user1@rhel6 ~]$ touch /data/acl_dir/acl_user1
- touch: cannot touch `/data/acl_dir/acl_user1': Permission denied //user1用戶對acl_dir目錄不具有寫權限,無法創建文件
- [user1@rhel6 ~]$ exit
- [root@rhel6 data]# setfacl -m u:user1:rwx acl_dir/ //賦予user1用戶對acl_dir目錄具有讀寫執行的權限
- [root@rhel6 data]# getfacl --all-effective acl_dir/
- # file: acl_dir
- # owner: root
- # group: root
- user::rwx
- user:user1:rwx #effective:rwx
- group::r-x #effective:r-x
- mask::rwx
- other::r-x
- [root@rhel6 data]# su - user1
- [user1@rhel6 ~]$ touch /data/acl_dir/acl_user1 //可成功創建文件
- [user1@rhel6 ~]$ ll -d /data/acl_dir/ //acl_dir目錄屬性後面多了一個"+"
- drwxr-xr-x+ 2 root root 1024 Mar 24 10:33 /data/acl_dir/
- 注:對於目錄而言,必須給予可執行的權限,否則無法cd到對應的目錄中
-
- 文件:
- [root@rhel6 data]# touch acl_file
- [root@rhel6 data]# getfacl acl_file
- # file: acl_file
- # owner: root
- # group: root
- user::rw-
- group::r--
- other::r--
- [root@rhel6 data]# su - user1
- [user1@rhel6 ~]$ echo "access test" > /data/acl_file
- -bash: /data/acl_file: Permission denied //user1用戶對acl_file文件不具有寫權限
- [root@rhel6 data]# setfacl -m u:user1:rw acl_file //賦予user1用戶對acl_file文件的讀寫權限
- [root@rhel6 data]# getfacl --all-effective acl_file
- # file: acl_file
- # owner: root
- # group: root
- user::rw-
- user:user1:rw- #effective:rw-
- group::r-- #effective:r--
- mask::rw-
- other::r--
- [root@rhel6 data]# su - user1
- [user1@rhel6 ~]$ echo "access test" > /data/acl_file //可成功寫入acl_file文件
- [user1@rhel6 data]$ cat acl_file
- access test
- [user1@rhel6 ~]$ ll /data/
- total 16
- drwxrwxr-x+ 2 root root 1024 Mar 24 10:33 acl_dir
- -rw-rw-r--+ 1 root root 12 Mar 24 10:39 acl_file
- drwx------. 2 root root 12288 Mar 24 10:24 lost+found
- mask:
- [root@rhel6 data]# setfacl -m m:r acl_dir/
- [root@rhel6 data]# getfacl acl_dir/
- # file: acl_dir
- # owner: root
- # group: root
- user::rwx
- user:user1:rwx #effective:r--
- group::r-x
- mask::r--
- other::r-x
- [root@rhel6 data]# su - user1
- [user1@rhel6 data]$ cd acl_dir/
- -bash: cd: acl_dir/: Permission denied
-
- 由於user1用戶在這個目錄上沒有x權限,所以連這個目錄都不能進入,盡管我們已經賦予user1用戶rwx的ACL設置信息。
- 最終權限由mask控制,權限必須在mask內��否則相對mask多出來的權限也是無效的。
- [root@rhel6 data]# mkdir dir
- [root@rhel6 data]# setfacl -d -m u:user1:rwx dir/ //讓dir/目錄下的所有文件和目錄繼承dir/目錄的ACL設置信息
- [root@rhel6 data]# getfacl dir/
- # file: dir/
- # owner: root
- # group: root
- user::rwx
- group::r-x
- other::r-x
- default:user::rwx
- default:user:user1:rwx
- default:group::r-x
- default:mask::rwx
- default:other::r-x
- [root@rhel6 data]# touch dir/test
- [root@rhel6 data]# getfacl dir/test //dir目錄中創建的文件user1用戶同樣具有rwx權限
- # file: dir/test
- # owner: root
- # group: root
- user::rw-
- user:user1:rwx #effective:rw-
- group::r-x #effective:r--
- mask::rw-
- other::r--
- [root@rhel6 data]# setfacl -x u:user1 acl_file //移除acl_file中的user1的ACL設置
- [root@rhel6 data]# getfacl acl_file
- # file: acl_file
- # owner: root
- # group: root
- user::rw-
- group::r--
- mask::r--
- other::r--
- [root@rhel6 data]# ll acl_file
- -rw-r--r--+ 1 root root 12 Mar 24 10:39 acl_file //文件屬性的"+"依然存在
- [root@rhel6 data]# setfacl -b acl_file //移除acl_file中所有的ACL設置
- [root@rhel6 data]# getfacl acl_file
- # file: acl_file
- # owner: root
- # group: root
- user::rw-
- group::r--
- other::r--
- [root@rhel6 data]# ll acl_file
- -rw-r--r--. 1 root root 12 Mar 24 10:39 acl_file //文件屬性的"+"已還原成"."
- [root@rhel6 data]# getfacl dir/ > acl.bak //導出dir目錄的ACL設置信息
- [root@rhel6 data]# setfacl --set-file=acl.bak acl_dir/ //將ACL設置信息導入acl_dir目錄
- [root@rhel6 data]# getfacl acl_dir/
- # file: acl_dir/
- # owner: root
- # group: root
- user::rwx
- group::r-x
- other::r-x
- default:user::rwx
- default:user:user1:rwx
- default:group::r-x
- default:mask::rwx
- default:other::r-x