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--

相关推荐
Lovyk1 小时前
Linux 正则表达式
linux·运维
Fireworkitte2 小时前
Ubuntu、CentOS、AlmaLinux 9.5的 rc.local实现 开机启动
linux·ubuntu·centos
sword devil9002 小时前
ubuntu常见问题汇总
linux·ubuntu
ac.char3 小时前
在CentOS系统中查询已删除但仍占用磁盘空间的文件
linux·运维·centos
中科米堆4 小时前
中科米堆CASAIM自动化三维测量设备测量汽车壳体直径尺寸
运维·自动化·汽车·视觉检测
淮北也生橘124 小时前
Linux的ALSA音频框架学习笔记
linux·笔记·学习
缘华工业智维5 小时前
CNN 在故障诊断中的应用:原理、案例与优势
大数据·运维·cnn
开航母的李大6 小时前
软件系统运维常见问题
运维·服务器·系统架构·运维开发
有梦想的攻城狮7 小时前
Java 11中的Collections类详解
java·windows·python·java11·collections
忒可君7 小时前
C# winform FTP功能
开发语言·windows·c#