ACL(Access Control List)即访问控制列表。主要是针对单一用户,单一文件或目录进行rwx权限的细部设定。可以针对用户(User)、群组(Group)、默认属性掩码(mask)进行设置。
ACL是Linux系统权限额外支持的一项功能,需要文件系统的支持,例如:ReiserFS , EXT2 , EXT3 , EXT4 , JFS , XFS等都支持ACL功能。
 
*拥有ACL功能:
  1. [root@rhel6 ~]# mount -o acl /dev/iscsi/sharedisk /data/  
  2. [root@rhel6 ~]# mount | grep sharedisk  
  3. /dev/mapper/iscsi-sharedisk on /data type ext4 (rw,acl)  
  4.   
  5. 注:如果是用tune2fs命令启用分区的ACL功能,用mount命令是看不到的.  
  6. [root@rhel6 ~]# tune2fs -o acl /dev/iscsi/sharedisk  
  7. [root@rhel6 ~]# tune2fs -l /dev/iscsi/sharedisk | grep -i "default mount option"  
  8. Default mount options:    acl  
  9. [root@rhel6 ~]# umount /data/ 
  10. [root@rhel6 ~]# mount /dev/iscsi/sharedisk /data/ 
  11. [root@rhel6 ~]# mount | grep sharedisk  
  12. /dev/mapper/iscsi-sharedisk on /data type ext4 (rw)  
ACL相关设置命令
getfacl :获取文件或目录的ACL设置信息.
setfac :设置文件或目录的ACL设置信息.
chacl :同setfacl,也是用来设定ACL设置信息(不常用).
  1. [root@rhel6 data]# setfacl --help 
  2. setfacl 2.2.49 -- set file access control lists 
  3. Usage: setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ... 
  4.   -m, --modify=acl       更改文件或目录的ACL规则 
  5.   -M, --modify-file=file  从一个文件读入ACL设置信息并以此为模版修改当前文件或目录的ACL规则 
  6.   -x, --remove=acl       删除文件或目录指定的ACL规则 
  7.   -X, --remove-file=file  从一个文件读入ACL设置信息并以此为模版删除当前文件或目录的ACL规则 
  8.   -b, --remove-all       删除文件或目录所有的ACL规则 
  9.   -k, --remove-default   删除文件或目录默认的ACL规则 
  10.       --set=acl      设置当前文件的ACL规则 
  11.       --set-file=file    从文件读入ACL规则来设置当前文件或目录的ACL规则 
  12.       --mask             重新计算有效权限,即使ACL mask被明确指定 
  13.   -n, --no-mask      不要重新计算有效权限。setfacl默认会重新计算ACL mask,除非mask被明确的制定 
  14.   -d, --default      设置目录默认的ACL规则(只对目录有效) 
  15.   -R, --recursive        递归处理 
  16.   -L, --logical      logical walk, follow symbolic links 
  17.   -P, --physical         physical walk, do not follow symbolic links 
  18.       --restore=file      restore ACLs (inverse of `getfacl -R') 
  19.       --test             test mode (ACLs are not modified) 

注:设置了ACL的目录或文件,在属性的最后一位会出现一个“+”号,查看文件或目录所属群组的准确权限应该使用getfacl命令。

 
  1. 目录: 
  2. [root@rhel6 data]# mkdir acl_dir 
  3. [root@rhel6 data]# ll -d acl_dir 
  4. drwxr-xr-x. 2 root root 1024 Mar 24 10:29 acl_dir/ 
  5. [root@rhel6 data]# getfacl acl_dir/ 
  6. # file: acl_dir  
  7. # owner: root           "基本规则" 
  8. # group: root   
  9. user::rwx        
  10. group::r-x           "缺省规则" 
  11. other::r-x        
  12.  
  13. [root@rhel6 data]# su - user1 
  14. [user1@rhel6 ~]$ touch /data/acl_dir/acl_user1 
  15. touch: cannot touch `/data/acl_dir/acl_user1': Permission denied  //user1用户对acl_dir目录不具有写权限,无法创建文件
  16. [user1@rhel6 ~]$ exit 
  17. [root@rhel6 data]# setfacl -m u:user1:rwx acl_dir/  //赋予user1用户对acl_dir目录具有读写执行的权限
  18. [root@rhel6 data]# getfacl --all-effective acl_dir/ 
  19. # file: acl_dir  
  20. # owner: root 
  21. group: root    
  22. user::rwx 
  23. user:user1:rwx          #effective:rwx 
  24. group::r-x           #effective:r-x 
  25. mask::rwx    
  26. other::r-x 
  27. [root@rhel6 data]# su - user1 
  28. [user1@rhel6 ~]$ touch /data/acl_dir/acl_user1  //可成功创建文件
  29. [user1@rhel6 ~]$ ll -d /data/acl_dir/ //acl_dir目录属性后面多了一个"+"
  30. drwxr-xr-x+ 2 root root 1024 Mar 24 10:33 /data/acl_dir/
  31. 注:对于目录而言,必须给予可执行的权限,否则无法cd到对应的目录中
  32.  
  33. 文件: 
  34. [root@rhel6 data]# touch acl_file 
  35. [root@rhel6 data]# getfacl acl_file  
  36. # file: acl_file 
  37. # owner: root 
  38. group: root 
  39. user::rw- 
  40. group::r-- 
  41. other::r-- 
  42. [root@rhel6 data]# su - user1 
  43. [user1@rhel6 ~]$ echo "access test" > /data/acl_file
  44. -bash: /data/acl_file: Permission denied   //user1用户对acl_file文件不具有写权限
  45.  
  46. [root@rhel6 data]# setfacl -m u:user1:rw acl_file   //赋予user1用户对acl_file文件的读写权限
  47. [root@rhel6 data]#  getfacl --all-effective acl_file  
  48. # file: acl_file 
  49. # owner: root 
  50. group: root 
  51. user::rw- 
  52. user:user1:rw-          #effective:rw- 
  53. group::r--           #effective:r-- 
  54. mask::rw- 
  55. other::r-- 
  56.  
  57. [root@rhel6 data]# su - user1 
  58. [user1@rhel6 ~]$ echo "access test" > /data/acl_file  //可成功写入acl_file文件
  59. [user1@rhel6 data]$ cat acl_file  
  60. access test 
  61.  
  62. [user1@rhel6 ~]$ ll /data/ 
  63. total 16 
  64. drwxrwxr-x+ 2 root root  1024 Mar 24 10:33 acl_dir 
  65. -rw-rw-r--+ 1 root root    12 Mar 24 10:39 acl_file 
  66. drwx------. 2 root root 12288 Mar 24 10:24 lost+found 
  67.  
  68. mask: 
  69. [root@rhel6 data]# setfacl -m m:r acl_dir/ 
  70. [root@rhel6 data]# getfacl acl_dir/  
  71. # file: acl_dir 
  72. # owner: root 
  73. group: root 
  74. user::rwx 
  75. user:user1:rwx                      #effective:r-- 
  76. group::r-x 
  77. mask::r-- 
  78. other::r-x 
  79.  
  80. [root@rhel6 data]# su - user1 
  81. [user1@rhel6 data]$ cd acl_dir/ 
  82. -bash: cd: acl_dir/: Permission denied 
  83.  
  84. 由于user1用户在这个目录上没有x权限,所以连这个目录都不能进入,尽管我们已经赋予user1用户rwx的ACL设置信息。 
  85. 最终权限由mask控制,权限必须在mask内,否则相对mask多出来的权限也是无效的。 
 
  1. [root@rhel6 data]# mkdir dir 
  2. [root@rhel6 data]# setfacl -d -m u:user1:rwx dir/               //让dir/目录下的所有文件和目录继承dir/目录的ACL设置信息 
  3. [root@rhel6 data]# getfacl dir/ 
  4. # file: dir/ 
  5. # owner: root 
  6. group: root 
  7. user::rwx 
  8. group::r-x 
  9. other::r-x 
  10. default:user::rwx 
  11. default:user:user1:rwx 
  12. default:group::r-x 
  13. default:mask::rwx 
  14. default:other::r-x 
  15.  
  16. [root@rhel6 data]# touch dir/test 
  17. [root@rhel6 data]# getfacl dir/test   //dir目录中创建的文件user1用户同样具有rwx权限
  18. # file: dir/test 
  19. # owner: root 
  20. group: root 
  21. user::rw- 
  22. user:user1:rwx                  #effective:rw- 
  23. group::r-x                      #effective:r-- 
  24. mask::rw- 
  25. other::r-- 
  26.  
  27. [root@rhel6 data]# setfacl -x u:user1 acl_file                //移除acl_file中的user1的ACL设置 
  28. [root@rhel6 data]# getfacl acl_file  
  29. # file: acl_file 
  30. # owner: root 
  31. group: root 
  32. user::rw- 
  33. group::r-- 
  34. mask::r-- 
  35. other::r-- 
  36. [root@rhel6 data]# ll acl_file  
  37. -rw-r--r--+ 1 root root 12 Mar 24 10:39 acl_file  //文件属性的"+"依然存在
  38.  
  39.  
  40. [root@rhel6 data]# setfacl -b acl_file                        //移除acl_file中所有的ACL设置 
  41. [root@rhel6 data]# getfacl acl_file  
  42. # file: acl_file 
  43. # owner: root 
  44. group: root 
  45. user::rw- 
  46. group::r-- 
  47. other::r-- 
  48. [root@rhel6 data]# ll acl_file          
  49. -rw-r--r--. 1 root root 12 Mar 24 10:39 acl_file  //文件属性的"+"已还原成"."
  50.  
  51. [root@rhel6 data]# getfacl dir/ > acl.bak                     //导出dir目录的ACL设置信息 
  52. [root@rhel6 data]# setfacl --set-file=acl.bak acl_dir/        //将ACL设置信息导入acl_dir目录 
  53. [root@rhel6 data]# getfacl acl_dir/ 
  54. # file: acl_dir/ 
  55. # owner: root 
  56. group: root 
  57. user::rwx 
  58. group::r-x 
  59. other::r-x 
  60. default:user::rwx 
  61. default:user:user1:rwx 
  62. default:group::r-x 
  63. default:mask::rwx 
  64. default:other::r-x