Linux ACL 权限详解与多场景实践

这里写目录标题

      • [Linux ACL 权限详解与多场景实践](#Linux ACL 权限详解与多场景实践)
    • [一、什么是 ACL?](#一、什么是 ACL?)
      • [ACL 的两种类型](#ACL 的两种类型)
    • [二、启用 ACL 功能](#二、启用 ACL 功能)
      • [1. 确认文件系统支持 ACL](#1. 确认文件系统支持 ACL)
      • [2. 挂载文件系统启用 ACL](#2. 挂载文件系统启用 ACL)
    • [三、ACL 常用命令](#三、ACL 常用命令)
      • [1. **设置 ACL**](#1. 设置 ACL)
      • [2. **查看 ACL**](#2. 查看 ACL)
      • [3. **删除 ACL**](#3. 删除 ACL)
      • [4. **复制 ACL**](#4. 复制 ACL)
    • [四、ACL 实战场景](#四、ACL 实战场景)
      • [场景 1:为特定用户增加权限](#场景 1:为特定用户增加权限)
      • [场景 2:目录的继承权限](#场景 2:目录的继承权限)
      • [场景 3:临时增加访问权限](#场景 3:临时增加访问权限)
      • [场景 4:备份与恢复 ACL](#场景 4:备份与恢复 ACL)
    • 五、注意事项
    • 六附录:
    • [1、`setfacl` 参数说明及示例](#1、setfacl 参数说明及示例)
      • [1. **`-m` 或 `--modify=acl`**](#1. -m--modify=acl)
      • [2. **`-M` 或 `--modify-file=file`**](#2. -M--modify-file=file)
      • [3. **`-x` 或 `--remove=acl`**](#3. -x--remove=acl)
      • [4. **`-X` 或 `--remove-file=file`**](#4. -X--remove-file=file)
      • [5. **`-b` 或 `--remove-all`**](#5. -b--remove-all)
      • [6. **`-k` 或 `--remove-default`**](#6. -k--remove-default)
      • [7. **`--set=acl`**](#7. --set=acl)
      • [8. **`--set-file=file`**](#8. --set-file=file)
      • [9. **`-n` 或 `--no-mask`**](#9. -n--no-mask)
      • [10. **`-R` 或 `--recursive`**](#10. -R--recursive)
      • [11. **`--restore=file`**](#11. --restore=file)
    • [2、`getfacl` 参数说明及示例](#2、getfacl 参数说明及示例)
      • [1. **`-a` 或 `--access`**](#1. -a--access)
      • [2. **`-d` 或 `--default`**](#2. -d--default)
      • [3. **`-c` 或 `--omit-header`**](#3. -c--omit-header)
      • [4. **`-R` 或 `--recursive`**](#4. -R--recursive)
      • [5. **`-n` 或 `--numeric`**](#5. -n--numeric)
      • [6. **`-p` 或 `--absolute-names`**](#6. -p--absolute-names)
      • [7. **`-t` 或 `--tabular`**](#7. -t--tabular)
      • [8. **`-e` 或 `--all-effective`**](#8. -e--all-effective)
      • [9. **`-E` 或 `--no-effective`**](#9. -E--no-effective)
    • 3、实际综合案例

Linux ACL 权限详解与多场景实践

在传统的 Linux 文件权限模型中(rwx 权限和所有者、所属组、其他用户),我们可以实现基本的访问控制。但是,对于复杂场景,如需要为多个用户或用户组设置不同权限时,传统模型可能显得力不从心。这时,ACL(Access Control List,访问控制列表) 就能提供更细粒度的权限管理。

本文将详细介绍 Linux ACL 的原理、常用命令,并结合多种实际应用场景进行演示。


一、什么是 ACL?

ACL 是文件系统扩展权限的一部分,它允许为文件或目录设置额外的权限规则,超越传统的 rwx 权限限制。通过 ACL,我们可以:

  • 为单个用户设置权限。
  • 为用户组设置权限。
  • 为多个用户或组分别设置不同权限。

ACL 的两种类型

  1. 访问 ACL(Access ACL):用于文件或目录,定义具体用户或组的权限。
  2. 默认 ACL(Default ACL):仅对目录有效,定义新创建文件或子目录的继承权限。

二、启用 ACL 功能

大多数现代 Linux 文件系统(如 ext4、xfs)默认支持 ACL。如果需要确认或启用 ACL,请按照以下步骤:

1. 确认文件系统支持 ACL

使用以下命令检查挂载选项是否包含 acl

bash 复制代码
mount | grep acl

2. 挂载文件系统启用 ACL

如果没有启用 ACL,可以通过重新挂载开启:

bash 复制代码
mount -o remount,acl /dev/sdX /your/mountpoint

也可以在 /etc/fstab 中添加 acl 参数:

bash 复制代码
/dev/sdX  /your/mountpoint  ext4  defaults,acl  0  2

然后重新挂载:

bash 复制代码
mount -o remount /your/mountpoint

三、ACL 常用命令

Linux 提供了多种工具来管理和查看 ACL:

1. 设置 ACL

使用 setfacl 设置 ACL:

bash 复制代码
setfacl -m [规则] [文件或目录]

示例:

bash 复制代码
setfacl -m u:john:rwx myfile      # 为用户 john 设置 rwx 权限
setfacl -m g:developers:rx myfile # 为组 developers 设置 rx 权限

2. 查看 ACL

使用 getfacl 查看 ACL:

bash 复制代码
getfacl [文件或目录]

3. 删除 ACL

  • 删除特定 ACL 条目:

    bash 复制代码
    setfacl -x [规则] [文件或目录]

    示例:

    bash 复制代码
    setfacl -x u:john myfile # 删除 john 用户的 ACL 权限
  • 删除所有 ACL:

    bash 复制代码
    setfacl -b [文件或目录]

4. 复制 ACL

将一个文件的 ACL 复制到另一个文件:

bash 复制代码
getfacl source_file | setfacl --set-file=- target_file

四、ACL 实战场景

场景 1:为特定用户增加权限

需求:

某项目文件 project.txt,其所有者为用户 admin,默认只允许同组成员访问。但需要让用户 john 拥有写权限。

操作:
  1. 检查文件权限:

    bash 复制代码
    ls -l project.txt

    输出:

    -rw-r----- 1 admin developers 1024 Nov 27 12:00 project.txt
    
  2. 为用户 john 设置写权限:

    bash 复制代码
    setfacl -m u:john:rw project.txt
  3. 验证 ACL:

    bash 复制代码
    getfacl project.txt

    输出:

    # file: project.txt
    # owner: admin
    # group: developers
    user::rw-
    user:john:rw-
    group::r--
    mask::rw-
    other::---
    

场景 2:目录的继承权限

需求:

创建目录 team_folder,要求所有新文件或子目录都继承组 team 的写权限。

操作:
  1. 创建目录并设置默认 ACL:

    bash 复制代码
    mkdir team_folder
    setfacl -m d:g:team:rw team_folder
  2. 验证默认 ACL:

    bash 复制代码
    getfacl team_folder

    输出:

    # file: team_folder
    # owner: admin
    # group: admin
    user::rwx
    group::r-x
    group:team:rw-
    mask::rwx
    other::r-x
    default:user::rwx
    default:group::r-x
    default:group:team:rw-
    default:mask::rwx
    default:other::r-x
    
  3. 测试继承效果:

    创建新文件:

    bash 复制代码
    touch team_folder/newfile.txt
    getfacl team_folder/newfile.txt

    输出:

    # file: team_folder/newfile.txt
    # owner: admin
    # group: admin
    user::rw-
    group::r--
    group:team:rw-
    mask::rw-
    other::r--
    

场景 3:临时增加访问权限

需求:

需要临时给用户 alice 访问项目文件 data.log 的权限,访问结束后撤销。

操作:
  1. 增加访问权限:

    bash 复制代码
    setfacl -m u:alice:r data.log
  2. 访问结束后删除权限:

    bash 复制代码
    setfacl -x u:alice data.log

场景 4:备份与恢复 ACL

需求:

备份文件的 ACL 并应用到新环境。

操作:
  1. 导出 ACL:

    bash 复制代码
    getfacl -R /project > acl_backup.txt
  2. 恢复 ACL:

    bash 复制代码
    setfacl --restore=acl_backup.txt

五、注意事项

  1. ACL 的优先级

    • ACL 权限优先于传统权限,但受制于文件的「掩码权限(mask)」。
    • 如果掩码权限(mask)设置为 r--,即使用户的 ACL 是 rwx,也只能读。
  2. 性能问题

    • ACL 是文件系统的扩展特性,可能会增加 I/O 操作的复杂性,建议谨慎使用在性能敏感的场景。
  3. 工具兼容性

    • 部分旧工具可能不支持 ACL,使用前需确认工具是否兼容 ACL。

六附录:

以下是 setfaclgetfacl 的参数详细说明及实际使用示例。ACL 管理是 Linux 中实现精细权限控制的重要手段,通过熟练使用这些参数,您可以灵活地设置和查看文件的访问控制列表。


1、setfacl 参数说明及示例

setfacl 用于设置或修改文件和目录的 ACL 权限,以下是主要参数的功能和示例:

1. -m--modify=acl

修改文件的 ACL 条目。

bash 复制代码
setfacl -m u:john:rw file.txt  # 为用户 john 添加读写权限
setfacl -m g:developers:r file.txt  # 为组 developers 添加只读权限

2. -M--modify-file=file

从文件中读取 ACL 条目并应用到目标文件。

bash 复制代码
echo "u:john:rw" > acl_rules.txt
setfacl -M acl_rules.txt file.txt  # 根据 acl_rules.txt 文件设置 ACL

3. -x--remove=acl

移除指定的 ACL 条目。

bash 复制代码
setfacl -x u:john file.txt  # 删除用户 john 的 ACL 权限

4. -X--remove-file=file

从文件中读取要移除的 ACL 条目。

bash 复制代码
echo "u:john" > acl_remove.txt
setfacl -X acl_remove.txt file.txt  # 从 acl_remove.txt 中删除指定 ACL

5. -b--remove-all

移除文件或目录的所有扩展 ACL。

bash 复制代码
setfacl -b file.txt  # 删除 file.txt 的所有扩展 ACL

6. -k--remove-default

移除目录的默认 ACL。

bash 复制代码
setfacl -k dir/  # 删除 dir 的默认 ACL

7. --set=acl

替换文件的现有 ACL 条目。

bash 复制代码
setfacl --set u:john:rw,g:developers:r,o::--- file.txt  # 设置完整 ACL

8. --set-file=file

从文件中读取 ACL 条目,并替换现有 ACL。

bash 复制代码
echo "u:john:rw" > acl_set.txt
setfacl --set-file=acl_set.txt file.txt  # 设置 file.txt 的 ACL

9. -n--no-mask

不重新计算有效权限掩码。

bash 复制代码
setfacl -m u:john:rwx -n file.txt  # 为 john 设置 rwx 权限,不修改掩码

10. -R--recursive

递归设置目录及其子目录和文件的 ACL。

bash 复制代码
setfacl -m g:team:rw -R dir/  # 为目录 dir 下的所有文件和子目录设置组 team 的 rw 权限

11. --restore=file

恢复文件的 ACL(通常与 getfacl -R 配合使用)。

bash 复制代码
getfacl -R /mydir > acl_backup.txt  # 备份 ACL
setfacl --restore=acl_backup.txt  # 恢复 ACL

2、getfacl 参数说明及示例

getfacl 用于查看文件和目录的 ACL,以下是常用参数的功能和示例:

1. -a--access

仅显示文件的访问 ACL。

bash 复制代码
getfacl -a file.txt

2. -d--default

仅显示目录的默认 ACL。

bash 复制代码
getfacl -d dir/

3. -c--omit-header

忽略头部的注释信息。

bash 复制代码
getfacl -c file.txt

默认输出示例:

# file: file.txt
# owner: root
# group: root
user::rw-
group::r--
other::r--

使用 -c 后仅输出:

user::rw-
group::r--
other::r--

4. -R--recursive

递归获取目录及其子目录和文件的 ACL。

bash 复制代码
getfacl -R /mydir

5. -n--numeric

以数字形式显示用户和组的标识符(UID 和 GID)。

bash 复制代码
getfacl -n file.txt

6. -p--absolute-names

保留路径的绝对路径信息。

bash 复制代码
getfacl -p /path/to/file.txt

7. -t--tabular

以表格格式输出 ACL 信息。

bash 复制代码
getfacl -t file.txt

8. -e--all-effective

显示所有有效权限。

bash 复制代码
getfacl -e file.txt

9. -E--no-effective

不显示有效权限信息。

bash 复制代码
getfacl -E file.txt

3、实际综合案例

1. 备份和恢复 ACL

操作步骤:
  1. 备份 /project 目录及其内容的 ACL:

    bash 复制代码
    getfacl -R /project > acl_backup.txt
  2. 恢复 ACL:

    bash 复制代码
    setfacl --restore=acl_backup.txt

2. 多用户权限管理

场景:

用户 johnalice 都需要访问 data.txt 文件,john 需要写权限,alice 仅需要读权限。

操作:
  1. 设置权限:

    bash 复制代码
    setfacl -m u:john:rw,u:alice:r data.txt
  2. 验证:

    bash 复制代码
    getfacl data.txt

    输出:

    # file: data.txt
    user::rw-
    user:john:rw-
    user:alice:r--
    group::r--
    mask::rw-
    other::r--
    

3. 默认 ACL 应用

场景:

创建目录 /shared,要求所有新文件都具有组 team 的写权限。

操作:
  1. 设置默认 ACL:

    bash 复制代码
    mkdir /shared
    setfacl -m d:g:team:rw /shared
  2. 验证继承:

    bash 复制代码
    touch /shared/testfile
    getfacl /shared/testfile

    输出:

    # file: /shared/testfile
    user::rw-
    group::r--
    group:team:rw-
    mask::rw-
    other::r--
    

相关推荐
ITKEY_7 分钟前
vmware ubuntu分区扩容-扩展逻辑卷 (LVM)
linux·运维·ubuntu
路星辞*15 分钟前
基于访问表的安全防范策略
运维·网络·安全·智能路由器·acl
骑台风走20 分钟前
ubuntu22.04 编译安装libvirt 10.x
linux·服务器·ubuntu
涛ing24 分钟前
【Ubuntu 上搭建 Nginx-RTMP 服务】
linux·服务器·c++·nginx·ubuntu·ffmpeg·音视频
大模型服务器厂商38 分钟前
急速了解什么是GPU服务器
运维·服务器
Bytebase1 小时前
AWS re:Invent 2024 现场实录 - It‘s all about Scale
运维·数据库·dba·开发者·数据库管理·devops
浪浪山小白兔2 小时前
在Ubuntu中使用systemd设置后台自启动服务
linux·ubuntu·postgresql
步、步、为营2 小时前
C# 与 Windows API 交互的“秘密武器”:结构体和联合体
windows·c#·交互
‍理我2 小时前
Linux开发工具(补充)
linux·运维·服务器
m0_748255262 小时前
运维实战---多种方式在Linux中部署并初始化MySQL
linux·运维·mysql