Shawn's Blog
目录 · 11 节

Linux 权限控制列表 ACL

0X00 ACL是什么

ACL的全称是Access Control List访问控制列表。在Linux中可以给文件设置权限,-rwx-rw-rw这样,但是这里并不能细分,只能分到用户、组、其他用户。如果我想给某个单独的用户设置权限的话是做不到的。所以有了ACL的出现。通过ACL可以给Linux下的文件提供详细的访问控制,比如我们在设置了基本的rwx权限之后,可以通过ACL在细分用户对文件的权限。

0X01 查看文件的ACL

使用getfacl命令可以查看文件的ACL和详细的权限设置。

sh
1[root@iZ28jaak5nnZ ~]# ls -l
2total 4
3-rwxr-xr-x 1 root root 1714 Oct 28 22:24 hello.py
4[root@iZ28jaak5nnZ ~]# getfacl hello.py
5# file: hello.py
6# owner: root
7# group: root
8user::rwx
9group::r-x
10other::r-x

这里显示了文件名、所属用户、所属组、还有相对应的权限。

0X02 创建测试用户/组/文件

先创建测试用户、测试组、测试文件。创建了xiaomingxiaohong两个用户,在china组,创建了一个jack用户在usa组。然后用root用户在/tmp/目录下创建了一个acltest目录,用来做测试,因为这个目录是任何人都可以访问的,但是由于是root用户创建的子目录,所以要给这个目录777的权限,让其他用户可以在里面测试。现在里面又创建了一些目录和文件,但是全部都是root用户的,文件权限是644,目录权限是755

sh
1[root@iZ28jaak5nnZ ~]# groupadd china
2[root@iZ28jaak5nnZ ~]# useradd xiaoming -g china
3[root@iZ28jaak5nnZ ~]# useradd xiaohong -g china
4[root@iZ28jaak5nnZ ~]# groupadd usa
5[root@iZ28jaak5nnZ ~]# useradd jack -g usa
6[root@iZ28jaak5nnZ ~]# cd /tmp
7[root@iZ28jaak5nnZ tmp]# mkdir acltest
8[root@iZ28jaak5nnZ tmp]# chmod 777 acltest
9[root@iZ28jaak5nnZ tmp]# cd acltest/
10[root@iZ28jaak5nnZ acltest]# touch file_{1,3}
11[root@iZ28jaak5nnZ acltest]# mkdir dir_{1,3}

0X03 设置文件的ACL

使用setfacl命令可以设置文件ACL。这个命令有下面这几个常用参数

setfacl 各个参数

  • 所谓的后续ACL就是在默认ACL的基础上添加的新的规则。

-m 设置后续ACL

对某一个文件/目录设置某一个用户的访问权限, u表示用户 冒号后面是用户名 再一个冒号后面是权限 最后接文件/目录 [root@iZ28jaak5nnZ acltest]# setfacl -m u:user_1:rwx file_1

对某一个文件/目录设置某一个用户组的访问权限,u表示组 冒号后面是组名 再一个冒号后面是权限 最后接文件/目录 [root@iZ28jaak5nnZ acltest]# setfacl -m g:group_1:rwx file_1

-x 删除后续ACL

删除之前添加的ACL项,指定用户或者指定组都是可以的,语法和上面差不多。这里删除的是一条ACL数据,下面说的-b参数是删除所有的ACL数据

sh
1[root@iZ28jaak5nnZ acltest]# setfacl -x u:xiaoming file_1
2[root@iZ28jaak5nnZ acltest]# getfacl file_1
3# file: file_1
4# owner: root
5# group: root
6user::rw-
7group::r--
8mask::r--
9other::r--

-b 删除所有后续ACL

这里是删除之前创建的所有ACL,包括下面会说的默认ACL

sh
1[root@iZ28jaak5nnZ acltest]# getfacl file_1
2# file: file_1
3# owner: root
4# group: root
5user::rw-
6user:xiaoming:rwx
7user:xiaohong:rw-
8group::r--
9mask::rwx
10other::r--
11
12[root@iZ28jaak5nnZ acltest]# setfacl -b file_1
13[root@iZ28jaak5nnZ acltest]# getfacl file_1
14# file: file_1
15# owner: root
16# group: root
17user::rw-
18group::r--
19other::r--

-d 设置默认ACL

设置默认ACL只能为目录设置,为目录设置了ACL之后里面新建的目录和文件都是使用这个默认的ACL

sh
1[root@iZ28jaak5nnZ acltest]# getfacl dir_1
2# file: dir_1
3# owner: root
4# group: root
5user::rwx
6group::r-x
7other::r-x
8[root@iZ28jaak5nnZ acltest]# setfacl -m d:u:jack:rwx dir_1	# 设置目录的默认ACL
9[root@iZ28jaak5nnZ acltest]# getfacl dir_1	# 我们可以看到现在出现了一段默认ACL
10# file: dir_1
11# owner: root
12# group: root
13user::rwx
14group::r-x
15other::r-x
16default:user::rwx
17default:user:jack:rwx
18default:group::r-x
19default:mask::rwx
20default:other::r-x
21[root@iZ28jaak5nnZ acltest]# cd dir_1
22[root@iZ28jaak5nnZ dir_1]# touch hello
23[root@iZ28jaak5nnZ dir_1]# getfacl hello	# 新建的文件也使用这些默认设置
24# file: hello
25# owner: root
26# group: root
27user::rw-
28user:jack:rwx			#effective:rw-
29group::r-x			#effective:r--
30mask::rw-
31other::r--
32[root@iZ28jaak5nnZ acltest]# setfacl -m u::rwx -d dir_3	# 设置为每个用户,也可以修改为用户组
33[root@iZ28jaak5nnZ acltest]# getfacl dir_3
34# file: dir_3
35# owner: root
36# group: root
37user::rwx
38group::r-x
39other::r-x
40default:user::rwx
41default:group::r-x
42default:other::r-x

-k 删除默认ACL

这里可以删除之前设置的默认ACL,只限默认ACL

sh
1[root@iZ28jaak5nnZ acltest]# getfacl dir_3 # 查看ACL,这里显示有默认的ACL
2# file: dir_3
3# owner: root
4# group: root
5user::rwx
6group::r-x
7other::r-x
8default:user::rwx
9default:group::r-x
10default:other::r-x
11
12[root@iZ28jaak5nnZ acltest]# setfacl -k dir_3	# 删除dir_3的默认ACL
13[root@iZ28jaak5nnZ acltest]# getfacl dir_3
14# file: dir_3
15# owner: root
16# group: root
17user::rwx
18group::r-x
19other::r-x

-R 递归设置ACL

给某一个目录设置递归的ACL之后这个目录和这个目录里的文件和子目录全部都会应用这个ACL,也就是说是相当于应用到了这个目录下的所有文件和目录

sh
1# 首先创建一下测试用的目录结构
2[root@iZ28jaak5nnZ acltest]# mkdir -p dir1/dir2/dir3
3[root@iZ28jaak5nnZ acltest]# touch dir1/hello.c
4[root@iZ28jaak5nnZ acltest]# touch dir1/dir2/hey.c
5[root@iZ28jaak5nnZ acltest]# setfacl -m u:jack:r -R dir1	递归设置ACL
6[root@iZ28jaak5nnZ acltest]# getfacl dir1
7# file: dir1
8# owner: root
9# group: root
10user::rwx
11user:jack:r--
12group::r-x
13mask::r-x
14other::r-x
15[root@iZ28jaak5nnZ acltest]# getfacl dir1/hello.c
16# file: dir1/hello.c
17# owner: root
18# group: root
19user::rw-
20user:jack:r--
21group::r--
22mask::r--
23other::r--
本文标题
Linux 权限控制列表 ACL
文章作者
Shawn
版权声明
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

如果这篇文章对你有帮助,可以请我喝杯咖啡 ☕

评论