ACL(Access Control Lists)
什么是ACL
ACL(Access Control List,访问控制列表)是Linux系统中一种灵活的权限管理机制,它在传统的UGO(User、Group、Other,用户、组、其他)权限模型基础上进行了扩展。传统的UGO权限只能针对文件的所有者、所属组和其他用户设置权限,而ACL允许为特定的用户或组设置更精细的访问权限,解决了UGO权限在某些场景下的不足。
简单来说,ACL就像是给文件或目录添加了额外的“权限标签”,让我们可以更灵活地控制谁可以访问以及如何访问这些文件或目录。
ACL的作用:
- 更精细的权限控制: 可以针对特定的用户或组设置读、写、执行权限,而不仅仅局限于所有者、所属组和其他用户
- 解决UGO 权限的不足: 当需要允许多个用户或组以不同权限访问同一文件或目录时,ACL提供了有效的解决方案
- 方便权限管理: 通过ACL可以更方便地管理复杂的权限需求,而无需频繁更改文件的所有者或所属组
ACL的组成
ACL由一系列的访问控制条目(ACE,Access Control Entry)组成,每个ACE 定义了一个用户或组的访问权限。一个 ACE 通常包含以下信息:
类型:标识符:权限
- 类型:即ACE的类型,例如
u用户,g组,m掩码 - 标识符:指定用户或组的名称或ID
- 权限: 指定允许的访问权限,读
r, 写w和执行x
管理ACL的命令
Linux中用于管理ACL的主要命令有两个:
setfacl: 用于设置或修改文件的ACLgetfacl: 用于查看文件的 ACL
getfacl
示例:
getfacl audit.log
# file: audit.log
# owner: root
# group: root
user::rw-
group::---
other::---setfacl
setfacl --help
Usage: setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...
-m, --modify=acl modify the current ACL(s) of file(s)
-M, --modify-file=file read ACL entries to modify from file
-x, --remove=acl remove entries from the ACL(s) of file(s)
-X, --remove-file=file read ACL entries to remove from file
-b, --remove-all remove all extended ACL entries
-k, --remove-default remove the default ACL
--set=acl set the ACL of file(s), replacing the current ACL
--set-file=file read ACL entries to set from file
--mask do recalculate the effective rights mask
-n, --no-mask don't recalculate the effective rights mask
-d, --default operations apply to the default ACL
-R, --recursive recurse into subdirectories
-L, --logical logical walk, follow symbolic links
-P, --physical physical walk, do not follow symbolic links
--restore=file restore ACLs (inverse of `getfacl -R')
--test test mode (ACLs are not modified)
-v, --version print version and exit
-h, --help this help textsetfacl 命令的常用选项包括:
-m:修改ACL条目。-x:删除指定的ACL条目。-b:删除文件的所有ACL条目。-d:设置默认ACL条目(用于目录,新创建的文件会继承这些 ACL)。-k:删除默认ACL条目。-R:递归地设置ACL条目(用于目录及其子目录)。
例子:
给用户alice设置文件的读写权限:
setfacl -m u:alice:rw file.txt给组developers设置目录的读和执行权限:
setfacl -m g:developers:rx directory删除用户bob对文件的ACL条目:
setfacl -x u:bob file.txt删除文件的所有ACL条目:
setfacl -b file.txt例子:
# 删除(-x)用户ID 10001对/var/log/pods目录及其所有子目录和文件(-R表示递归)的ACL权限
setfacl -R -x u:10001 /var/log/pods
# 设置(-m)用户ID 10001对/var/log/pods目录及其所有子目录和文件的权限为读取和执行(rx)。
# 同时,它也设置默认ACL(d:u:10001:rx),确保该目录下新创建的文件和子目录也会继承这些权限
setfacl -R -m u:10001:rx,d:u:10001:rx /var/log/podsACL的掩码(mask)
ACL的掩码用于限制用户和组的最大有效权限。例如,如果一个用户的ACL条目设置为rw-,但掩码设置为r--,则该用户的实际有效权限只有r--。
掩码就像是一个“过滤器”,它会“过滤”掉所有超出其范围的权限。即使 ACL 条目设置了更高的权限,最终的有效权限仍然会受到掩码的限制。这为我们提供了一种方便的方式来控制所有用户和组的最大访问权限,提高了权限管理的灵活性和安全性。
例如:
mkdir project
setfacl -m m::rx project
getfacl project/
# file: project/
# owner: root
# group: root
user::rwx
group::r-x
mask::r-x
other::r-x