Loading

Linux ACL访问控制

在Linux一般权限管理中,对文件的访问可以通过控制该文件的(目录)属主、属组和其他人三个用户角色进行;每种用户身份拥有读(read)、写(write)和执行(execute)三种权限。但是在实际工作中,这三种身份实在是无法满足精细的权限控制要求。请看下面的例子。

drwxrwx--- 45 user1 group1 12288 Feb 25 16:48 /project/

以上根目录下有一个 /project/ 目录,user1用户和在group1组中的用户都有访问和修改权限,但如果有另外一个用户user2需要有访问权限(rx)且不能有修改权限如该何操作呢?给other用户rx权限和将user2加入到group1组都不是好的选择。能不能单独给user2授权/project/目录的访问权限呢?是可以的,这时就要用到ACL权限了。

ACL是Access Control List(访问控制列表)的缩写,在Linux系统中,ACL用于设定用户针对文件的权限。路由器中也有ACL的概念,但和我们这里讲的ACL并不相同。

开启ACL权限#

ACL需要文件系统支撑,ACL的开启由挂载参数决定的。在 CentOS 6.x 系统中 ACL 权限默认是开启的,不需要手工开启。那该如何查看 ACL 权限是否开启了呢?可以这样查看:

 1 [root@CentOS release 6.5 ~]# dumpe2fs -h /dev/mapper/vg_root-lv_root
 2 dumpe2fs 1.41.12 (17-May-2010)
 3 Filesystem volume name:   <none>
 4 Last mounted on:          /
 5 Filesystem UUID:          391a5a62-13d3-4f4f-a312-d46490508500
 6 Filesystem magic number:  0xEF53
 7 Filesystem revision #:    1 (dynamic)
 8 Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
 9 Filesystem flags:         signed_directory_hash 
10 Default mount options:    user_xattr acl
11 Filesystem state:         clean
12 Errors behavior:          Continue
13 Filesystem OS type:       Linux略……

#dumpe2fs是查询指定分区文件系统详细信息的命令,只支撑ext*类的文件系统。

其中,dumpe2fs 命令可选的选项及其含义如下:

  • -h:仅显示超级块中的信息,而不显示磁盘块组的详细信息;

使用 dumpe2fs 命令可以査看到这个分区文件系统的详细信息。dmpe2fs命令输出结果中 Default mount options: user_xattr acl 显示分区/dev/mapper/vg_root-lv_root的默认挂载选项包括acl,所以不需要额外操作。

如果我们的Linux文件系统不支持ACL权限可以加用如下命令添加:

[root@localhost ~]# mount -o remount,acl /
#重新挂载对应分区,并加入ACL权限参数

使用 mount 命令重新挂载加入 的ACL 权限,临时有效,系统重启后挂载参数还是原来的。要想永久生效,需要修改 /etc/fstab 文件,命令如下:

[root@localhost ~]#vi /etc/fstab
UUID=56e5d02a-2fa6-40a8-b4ac-374407905c59 /ext4 defaults,acl 1 1
#defaults后加入ACL权限,用逗号分隔
[root@localhost ~]# mount -o remount /
#重新挂载文件系统或重启系统,使修改生效

建议采用修改/etc/fstab再remount的方式,可以验证fstab配置对不对,有问题可及时修改,避免fstab配置有错误导致重启无法开机或分区无法挂载等意外情况。

ACL权限设置#

1、ACL权限管理命令#

现在分区已经支持ACL了,管理ACL权限主要涉及两个命令查看ACL(getfacl)和设置ACL(setfacl),下面我们先了解下这两个命令的语法:

[root@localhost ~]# getfacl 文件名    #查看ACL权限
[root@localhost ~]# setfacl 选项 文件名    #设定ACL权限
setfacl 选项:
  • -m:设定 ACL 权限。如果是给予用户 ACL 权限,则使用"u:用户名:权限"格式赋予;如果是给予组 ACL 权限,则使用"g:组名:权限" 格式赋予;
  • -x:删除指定的 ACL 权限;
  • -b:删除所有的 ACL 权限;
  • -d:设定默认 ACL 权限。只对目录生效,指目录中新建立的文件拥有此默认权限;
  • -k:删除默认 ACL 权限;
  • -R:递归设定 ACL 权限。指设定的 ACL 权限会对目录下的所有子文件生效;
# setfacl -h
setfacl 2.2.51 -- set file access control lists
Usage: setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...
  -m, --modify=acl        modify the current ACL(s) of file(s)
  -M, --modify-file=file  read ACL entries to modify from file
  -x, --remove=acl        remove entries from the ACL(s) of file(s)
  -X, --remove-file=file  read ACL entries to remove from file
  -b, --remove-all        remove all extended ACL entries
  -k, --remove-default    remove the default ACL
      --set=acl           set the ACL of file(s), replacing the current ACL
      --set-file=file     read ACL entries to set from file
      --mask              do recalculate the effective rights mask
  -n, --no-mask           don't recalculate the effective rights mask
  -d, --default           operations apply to the default ACL
  -R, --recursive         recurse into subdirectories
  -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)
  -v, --version           print version and exit
  -h, --help              this help text

2、给用户添加ACL权限#

针对某个文件或目录设置特定用户对其的特定访问权限。

[root@localhost ~]# ll -d /project/    #查看 /project/ 当前的权限状态
 drwxrwx--- 2 root sys 4096 1月19 05:21 /project/ 
#给user2分配rx权限
[root@localhost ~]# setfacl -m u:user2:rx /project/     #给用户user2赋予r-x权限,使用"u:用户名:权限" 格式
[root@localhost ~]# ll -d /project/
drwxrwx---+ 3 root sys 4096 1月19 05:22 project/    #使用ls-l査询时会发现,在权限位后面多了一个"+",表示此目录拥有ACL权限
[root@localhost ~]# getfacl /project  #查看/prpject目录的ACL权限
#file: /project <-文件名
#owner: root   <-文件的属主
#group: sys  <-文件的属组
user::rwx   <-用户名栏是空的,说明是属主的权限
user:user2:r-x   <-用户user2的权限
group::rwx   <-组名栏是空的,说明是属组的权限
mask::rwx   <-mask权限
other::---   <-其他人的权限

可以看到虽然user2不是/project目录的属主、属组和other用户,作为一个特殊的用户对该目录拥有了访问权限。

3、给用户组添加ACL权限#

除了可以给用户添加ACL权限,也可以给用户组添加ACL权限,用于控制这个组中的用户对某个文件或目录的权限。

[root@localhost /]# setfacl -m g:group2:rwx project/    #为组group2纷配ACL权限,使用"g:组名:权限"格式
[root@localhost /]# ll -d project/
drwxrwx---+ 2 root sys 4096 1月19 06:21 project/
#属组并没有更改
[root@localhost /]# getfacl project/
#file: project/
#owner: root
#group: sys
user::rwx
user:user2:r-x
group::rwx
group:group2:rwx   <-用户组group2拥有了rwx权限
mask::rwx
other::--

4、最大有效权限mask#

mask 是用来指定最大有效权限的。mask 的默认权限是 rwx。其他用户或组的有效权限都是和mask权限相与得到的。如果mask权限是r--,则不管user2的权限是多少那么他的最大权限也不会超过r--。例:user2的权限是r-x,其有效权限是r-- 与 r-x结果是r--,这个比较容易理解。

修改mask权限的命令:

[root@localhost /]# setfacl -m m:rx /project    #设定mask权限为r-x,使用"m:权限"格式
[root@localhost /]# getfacl /project
#file:project/
#owner:root
#group:sys
user::rwx
group::rwx      #effective:r-x
mask::r-x      #mask权限变为r-x
other::--

5、默认ACL权限#

给 /project 目录设定了 ACL 权限,在这个目录中新建一些子文件和子目录,是不会继承父目录的 ACL 权限的。如果我们希望在这个目录下新创建文件也有对应的ACL权限,除了手动授权以外,还有更好的方法。

默认 ACL 权限的作用是:如果给父目录设定了默认 ACL 权限,那么父目录中所有新建的子文件都会继承父目录的 ACL 权限。默认 ACL 权限只对目录生效。命令如下:

[root@localhost /]# setfacl -m d:u:user2:rx /project/    #使用"d:u:用户名:权限"格式设定默认ACL权限
[root@localhost project]# getfacl project/
# file: project/
# owner: root
# group: sys
user:: rwx
user:user2:r-x
group::rwx
group:group2:rwx
mask::rwx
other::--
default:user::rwx   <-多出了default字段
default:user:st:r-x
default:group::rwx
default:mask::rwx
default:other::--
[root@localhost /]# cd project/
[root@localhost project]# touch testfile
[root@localhost project]# mkdir testdir 
[root@localhost project]# ll 总用量8-rw-rw----+ 1 root root 02月19 06:33 testfile
drwxrwx---+ 2 root root 4096 1月19 06:34 testdir

可以看到在/project/下新创建的文件和目录testfile、testdir 继承了父目录用户user2的ACL权限。

6、递归ACL权限#

递归是指父目录在设定 ACL 权限时,所有的子文件和子目录也会拥有相同的 ACL 权限

[root@localhost project]# setfacl -m u:user2:rx -R /project/    #-R递归

7、删除ACL权限#

删除指定的ACL权限:

[root@localhost /]# setfacl -x u:user2 /project/    #删除指定用户和用户组的ACL权限
[root@localhost /]# getfacl project/
# file:project/
# owner: root
# group: sys
user::rwx
group::rwx
group:group2:rwx
mask::rwx
other::--
user2用户的权限已被删除

删除所有ACL权限:

[root@localhost /]# setfacl -b /project    #删除文件的所有ACL权限
[root@localhost /]# getfacl /project
#file: project/
#owner: root
# group: sys
user::rwx
group::rwx
other::--

可以看到所有ACL权限已被删除

总结:1、当要给某个用户或用户组分配特殊权限时可用ACL

   2、ACL权限需要分区支持

   3、除了给用户和组设置ACL权限外还可以设置默认ACL权限和mask权限

posted @ 2021-03-05 10:30  五月的麦田  阅读(574)  评论(0编辑  收藏  举报