Skip to content

Latest commit

 

History

History
302 lines (243 loc) · 7.89 KB

RH134-04-ACL.md

File metadata and controls

302 lines (243 loc) · 7.89 KB

Chapter 04 ACL

返回


1. 文件 ACL

当文件仅由单个所有者和指定的一组人使用时,标准的 Linux 文件权限就可以满足要求。

对于要求多个用户和组以不同的文件权限来访问文件时,就需要用到 ACL (Access Control List) 访问控制列表。

借助于 ACL 设置的访问权限,这些额外的用户和组被称为指定用户和组

2. 查看文件 ACL

getacl filename

[root@server130 logs]# getfacl reports.txt
# file: reports.txt
# owner: root
# group: root
user::rwx
group::r-x
other::r-x

# 这里没有设置 ACL 权限,所以看到的权限和长列表形式一致
[root@server130 logs]# ls -l
总用量 4
-rwxr-xr-x. 1 root root 43 10月 19 21:34 reports.txt
  • 如果不需要显示注释,可以加上 -c 参数 getacl -c filename

3. 设置文件 ACL

# 以 sadmin 用户登录,尝试去编辑 reports.txt 会发现没有权限
# sadmin 属于 other, 权限为r-x
[sadmin@server130 logs]$ vi reports.txt
 2023年 10月 19日 星期四 21:34:20 CST 
 ~
 ~
 ~
"reports.txt" [只读] 1L, 43C

setfacl 设置权限

对用户设置 ACL

setfacl -m u:用户名:rw- file/dir

对组设置 ACL

setfacl -m g:组名:rw- file/dir

比如,给用户 sadmin 添加对文件 reports.txt 的可读可写权限。添加权限之后,ACL 中多出了 user:sadmin:rw- 的权限。

[root@server130 logs]# setfacl -m u:sadmin:rw- reports.txt
[root@server130 logs]# getfacl reports.txt
# file: reports.txt
# owner: root
# group: root
user::rwx
user:sadmin:rw-
group::r-x
mask::rwx
other::r-x

# 此时用长列表显示权限时,other 权限后面会有一个 + 号,代表有 ACL 权限
[root@server130 logs]# ls -l
总用量 4
-rwxrwxr-x+ 1 root root 43 10月 19 21:34 reports.txt

# 在设置 ACL 权限的时候,用户名必须存在,否则会报下面的错误
[root@server130 logs]# setfacl -m u:unknownuser:rw- reports.txt
setfacl: Option -m: 无效的参数 near character 3

当我们给指定用户设置了 ACL 权限,则文件权限中的 other 权限将不再对指定用户生效。

比如,给组 group1 添加对文件 reports.txt 的可读可写权限。添加权限之后,ACL 中多出了 group:group1:rw- 的权限。组 group1 中的 user 默认拥有了对 reports.txt 的读写权限

[root@server130 logs]# gpasswd -a sadmin group1
正在将用户“sadmin”加入到“group1”组中
[sadmin@server130 logs]$ groups sadmin
sadmin : sadmin group1

[root@server130 logs]# setfacl -m g:group1:rw- reports.txt
[root@server130 logs]# getfacl reports.txt
# file: reports.txt
# owner: root
# group: root
user::rwx
group::r-x
group:group1:rw-
mask::rwx
other::r-x

setfacl 取消权限

setfacl -x u:用户名 file/dir
setfacl -x g:组名 file/dir

[root@server130 logs]# setfacl -x u:sadmin reports.txt
[root@server130 logs]# getfacl reports.txt
# file: reports.txt
# owner: root
# group: root
user::rwx
group::r-x
mask::r-x
other::r-x

[root@server130 logs]# gpasswd -d sadmin group1
正在将用户“sadmin”从“group1”组中删除
[root@server130 logs]# setfacl -x g:group1 reports.txt

使用 getfacl 作为输入

getfacl fileA | setfacl --set-file=- fileB

[root@server130 opt]# touch fileA.txt fileB.txt
[root@server130 opt]# setfacl -m u:sadmin:r--,g:group1:--x fileA.txt
[root@server130 opt]# getfacl -c fileA.txt
user::rw-
user:sadmin:r--
group::r--
group:group1:--x
mask::r-x
other::r--

[root@server130 opt]# getfacl fileA.txt | setfacl --set-file=- fileB.txt
[root@server130 opt]# getfacl -c fileB.txt
user::rw-
user:sadmin:r--
group::r--
group:group1:--x
mask::r-x
other::r--

4. ACL mask 权限

ACL mask 定义了可授予指定用户、指定组、和组所有者三者的最大权限。

[root@server130 logs]# getfacl reports.txt
# file: reports.txt
# owner: root
# group: root
user::rwx			## ACL_USER_OBJ
user:sadmin:rw-		## ACL_USER
group::r-x			## ACL_GROUP_OBJ
group:group1:r--	## ACL_GROUP
mask::rwx			## ACL_MASK
other::r-x
  • ACL_USER_OBJ: 文件所有者
  • ACL_USER:通过 ACL 授权的用户
  • ACL_GROUP_OBJ:文件所属组
  • ACL_GROUP:通过 ACL 授权的组
  • ACL_MASK:ACL_USER, ACL_GROUP, ACL_GROUP_OBJ 三者的最大权限

如果没有手动设置 acl_mask 的权限,ACL_MASK 的权限会随着 ACL_USER, ACL_GROUP, ACL_GROUP_OBJ 三者的变化而变化,且时三者的最大权限。

设置 mask 权限

  • 手动设置了 mask 的权限,最高权限则按照 mask 所设置的权限
  • 如果没有手动设置 acl mask 权限,则对用户/组设置的 ACL 权限生效,不需要考虑 other 权限
setfacl -m m:权限 file/dir

[root@server130 logs]# setfacl -m m:r-- reports.txt
[root@server130 logs]# getfacl -c reports.txt
user::rwx
user:sadmin:rw-                 #effective:r--
group::r-x                      #effective:r--
group:group1:r--
mask::r--
other::r-x
  • 如果 mask 被设置成了 --- 权限,则指定用户可以使用 other 权限
  • 如果 mask 被设置成了非 --- 权限,则指定用户不可以使用 other 权限。
[root@server130 logs]# setfacl -m m:--- reports.txt
[root@server130 logs]# getfacl -c reports.txt
user::rwx
user:sadmin:rw-                 #effective:---
group::r-x                      #effective:---
group:group1:r--                #effective:---
mask::---
other::r-x

[root@server130 logs]# su - sadmin
[sadmin@server130 ~]$ cat /opt/logs/reports.txt
2023年 10月 19日 星期四 21:34:20 CST


[root@server130 logs]# setfacl -m m:--x reports.txt
[root@server130 logs]# getfacl -c reports.txt
user::rwx
user:sadmin:rw-                 #effective:---
group::r-x                      #effective:--x
group:group1:r--                #effective:---
mask::--x
other::r-x
[root@server130 logs]# su - sadmin
[sadmin@server130 ~]$ cat /opt/logs/reports.txt
cat: /opt/logs/reports.txt: 权限不够
[sadmin@server130 ~]$

5. 设置默认权限

为了确保控制在目录中创建的文件和目录继承特定的 ACL,可以在目录上she'zhi

[root@server130 opt]# mkdir data
[root@server130 opt]# getfacl data
# file: data
# owner: root
# group: root
user::rwx
group::r-x
other::r-x

# 1. 设置默认权限
[root@server130 opt]# setfacl -m d:u:sadmin:rwx data/
[root@server130 opt]# getfacl data/
# file: data/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:sadmin:rwx
default:group::r-x
default:mask::rwx
default:other::r-x

# 2. sadmin 不能直接在 /opt/data 目录下创建文件
[root@server130 opt]# su sadmin
[sadmin@server130 opt]$ touch log01.txt
touch: 无法创建 'log01.txt': 权限不够

# 3. root 在 /opt/data 目录下创建文件
[root@server130 opt]# echo "$(date)" >> data/rootlog.txt
[root@server130 opt]# getfacl data/rootlog.txt
# file: data/rootlog.txt
# owner: root
# group: root
user::rw-
user:sadmin:rwx                 #effective:rw-
group::r-x                      #effective:r--
mask::rw-
other::r--

# 4. user:sadmin:rwx                 #effective:rw-
# sadmin 具备了 /opt/data  新建文件的读写权限
[root@server130 opt]# su sadmin
[sadmin@server130 opt]$ echo "edit by sadmin" >> data/rootlog.txt
[sadmin@server130 opt]$ cat data/rootlog.txt
2023年 10月 23日 星期一 21:17:48 CST
edit by sadmin
  • 用户 sadmin 对在 /opt/data 目录下面新建的文件具备 rwx 权限,但是对于目录并不具备 rwx 权限。
# 取消默认权限

setfacl -x d:u:sadmin data/