当文件仅由单个所有者和指定的一组人使用时,标准的 Linux 文件权限就可以满足要求。
对于要求多个用户和组以不同的文件权限来访问文件时,就需要用到 ACL (Access Control List) 访问控制列表。
借助于 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
# 以 sadmin 用户登录,尝试去编辑 reports.txt 会发现没有权限
# sadmin 属于 other, 权限为r-x
[sadmin@server130 logs]$ vi reports.txt
2023年 10月 19日 星期四 21:34:20 CST
~
~
~
"reports.txt" [只读] 1L, 43C
对用户设置 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 -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 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--
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 所设置的权限
- 如果没有手动设置 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 ~]$
为了确保控制在目录中创建的文件和目录继承特定的 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/