您的位置:首页 > 运维架构 > Linux

Linux下的高级文件权限ACL

2013-03-24 14:31 260 查看
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
本文出自 “Vnimos” 博客,请务必保留此出处http://vnimos.blog.51cto.com/2014866/1161389
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: