9-LinuxACL控制

本文详细介绍了ACL(Access Control List)访问控制的概念、基本使用、高级特性以及实际应用案例。通过设置ACL,可以对文件和目录进行自定义权限控制,实现更精细的权限管理。文中展示了如何为不同用户和组设置读写权限,并利用mask和default特性来限制和继承权限。此外,还给出了两个实例,解释了如何为特定用户和组设定权限,以及在目录结构中实现权限的继承与限制。
摘要由CSDN通过智能技术生成

1. ACL访问控制概述

基础权限UGO,   特殊权限,  是针对一个用户,  一个组和其他人.
ACL访问控制列表: 对文件进行自定义权限控制.

2. ACL基本使用

ACL设置基本权限: r、w、x  
设定acl只能是root管理员用户. 

查看acl权限命令: getfacl
设置acl权限命令: setfacl 
2.1 环境准备
# 复制passwd文件
[root@kid ~]# cp /etc/passwd /root/passwd 

# 文件在没有设定llacl,   看到的和传统权限是一样  
[root@kid ~]# ll passwd  
-rw-r--r--. 1 root root 1532 Sep  2 14:17 passwd
2.2 查看文件的acl权限
# 使用getacl查看权限  
[root@kid ~]# getfacl passwd   
# file: passwd  # 文件名
# owner: root   # 文件属主
# group: root   # 文件属组
user::rw-       # 文件属主(owner)权限  
group::r--      # 文件属组权限  
other::r--      # 其他人权限  
2.3 设置文件的acl权限
要求如下:
a1 用户拥有读写权限      rw  
a1 组拥有读权限          r  
a2 用户没有任何权限      -  
其他用户拥有读写权限      rw  
设置格式: setfacl 选项 (u/g/o):(用户//):权限 文件名
u: 表示属主, 可以省略不写.
o: 标签其它所有用户.
* 连续设置使用,隔开(不要有多余的空格)

选项:
    -m 修改acl策略
    -x 移除acl权限
    -b 移除所有acl权限(保留默认的acl权限)
    -k 移除目录下新建文件继承父目录的acl权限
    -R 递归设置acl参数
# 建立相关用户  
[root@kid ~]# useradd a1
[root@kid ~]# useradd a2

# 增加用户 a1 权限  
[root@kid ~]# setfacl -m u:a1:rw passwd  

# 增加组权限  
[root@kid ~]# setfacl -m g:a1:r passwd  
  
# 增加用户 a2 权限  
[root@kid ~]# setfacl -m u:a2:- passwd 
  
# 增加其他用户权限  
[root@kid ~]# setfacl -m o::rw passwd  
注意: 如果用户同时属于不同的两个组,并且两个组设定了acl访问控制  
    1. 根据acl访问控制优先级进行匹配规则  
    2. 如有用户拥有多个组的权限不同的权限,优先使用最高权限(模糊匹配)      
# 查看基本权限
[root@kid ~]#  ll passwd 
-rw-rw-rw-+ 1 root root 1532 Sep  2 14:17 passwd

# 查看acl权限
[root@kid ~]# getfacl passwd  
# file: passwd    # 文件名
# owner: root     # 文件属主
# group: root     # 文件属组
user::rw-         # 文件属主
user:a1:rw-       # a1用户权限
user:a2:---       # a2用户权限 
group::r--        # 文件属组权限
group:a1:r--      # a1组权限
mask::rw-         # 所有用户最大权限
other::rw-        # 其他用户权限
2.4 移除文件的acl权限
# 移除jack组的acl权限  
[root@kid ~]# setfacl -x g:a1 passwd  
  
# 移除a1用户的acl权限  
[root@kid ~]# setfacl -x u:a1 passwd  
  
# 移除文件和目录所有acl权限  
[root@kid ~]# setfacl -b passwd  

2.5 复制acl权限
# 复制 file1 的 ACL 权限给 file2  
[root@kid ~]# touch file1 file2
[root@kid ~]#  setfacl -m u:a1:rwx file1 
[root@kid ~]# getfacl file1 |setfacl --set-file=- file2 
[root@kid ~]# getfacl file2
# file: file2
# owner: root
# group: root
user::rw-
user:a1:rwx
group::r--
mask::rwx
other::r--

3. ACL高级特性

3.1 MASK
mask权限: 指的是用户或群组能拥有的最大 ACL 权限, 
也就是说, 给用户或群组设定的 ACL 权限不能超过 mask 规定的权限范围, 
超出部分做无效处理.
# 临时降低所有用户或组权限  只能读写
[root@kid ~]# setfacl -m mask::rw filename  
总结: 
1 .mask会影响所有用户,但不会影响属主以及匿名用户(掐头去尾)
   mask默认不会对匿名用户降低权限, 所以为了便于管理文件的访问控制,
   建议匿名用户的权限置为空.
2. mask权限决定了用户访问文件时的最高权限. 
3. 可以使用mask临时降低用户访问文件的权限.  
4. 任何重新设置acl访问控制会清理mask所设定的权限.
3.2 Default
default: 继承(默认)
用户a1能够对/opt目录以及以后在/opt目录下新建的文件有读、写、执行权限

新建文件继承: 选项 d(u/g/o):(用户//):权限 文件名
# 赋予 a1 对/home 读写执行权限   
[root@kid ~]# setfacl -R -m u:a1:rwX /opt  
# 赋予 a1  对以后在/home 下新建的文件有读写执行权限(使 a1 的权限继承)   
[root@kid ~]# setfacl -m d:u:a1:rwX /opt  
  
# 检查对应的权限  
[root@kid ~]# getfacl /opt/  
getfacl: Removing leading '/' from absolute path names
# file: opt/       # 目录
# owner: root      # 属主
# group: root      # 属组
user::rwx          # 属主权限
user:a1:rwx        # 用户a1的权限
group::r-x         # root组的权限
mask::rwx          # 所有用户最大权限
other::r-x         # 其他用户权限
default:user::rwx    # 继承, 属主权限
default:user:a1:rwx  # 继承, 用a1的权限
default:group::r-x   # 继承, root组的权限
default:mask::rwx    # 继承, 所有用户最大权限
default:other::r-x   # 继承, 其他用户权限
# 新建文件
[root@kid opt]# touch 1.txt
# 查看文件acl权限(新建的文件继承了opt目录的acl权限)
[root@kid opt]# getfacl 1.txt 
# file: 1.txt
# owner: root
# group: root
user::rw-
user:a1:rwx			#effective:rw-
group::r-x			#effective:r--
mask::rw-    # 所有用户最大权限
other::r--

# 清除目录的继承权限(之后创建的文件不再继承ops的acl权限)
[root@kid opt]# setfacl -k /opt
[root@kid opt]# touch 2.txt
[root@kid opt]# getfacl 2.txt 
# file: 2.txt
# owner: root
# group: root
user::rw-
group::r--
other::r--

4. ACL访问控制实例

4.1 实例1
1. 新建文件
2. 文件属性修改tom(属主):admin(属组), 权限默认为644.  
3. tom对该文件有所有的权限, admin组可以读写执行该文件
4. 用户z1 可以读写该文件
5. 用户z2 只读该文件
6. 其他人一律不能访问该文件
# 创建环境,  新建用户 tom, z1, z2, xx
[root@kid ~]# useradd tom  
[root@kid ~]# useradd z1  
[root@kid ~]# useradd z2  
[root@kid ~]# useradd xx  

# 添加分组admin
[root@kid ~]# groupadd admin  

# gpasswd -a 将用户添加到用户组
[root@kid ~]# gpasswd -a z1 admin  
[root@kid ~]# gpasswd -a z2 admin  
  
# 检查用户属性  
[root@kid ~]# id tom 
uid=1021(tom) gid=1029(tom) groups=1029(tom)
[root@kid ~]# id z1
uid=1022(z1) gid=1030(z1) groups=1030(z1),1033(admin)
[root@kid ~]# id z2
uid=1023(z2) gid=1031(z2) groups=1031(z2),1033(admin)
[root@kid ~]# id xx
uid=1024(xx) gid=1032(xx) groups=1032(xx)

# 准备测试文件  
[root@kid ~]# cp /etc/passwd /root/  
[root@kid ~]# ll passwd 
-rw-r--r--. 1 root root 1779 Sep  2 16:42 passwd

# 修改文件的属主与属组
[root@kid ~]# chown tom:admin passwd  
# 修改文件的权限
[root@kid ~]# chmod 644 passwd  

# 查看文件的属性
[root@kid ~]# ll passwd 
-rw-r--r--. 1 tom admin 1779 Sep  2 16:42 passwd

# 检查设定前的acl列表  
[root@kid ~]# getfacl passwd  
# file: passwd
# owner: tom
# group: admin
user::rw-
group::r--
other::r--
# 设定acl权限  
[root@kid ~]# setfacl -m u::rwx,u:z1:rw,u:z2:r,g:admin:rwx,o::- passwd  

# 检查文件的acl列表  
[root@kid ~]# getfacl passwd 
# file: passwd
# owner: tom
# group: admin
user::rwx       # 属主tom
user:z1:rw-
user:z2:r--
group::r--      # 属组是tom
group:admin:rwx
mask::rwx       # 所有用户最大权限
other::---
acl的控制规则: 从上往下匹配.
1. tom由于是文件的拥有者, 所以直接按照user::rwx指定的权限去操作  
2. z1用户从上往下寻找匹配规则, 发现user:z1:rw-能够精确匹配z1用户,  
   尽管mary属于admin组, 同时admin组有rwx的权限,  
   但是由于mary用户的规则在前面, 所有优先生效. 
3. z2用户从上往下寻找匹配规则, 发现user:z2:r--能够精确匹配z2用户. 
4. tom组的用户, 按照group::r--指定的权限去操作.
5. admin组的用户(排查已经被用户规则匹配的用户), 按照group:admin:rwx的权限去操作. 
   * z1,z2 属于这个组, 可他们能够被用户规则精准匹配就不会走组的规则.
6. xx用户找不到精确匹配的user定义规则, 也找不到相关组的定义规则, 最后属于other.
4.2 实例2
controller 控制组成员有: k1  
test 测试组成员有: t1,  t2  
 
shares(公共) steamies(蒸汽机)
目录: /shares/steamies    
文件: /shares/steamies/file  
脚本: /shares/steamies/test.sh  权限744
  
controller 属于该目录的所属组, 新建文件必须属于controller组  
test 组的成员对该目录拥有rwx权限  
test 组成员t2对该目录及子目录(包括以后新建立的文件)没有任何权限  
# 准备环境
# 建立管理组
[root@kid ~]# groupadd controller  
# 建立测试组
[root@kid ~]# groupadd test
# 新建用户k1分配到管理组
[root@kid ~]# useradd k1 -G controller  
# 新建用户t1到测试组
[root@kid ~]# useradd t1 -G test  
[root@kid ~]# useradd t2 -G test  
  
# 创建目录
[root@kid ~]# mkdir /shares/steamies -p  
# 创建文件
[root@kid ~]# echo "file" >> /shares/steamies/file  
# 创建脚本
[root@kid ~]# echo "echo 123" >> /shares/steamies/test.sh  
# 修改权限
[root@kid ~]# chmod 755 /shares/steamies/test.sh  
# 修改属组
[root@kid ~]# chown -R  :controller /shares/steamies/  
# 设定权限(X表示,  如果原本有执行权限就保留,  如果没有则不添加)  
[root@kid ~]# setfacl -R -m g:test:rwX,u:t2:- /shares/steamies/  
  
# 设定继承规则  
[root@kid ~]# setfacl -R -m d:g:controller:rwX,d:u:t2:- /shares/steamies/  
[root@kid steamies]# getfacl /shares/steamies/  
getfacl: Removing leading '/' from absolute path names
# file: shares/steamies/   # 目录
# owner: root              # 属主root
# group: controller        # 属组
user::rwx                  # 属主权限
user:t2:---                # 用户t2没有任何权限
group::r-x                 # root组权限
group:test:rwx             # test组权限
mask::rwx                  # 所有用户最大权限
other::r-x                 # 其他用户权限
default:user::rwx          # 继承, 新建文件属主的权限
default:user:t2:---        # 继承, 新建文件用户t2的权限
default:group::r-x         # 继承, root组的权限
default:group:controller:rwx  # 继承, controller组的权限
default:mask::rwx          # 继承, 所有用户最大权限
default:other::r-x         # 继承, 其他用户的权限

————————————————
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言是为了避免文章提示质量低.
————————————————

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值