Linux主机的具体权限规划-ACL的使用

ACL是Access Control List 的缩写,主要的目的是提供传统的owner、group、other的read、write、execute权限之外的具体权限设置.

ACL可以针对单一用户、单一文件或目录来进行r、w、x的权限设置,对于需要特殊权限的使用状况非常有帮助.

那么ACL主要可以针对那些方面来控制权限呢?它主要可以针对几个项目:

* 用户(user):可以针对用户来设置权限;

* 用户组(group): 针对用户组来设置其权限;

* 默认属性(mask): 还可以在该目录下在新建新文件/目录是设置新数据的默认权限.

 

<1>如何启动ACL

由于ACL是传统UNIX-like操作系统权限的额外支持项目,因此要使用ACL必须要有文件系统的支持才行.目前绝大数的文件系统都有支持ACL的功能.

那我们如何查看你的文件系统是否支持ACL呢?我们可以这样看:

[root@sqj2015 ~]# mount      //直接查看挂载参数的功能

/dev/vda1 on / type ext4 (rw)

…………

##这里我们没有看到ACL

 

[root@sqj2015 ~]# dumpe2fs -h /dev/vda1 | grep ‘mount options’

dumpe2fs 1.41.12 (17-May-2010)

Default mount options:    user_xattr acl

## 由mount单纯去查询不见得可以看到实际的选项,由于目前新的distribution经常会主动加人某些默认功能.

 

若你的系统默认不会帮你加上acl的支持呢?那么你可以这样操作:

[root@sqj2015 ~]# mount -o remount,acl /

[root@sqj2015 ~]# mount

/dev/vda1 on / type ext4 (rw,acl)

##这样就加入了!但是如果你想要每次开机都生效,则需要这样:

[root@sqj2015 ~]# vi /etc/fstab

/dev/vda1           /               ext4    defaults,acl    1 1

 

<2>ACL设置技巧

在文件系统启动ACL支持后,接下来该如何设置与查看ACL呢?很简单,利用以下2个命令就可以了:

getfacl:查看某个文件/目录的ACL设置项目;

setfacl:设置某个目录/文件的ACL规定;

 

setfacl语法

setfacl [参数] 目标文件名

参数:

-m : 设置后续的acl参数给文件使用,不可与-x合用;

-x : 删除后续的acl参数,不可与-m 合用;

-b : 删除所有acl设置参数;

-k : 删除默认acl参数;

-R : 递归设置acl,亦即包括子目录都会被设置起来;

-d : 设置默认acl参数,只对目录有效,在该目录新建的数据会引用此默认值.

 

接下来,就来看看setfacl的设置方式:

**针对特定用户的方式:

##设置规定: “u:[用户账号列表]:[rwx]”如下,设置sqj权限为rw:

[root@sqj2015 ~]# touch acl_test

[root@sqj2015 ~]# ll acl_test

-rw-r–r–. 1 root root 0 Mar 21 13:44 acl_test

[root@sqj2015 ~]# setfacl -m u:sqj:rw acl_test

[root@sqj2015 ~]# ll acl_test

-rw-rw-r–+ 1 root root 0 Mar 21 13:44 acl_test

##是否看到了不同,在权限部分多了个+.

 

[root@sqj2015 ~]# setfacl -m u::rwx acl_test

[root@sqj2015 ~]# ll acl_test

-rwxrw-r–+ 1 root root 0 Mar 21 13:44 acl_test

##若无用户列表,则代表设置该文件所有者,所以上面显示root的权限变成了rwx了.

 

但我们具体怎么查看设置的ACL呢?如下:

[root@sqj2015 ~]# getfacl acl_test

# file: acl_test

# owner: root

# group: root

user::rwx

user:sqj:rw-

group::r–

mask::rw-

other::r–

 

**针对特定用户组的方式:

##设置规定: “g:[用户组列表]:[rwx]”,例如,针对sqj组权限rx:

[root@sqj2015 ~]# setfacl -m g:sqj:rw acl_test

[root@sqj2015 ~]# getfacl acl_test

# file: acl_test

# owner: root

# group: root

user::rwx

user:sqj:rw-

group::r–

group:sqj:rw-

mask::rw-

other::r–

 

**针对有效权限mask的设置方式:

##mask 它的意思是用户或组所设置的权限必须存在与mask的权限设置范围内才能生效,此即有效权限.

##设置规定: “m:[rwx]”,例如针对刚才的文件规定为仅有r权限:

[root@sqj2015 ~]# setfacl -m m:r acl_test

[root@sqj2015 ~]# getfacl acl_test

# file: acl_test

# owner: root

# group: root

user::rwx

user:sqj:rw-                    #effective:r–

group::r–

group:sqj:rw-                   #effective:r–

mask::r–

other::r–

##sqj用户、sqj组与mask的集合仅有r存在,因此sqj仅具有r的权限而已,并不存在w的权限,这就是mask的功能.

 

**针对默认权限的设置方式:

##设置规定:”d:[ug]:用户列表:[rwx]”

[root@sqj2015 ~]# mkdir acl_test1

[root@sqj2015 ~]# setfacl -m d:u:sqj:rw acl_test1/

[root@sqj2015 ~]# getfacl acl_test1

# file: acl_test1

# owner: root

# group: root

user::rwx

group::r-x

other::r-x

default:user::rwx

default:user:sqj:rw-

default:group::r-x

default:mask::rwx

default:other::r-x

 

[root@sqj2015 ~]# cd acl_test1

[root@sqj2015 acl_test1]# touch test

[root@sqj2015 acl_test1]# ll test

-rw-rw-r–+ 1 root root 0 Mar 21 14:16 test

[root@sqj2015 acl_test1]# getfacl test

# file: test

# owner: root

# group: root

user::rw-

user:sqj:rw-

group::r-x                      #effective:r–

mask::rw-

other::r–

##通过这个”针对目录来设置默认ACL权限”的选项,我们可以让这些属性继承到子目录下面.