设定acl只能是root管理员用户. 相关命令: getfacl , setfacl

acl基本用法

//环境准备
[root@localhost ~]# cp /etc/passwd /root/passwd
//文件在没有设定acl, 看到的和传统权限是一样
[root@localhost ~]# ll passwd
-rw-r--r-- 1 root root 0 10-26 13:59 /home/test.txt

//使用getacl查看权限
[root@localhost ~]# getfacl passwd 
# file: passwd
# owner: root
# group: root
user::rw-   //文件owner权限
group::r--  //文件拥有组权限
other::r--  //其他人权限

设定acl权限案例如下:

-rw-r--r-- 1 root root 1380 Feb 27 11:25 passwd

alice 拥有读写权限    rw
bgx  没有任何权限     -
jack 组拥有读权限     r
匿名用户拥有读写权限  rw

//建立相关用户
[root@localhost ~]# useradd alice
[root@localhost ~]# useradd bgx
[root@localhost ~]# useradd jack

//增加用户 alice 权限
[root@localhost ~]# setfacl -m u:alice:rw passwd

//增加用户 bgx 权限
[root@localhost ~]# setfacl -m u:bgx:- passwd

//增加匿名用户权限
[root@localhost ~]# setfacl -m o::rw passwd

//增加组权限
[root@localhost ~]# setfacl -m g:jack:r passwd

注意: 如果用户同时属于不同的两个组,并且两个组设定了acl访问控制
    1.根据acl访问控制优先级进行匹配规则
    2.如有用户拥有多个组的权限不同的权限,优先使用最高权限(模糊匹配)

查看acl权限:

[root@localhost ~]# ll passwd
-rw-rw-rw-+ 1 root root 1531 Jan 26 07:52 passwd

[root@localhost ~]# getfacl passwd
# file: passwd
# owner: root
# group: root
user::rw-
user:bgx:---
user:alice:rw-
group::r--
group:jack:r--
mask::rw-
other::rw-

移除acl权限:

//移除jack组的acl权限
[root@localhost ~]# setfacl -x g:jack passwd

//移除bgx用户的acl权限
[root@localhost ~]# setfacl -x u:bgx passwd

//移除文件和目录所有acl权限
[root@localhost ~]# setfacl -b passwd

//删除目录的所有默认acl
[root@localhost ~]# setfacl -k dir

ACL实践案例

案例1: 将新建文件的属性修改tom:admin, 权限默认为644
要求: tom对该文件有所有的权限, mary可以读写该文件, admin组可以读写执行该文件, jack只读该文件, 其他人一律不能访问该文件

//实验前, 建立几个普通用户
[root@localhost ~]# useradd tom
[root@localhost ~]# useradd bean
[root@localhost ~]# useradd mary
[root@localhost ~]# useradd jack
[root@localhost ~]# useradd sutdent
[root@localhost ~]# groupadd admin
[root@localhost ~]# gpasswd -a mary admin
[root@localhost ~]# gpasswd -a bean admin

//检查用户属性
[root@linux-node1 ~]# id tom
uid=1004(tom) gid=1004(tom) groups=1004(tom)
[root@linux-node1 ~]# id mary
uid=1006(mary) gid=1006(mary) groups=1006(mary),1007(admin)
[root@linux-node1 ~]# id bean
uid=1005(bean) gid=1005(bean) groups=1005(bean),1007(admin)
[root@linux-node1 ~]# id jack
uid=1002(jack) gid=1002(jack) groups=1002(jack)
[root@linux-node1 ~]# id sutdent
uid=1007(sutdent) gid=1008(sutdent) groups=1008(sutdent)

//准备相关文件
[root@linux-node1 ~]# cp /etc/passwd /root/
[root@linux-node1 ~]# chown tom:admin passwd
[root@linux-node1 ~]# chmod 644 passwd

//检查设定前的acl列表
[root@linux-node1 ~]# getfacl passwd
# file: passwd
# owner: tom
# group: admin
user::rw-
group::r--
other::r--

//设定acl权限
[root@linux-node1 ~]# setfacl -m u::rwx,u:mary:rw,u:jack:r,g:admin:rwx,o::- passwd

//检查acl权限
[root@linux-node1 ~]# getfacl passwd
# file: passwd
# owner: tom
# group: admin
user::rwx
user:jack:r--
user:mary:rw-
group::r--
group:admin:rwx
mask::rwx
other::---

acl的控制规则是从上往下匹配的
tom由于他是文件的拥有者,所以直接按照user::rwx指定的权限去操作rwx
mary不是文件的拥有着, 从上往下找规则,发现user:mary:rw-能够精确匹配mary用户
尽管mary是属于admin组,admin组有rwx的权限,但是由于mary的规则在前面,所有优先生效
bean由于找不到精确匹配bean用户的规则, 而bean是属于admin组,根据文件的定义,该文件是属于admin组的, 所以bean的权限是按照group::rwx的权限去操作。rwx
jack不是文件的主人, 并且找到user:jack:r--, 所以只读
student不是文件主人, 也找不到精确匹配的user定义规则, 也找不到相关组的定义规则,最后属于other, 无任何权限

案例2: lab acl setup

controller组成员有:student
sodor组成员有:thomas,james

目录: /shares/steamies
文件: /shares/steamies/file
脚本: /shares/steamies/test.sh

controller属于该目录的所属组, 新建文件必须属于controller组
sodor组的成员对该目录拥有所有权限
sodor组成员james对该目录及子目录(包括以后新建立的文件)没有任何权限

实际操作:

//准备用户
[root@linux-node1 ~]# groupadd controller
[root@linux-node1 ~]# groupadd sodor
[root@linux-node1 ~]# useradd student -G controller
[root@linux-node1 ~]# useradd thomas -G sodor
[root@linux-node1 ~]# useradd james -G sodor

//准备目录
[root@linux-node1 ~]# mkdir /shares/steamies -p
[root@linux-node1 ~]# echo "file" >> /shares/steamies/file
[root@linux-node1 ~]# echo "echo 123" >> /shares/steamies/test.sh
[root@linux-node1 ~]# chmod 755 /shares/steamies/test.sh
[root@linux-node1 ~]# chown -R  :controller /shares/steamies/

//设定权限(X表示,如果原本有执行权限就保留,如果没有则不添加)
[root@linux-node1 ~]# setfacl -R -m g:sodor:rwX,u:james:- /shares/steamies/

//设定继承规则
[root@linux-node1 ~]# setfacl -R -m d:g:sodor:rwX,d:u:james:- /shares/steamies/