文件ACL-控制

介绍

ACL (Access Control List) 是一种在 Linux 系统中用于扩展文件和目录权限的机制. ACL 提供了更细粒度的权限控制, 允许对特定文件或目录中的个别用户或用户组设置特定的权限.

如, 给 user1 可读写权限, user2 只读权限, user3 没有任何权限.

主要是三个命令:

  • getfacl (Get File ACL), 用于获取文件或目录的 ACL
  • setfacl (Set File ACL), 用于设置文件或目录的 ACL
  • chacl (Change ACL), 用于修改文件或目录的 ACL

getfacl 的使用

语法:

1
getfacl [options] file

常用选项:

  • -a, --access, 显示文件的访问控制列表
  • -d, --default, 显示默认的访问控制列表
  • -c, --omit-header, 不显示注释表头
  • -e, --all-effective, 显示所有有效权限
  • -E, --no-effective, 显示无效权限

对于文件或目录(不包括目录下的文件):

1
getfacl notify.pl

输出如:

1
2
3
4
5
6
# file: notify.pl
# owner: jie
# group: jie
user::rwx
group::r-x
other::r-x
  • 前三行为注释表头
  • user::rwx 为一条 ACL Entries, 表示对所有者的权限设置.
  • group::r-x 是对所属组的权限设置.
  • other::r-x 是对其他用户的权限设置.

若要作用域目录下的全部文件:

1
getfacl test/*

递归作用于所有子目录:

1
getfacl -R test/

setfacl 的使用

可以从命令行指定文件列表, 也可以从文件或 stdin 处获取文件列表.

文件列表用 , (逗号) 分隔.

可以设置, 也可以修改 ACL.

设置时, 需要满足 ACL Entries 的格式.

语法:

1
setfacl [options] {-m|-M|-x|-X...} file

必须选用的选项解释:

  • -m, --modify, 表示修改或添加 acl
  • -M, --modify-file, 从文件中读取 acl 规则
  • -x, --remove, 移除指定用户或用户组的 acl 条目
  • -X, --remove-file, 从文件中读取要移除的条目

其他常用选项有:

  • -b, --remove-all, 删除所有 acl 设定
  • -k, --remove-default, 删除默认的 acl 设定
  • -R, --recursive, 递归设置 acl
  • -d, --directory, 设置目录的 acl

ACL Entries 的格式

如为 user 设置一个 entry:

1
[u[ser]:]uid [:perms]

也就是可以写为:

1
user:uid :perms

或:

1
u:uid :perms

(注意这里的 u, user 是关键字, 而不是具体名字)

注意这里 uid :perms 之间的空白符其实可以忽略.

uid 可以直接写用户名.

perms 也可以为字符或数字的格式.

同理设置 group, mask 和 other:

1
2
3
g[roup]:gid [:perms]
m[ask][:] [:perms]
o[ther][:] [:perms]

(同样注意 g, group, m, mask, o, other 这些是关键字)

默认的 ACL Entries

一般文件和目录会有三个 base ACL entries 作用于 owner, group 和 others:

1
2
3
4
5
6
7
8
getfacl notify.pl
---
# file: notify.pl
# owner: jie
# group: jie
user::rwx
group::r-x
other::r-x

ACL Entries 起作用需要满足的条件

  1. base entries 不能被移除. user, group, 和 other 都至少需要设置一条
  2. 当 entries 中有 named user entries 或 named group entries 时, 需要加上合适的 mask

示例

有几个参数需要注意:

  • -s (--set), -m (--modify), 和 -x (--remove) 都从命令行获取文件列表.
  • -S (--set-file), -M (--modify-file), 和 -X (--remove-file) 从文件或 stdin 获取文件列表
1
2
3
4
5
6
7
8
#Revoking  write  access  from all groups and all named users (using the effective rights mask)
setfacl -m m::rx file
#Removing a named group entry from a file's ACL
setfacl -x g:staff file
#Copying the ACL of one file to another
getfacl file1 | setfacl --set-file=- file2
# Copying the access ACL into the Default ACL
getfacl --access dir | setfacl -d -M- dir

给指定用户添加 acl

1
setfacl -m u:john:rwx notify.pl

从文件读取要添加的 acl

1
setfacl -M acl_rules.txt notify.pl

acl_rules.txt 的文件内容可以为:

1
2
3
4
5
# ACL rules for myfile.txt

user:john:rwx
group:developers:r--
user:jane:rw-

chacl 使用

语法:

1
chacl [options] file

常用选项有:

  • -b, 同时修改文件权限和默认目录权限
  • -d, 设置目录的默认权限
  • -R, 只删除文件的权限
  • -D, 只删除目录的权限
  • -B, 删除所有权限
  • -I, 列出所有文件和目录的权限
  • -r, 递归设置

示例

1
2
chacl u::rwx,g::r-x,o::r-- file
chacl u::rwx,g::r-x,o::r--,u:bob:r--,m::r-x file1 file2

也可以用来获取 ACL:

1
chacl -l file

文件ACL-控制
http://example.com/2023/11/05/文件ACL-控制/
作者
Jie
发布于
2023年11月5日
许可协议