Linux 文件的特殊权限—ACL权限控制

本文为Ubuntu Linux操作系统- 第二十期~~

其他特殊权限: 【SUID 权限】,【SGID 权限】,【SBIT权限】

更多Linux 相关内容请点击👉【Linux专栏】~

主页:【练小杰的CSDN】

文章目录

ACL权限的概念

  • Linux 系统传统的权限控制方式就是前面所讲的基本权限,利用 3 种用户身份(文件所有者、所属群组、其他用户)配合 3 种文件操作权限(读 r,写 w,访问 x)实现。
  • 在实际应用中,以上这 3 种身份根本不够用。
    例如:有一个文件file,它的基本权限是"-rwx--w--w-. lxj lxj",lxj是文件file的属主,对file有rwx权限,file的组属主和其它人则只有w权限 ,GEM可能是lxj群组成员也可能是其他用户,但GEM和lxj关系比较铁,他跟lxj商量能不能搞搞特殊,让他对file也有rwx权限,问题是GEM不是file的属主,他只有w权限的,那么这个问题如何解决呢?这样,GEM的问题就可以通过文件的ACL解决!

ACL权限作用

  • ACL 权限是Access Control List 的缩写。
  • 主要作用:在提供文件基本权限rwx之外更细部权限的设置, 为了解决个别用户对某一文件或目录权限不足的情况。
  • ACL 权限可以针对单一使用者、单一文件或目录进行设置, 有了ACL权限,使组外的用户和非所有者用户也能对某个文件或目录拥有指定的权限。

ACL 特点

  • ACL用于linux复杂的用户权限控制当中。文件的基本权限包括文件属主、属组、其他用户三种设置方式,除了文件属主外,对于其他用户则通过文件属组和其他用户的方式指定权限。
  • 文件的基本权限不能精确控制每个用户的权限,如果希望对某个指定的用户进行单独的权限控制,就需要用到文件的ACL。
  • 使用者 (user):可以针对使用者来设置权限
  • 群组 (group):针对群组为对象来设置其权限
  • 默认属性(mask):还可以针对在该目录下在建立新文件/目录时,规范新数据的默认权限,这个内容我们会安排在后续节学习。
  • ACL生效优先级别:所有者,自定义用户,自定义组,其他人。
  • Centos 7系统后,不管文件系统是否在安装系统时被建立都支持ACL。
  • acl权限不能超过mask的值。

⚠️注意

  • ACL可以对普通文件和目录进行设置,也可以对目录设置了 ACL,此时目录中的文件会继承其 ACL权限
  • 当这个目录中的文件已经设置了 ACL,那么这个文件不再继承其所在目录的 ACL。

ACL 设置文件操作权限的具体方法

操作 ACl 权限,常用 setfacl 和 getfacl 这2 个命令,前者用于设置文件或目录 ACL 权限,后者用于查看ACL权限是否配置成功。

ACL的基本操作命令

  • 设置ACL权限之前,查看文件或目录是否设置了ACL
powershell 复制代码
 ls -l

如果权限一栏后面有个加号,说明文件被设置了ACL规则。如:-rw-rw-r--+ 1 root root 0 Jan 6 11:01 testfile

  • 查看ACL权限的详细信息,命令格式:
shell 复制代码
getfacl 文件/目录名
  • 举例
shell 复制代码
[root@localhost user1]# getfacl testfile
# file: testfile
# owner: root
# group: root
user::rw-
user:user1:rw-
group::r--
mask::rw-
other::r---

可以看到,用户user1与文件属主root有相同的权限,其它用户则只有r权限。

getfacl 命令用于查看文件或目录当前设置的 ACL 权限信息,getfacl 命令的使用非常简单,且常和 setfacl 命令一起搭配使用。

  • 设置ACL权限:setfacl
    命令格式如下:
shell 复制代码
setfacl  [参数]   权限  文件/目录名

setfacl 的参数

选项-m

  • 设置 myuser 用户对文件test具有 rx 权限
shell 复制代码
setfacl -m u:myuser1:rx test
  • 设置组project 对com_ project 目录具有 rx 权限
shell 复制代码
 setfacl -m g:project:rx /user/com_project 

功能:修改或设置acl权限,包括

1.给用户设置 ACL 权限,参数使用 "u:用户名:权限" 的格式

2.给组设置 ACL 权限,参数使用 "g:组名:权限" 格式

选项 -x

  • 删除 myuser1 用户对文件test的 ACL 权限
shell 复制代码
setfacl -x u:myuser1 test
  • 删除群组project对 com_project 目录的 ACL 权限
shell 复制代码
setfacl --x  g:project  /user/com_project

功能:

1.删除指定用户(参数格式 u:用户名)的 ACL 权限

2.删除指定群组(参数格式 g:群组名)的 ACL 权限

选项-b

  • 删除有关 com_project 目录的所有 ACL 权限
shell 复制代码
setfacl --b  /user/com_project

功能:删除所有的acl权限

选项-k

  • 删除文件test中缺省的acl规则。如果没有缺省规则,将不提示。
shell 复制代码
setfacl -k test

选项 -d

  • 设定默认 ACL 权限,命令格式:

1.对用户: setfacl -m d:u:用户名:权限 文件名

2.对群组:setfacl --m d:g:群组名:权限

⚠️注意:本参数只对目录生效,指目录中新建立的文件拥有此默认权限

  • 表示myuser1用户对com_project 目录中新建立的文件拥有 rx 权限
powershell 复制代码
setfacl --m  d:u:myuser1:rx  /user/com_project

选项 -R

  • 递归设定 ACL 权限,指设定的 ACL 权限会对目录下的所有子文件生效,命令格式为:

1.对用户:setfacl -m u:用户名:权限 -R 文件名

2.对群组:sefacl --m g:群组名:权限

  • 表示 myuser1用户对已存在com_project目录中的文件和子目录都拥有 rx 权限
shell 复制代码
setfacl -m u:myuser1:rx  -R  /user/com_project

⚠️注意:区分-d参数指新建立的文件或目录可以继承父目录的ACL,-R指已有的文件或目录!

实例1

前面已创建 /user/com_project目录,现在将这个目录给用户user1递归设置默认的ACL权限。

shell 复制代码
[root@localhost user]# ll
drwxrws---. 4 root project 84 Jul  2 22:14 com_project
[root@localhost user]# id user1
uid=1001(user1) gid=1001(user1) groups=1001(user1)
[root@localhost user]# setfacl -m d:u:user1:rwx -R ./com_project
  • 设置ACL权限后,查看目录com_project的权限
powershell 复制代码
[root@localhost user]# getfacl com_project
# file: com_project
# owner: root
# group: project
# flags: -s-
user::rwx
group::rwx
other::---
default:user::rwx
default:user:user1:rwx
default:group::rwx
default:mask::rwx
default:other::---
  • 查看上级目录user的权限,可以看到多了一个"+"号!
powershell 复制代码
[root@localhost user]# ll
drwxrws---+ 4 root project 84 Jul  2 22:14 com_project
  • 删除默认acl
powershell 复制代码
[root@localhost user]# setfacl -k com_project
  • 再次查看目录user的权限,这时,"+"号没有了!
powershell 复制代码
[root@localhost user]# ll
drwxrws---. 4 root project 84 Jul  2 22:14 com_project

实例2

  • 设置文件的ACL :
    创建目录/user1和用户user1,在这个目录下创建文件testfile,只有文件属主root具有w权限。
    然后设置用户user1对文件testfile 的ACL的w权限,测试用户user1是否具有w权限。
shell 复制代码
[root@localhost user1]# touch testfile
-rw-r--r--. 1 root root 0 Jun 11 00:24 testfile

[root@localhost user1]# setfacl -m u:user1:rw testfile

[root@localhost user1]# getfacl testfile
# file: testfile
# owner: root
# group: root
user::rw-
user:user1:rw-
group::r--
mask::rw-
other::r--
[root@localhost user1]# chmod u+s /usr/bin/vim
[root@localhost user1]# su user1
[user1@localhost user1]$ vim testfile

可以发现,用户user1可以编辑修改文件testfile了

实例3

  • 普通用户设置文件的ACL:

创建文件testfile1和用户user2,将其属主改为user1,属组改为user1,只有文件属主user1具有w权限,将系统切换到user1用户,然后对user2设置ACL的w权限,将系统切换到user2用户后测试是否可以编辑testfile1文件。

powershell 复制代码
[root@localhost user1]# touch testfile1
-rw-r--r--. 1 root root 0 Jun 11 02:48 testfile1
[root@localhost user1]# chown user1:user1 testfile1
-rw-r--r--. 1 user1 user1 0 Jun 11 02:48 testfile1
[root@localhost user1]# su user1
[user1@localhost user1]$ setfacl -m u:user2:w testfile1
[user1@localhost user1]$exit
[root@localhost user1]# su user2
[user2@localhost user1]$ vim testfile1

这时,用户user2 有w权限(写权限),可以修改文件内容,即 user2 可以成功使用 vim 打开并编辑这个文件。

实例4

  • 设置目录的ACL

创建目录/user2,将权限设置为drwx------,切换到用户user1后,观察是否可以进入这个目录。

然后对用户user1设置目录/user2的ACL的x权限,再观察用户user1是否可以进入这个目录。

  • 如下所示,切换到普通用户user1时,可以进入目录/user2
shell 复制代码
[root@localhost /]# mkdir user2
drwxr-xr-x.   2 root root    6 Jun 11 03:26 user2
[root@localhost /]# chmod 600 user2
drw-------.   2 root root    6 Jun 11 03:26 user2
[root@localhost /]# su user1
[user1@localhost /]$ cd user2
bash: cd: user2: Permission denied(禁止进入/user2)
[root@localhost /]# setfacl -m u:user1:x user2
[root@localhost /]# su user1
[user1@localhost /]$ cd user2

至此,Linux系统的特殊用户文件权限之ACL权限控制已经讲完了😆

如果还想了解更多,查看主页【练小杰的CSDN】!!!

明天再见,各位🧍‍♂️大佬们~~

相关推荐
aixingkong9211 小时前
Nvidia为例 XPU的Multi-Host、Socket Direct 、GPUDirect、RDMA 技术点分析
服务器·网络·硬件架构·硬件工程
雯宝3 小时前
mnt_init 函数
linux
UIU1144 小时前
递归算法与汉诺塔
c++·学习·算法·c#·递归
律宏阔9 小时前
WSL Docker 端口明明空闲,但就是绑不上端口
linux·windows
律宏阔9 小时前
WSL 突然断网,无法 ping 内网或外网
linux·windows
穷人小水滴9 小时前
用容器编译 VirtualBox 虚拟机软件 (ArchLinux, podman)
linux·容器·virtualbox
乱码三千10 小时前
如何优雅地直连无公网 IP 的远程 GPU 服务器
linux·人工智能·程序员
yunwei3710 小时前
使用 eBPF 跟踪 Nginx 请求
linux·后端·性能优化
yunwei3710 小时前
使用 eBPF 跟踪 MySQL 查询
linux·后端·性能优化
yunwei3710 小时前
eBPF 示例教程:使用 XDP 捕获 TCP 信息
linux·后端·性能优化