CodeGym /课程 /Docker SELF /使用ACL管理访问权限 (`setfacl`, `getfacl`)

使用ACL管理访问权限 (`setfacl`, `getfacl`)

Docker SELF
第 5 级 , 课程 3
可用

使用ACL管理访问权限 setfacl, getfacl

1. 认识ACL

想象一下,你是一个派对的组织者(或者系统管理员)。你希望客人可以进入某些指定的房间,而其他房间只能在你允许的情况下进入。Linux中的基本访问权限rwx只允许你管理三种类别的权限:所有者(user)、组(group)以及其他人(others)。但是,如果你只想让一个特别的朋友进入某个房间呢?标准的权限模型会告诉你:"嘿,这样可不行"。这时候,ACL就能派上用场了。

ACL(Access Control Lists)解决了传统三层权限系统的局限性,让你可以为特定的用户和组设置访问权限。

ACL的主要功能:

  1. 为特定的用户和组设置文件和目录的个性化权限。
  2. 目录中新建文件会继承权限。
  3. 比传统chmod方法更灵活的配置方式。

2. 如何检查是否启用了 ACL?

在开始管理 ACL 之前,我们先来弄清楚你的系统是否支持它。你可以通过以下命令检查:

mount | grep acl

如果文件系统是用 acl 选项挂载的,那你就准备好啦!否则,你需要通过添加 acl 选项重新挂载分区:

sudo mount -o remount,acl /your/mount/point

好了,现在你就准备好了。是时候深入实际操作了。


3. 操作 ACL 的基本命令

命令 描述
getfacl 获取文件或目录当前的 ACL 列表。
setfacl 为文件或目录设置或修改 ACL。
setfacl -m 修改 (modify) 当前的访问权限。
setfacl -x 删除 (remove) 指定的访问权限。
setfacl -b 删除文件或目录的所有 ACL 记录。
setfacl -d 为目录设置默认权限,这些权限会被文件继承。

现在我们用例子来解释这些命令吧!


获取当前 ACL getfacl

假设我们有一个文件 example.txt。我们想用 ACL 查看当前权限。只需要一条命令:

getfacl example.txt

示例输出如下:

# file: example.txt
# owner: user1
# group: group1
user::rw-
group::r--
other::---

这个列表显示了标准权限:拥有者 user1 可以读写,组 group1 只能读取,其他用户无法访问。


设置单个访问权限 (setfacl)

现在假如我们需要允许用户 user2 写入文件 example.txt,可以这样做:

sudo setfacl -m u:user2:rw example.txt

这条命令的意思是:

  • -m: 修改权限。
  • u:user2:rw: 为用户 user2 添加或修改权限(读写)。

检查结果:

getfacl example.txt

现在输出如下:

# file: example.txt
# owner: user1
# group: group1
user::rw-
user:user2:rw  # 新增的规则!
group::r--
other::---

删除单个访问权限 setfacl -x

如果你决定用户 user2 不再需要写权限,可以删除这些权限:

sudo setfacl -x u:user2 example.txt

检查:

getfacl example.txt

现在已经没有 user2 的额外规则了!


为组设置权限

通过 ACL 不仅可以为单个用户设置权限,也可以为整个组设置权限。例如,想要给组 devteam 读写权限:

sudo setfacl -m g:devteam:rw example.txt

设置默认权限 setfacl -d

经常需要自动为某个目录内的所有新文件和目录设置权限。例如,你希望目录 project_dir 中的所有文件对用户 developer 具有写权限。在这种情况下:

sudo setfacl -d -m u:developer:rw project_dir

可以通过以下命令检查权限:

getfacl project_dir

现在,project_dir 中的所有新文件和子目录都将应用此默认规则。


删除所有 ACL setfacl -b

如果你想完全清除文件的所有 ACL:

sudo setfacl -b example.txt

现在文件将恢复到标准的权限模式 user:group:others


4. ACL的实际应用

场景:项目中的协同工作

假设你有一个存放在/project目录下的项目。三个人参与工作:

  • Alice需要拥有完全访问权限(读取、写入、执行)。
  • Bob只能读取文件。
  • Eve根本不能看到该目录。

我们通过ACL来设置这些权限:

  1. Alice完全访问权限:

    sudo setfacl -m u:alice:rwx /project
    
  2. Bob只读权限:

    sudo setfacl -m u:bob:r-- /project
    
  3. 对于Eve什么都不用做——她默认无法访问。

让我们查看当前的ACL列表:

getfacl /project

输出:

# 文件: /project
# 所有者: root
# 所属组: root
user::rwx
user:alice:rwx
user:bob:r--
group::---
other::---

现在Alice可以毫无限制地工作了,Bob只能查看文件,Eve则被完全排除在外了。


5. 潜在的错误及其解决方案

  1. 你已经配置了ACL,但它们不起作用。 很可能是分区未使用acl选项挂载。使用mount进行检查,并在需要时重新挂载。

  2. 标准权限与ACL之间的冲突。 ACL始终优先于标准权限。例如,即使“others”被禁止读取,ACL也可能允许特定用户访问。

  3. 忘记继承的ACL。 如果你配置了-d(default)权限,请检查这些规则是否被新文件继承。

为什么这很重要?

通过ACL管理权限让你可以灵活地为不同用户和组配置访问权限。在需要根据角色分配权限的工作服务器上,这特别有用。例如,在公司中,ACL用于为那些“懂其中关键信息”的人限制访问权限——这是安全性的关键之一。

你还可以查看ACL官方文档以更好地理解它们的功能。

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION