当前位置:首页>Linux>【技术推荐】Linux文件权限(三):ACL 访问控制列表

【技术推荐】Linux文件权限(三):ACL 访问控制列表

  • 2026-09-09 02:27:05
【技术推荐】Linux文件权限(三):ACL 访问控制列表

当基础权限、默认权限与特殊权限的边界明确之后,权限控制便会进入更贴近生产协作的场景。传统的 owner、group、others 三层模型,在多用户共享、按人分权和目录继承等需求下,往往难以满足精细控制要求。本文围绕 ACL 的概念、启用方式、核心命令、默认 ACL、mask 约束和脚本化配置展开,说明 ACL 的使用逻辑与落地路径。

ACL 访问控制列表
1

本节概述 ACL 的用途、启用方式和核心命令。

1.1 ACL 简介

传统的Unix权限模型(owner/group/others)过于简单,无法满足精细化权限控制需求。ACL(Access Control List)扩展了权限模型,支持对单个用户或组设置独立的权限。

●●●Terminal
# 检查文件系统是否支持ACL# 主流文件系统 ext4, XFS, Btrfs 默认支持ACL# 检查ACL支持dumpe2fs -h /dev/sda1 | grep "Default mount options"# 或mount | grep acl# RHEL/CentOS 默认启用ACL# Ubuntu 默认启用ACL# 启用ACL(如果需要手动开启)mount -o remount,acl /dev/sda1# 或在 /etc/fstab 中配置# /dev/sda1 /data ext4 defaults,acl 0 2
1.2  getfacl 和 setfacl 命令
●●●Terminal
# 查看ACLgetfacl /path/to/file# 示例touch /tmp/acl_test.txtgetfacl /tmp/acl_test.txt# # file: acl_test.txt# # owner: root# # group: root# user::rw-# group::r--# other::r--# 为单个用户设置权限setfacl -m u:john:rw /tmp/acl_test.txtgetfacl /tmp/acl_test.txt# # file: acl_test.txt# # owner: root# # group: root# user::rw-# user:john:rw-# group::r--# mask::rw-# other::r--# 为单个组设置权限setfacl -m g:developers:rx /tmp/acl_test.txtgetfacl /tmp/acl_test.txt# # file: acl_test.txt# # owner: root# # group: root# user::rw-# user:john:rw-# group::r--# group:developers:r-x# mask::rw-# other::r--# 为多个用户/组设置setfacl -m u:alice:rwx,u:bob:r-x,g:qa:rx /tmp/acl_test.txt
1.3 默认ACL

默认ACL应用于目录,新建的子文件/子目录会自动继承。

●●●Terminal
# 设置目录的默认ACLmkdir -p /home/sharedsetfacl -R -m u:alice:rwx /home/shared           # 递归设置setfacl -R -m g:team:rx /home/shared# 设置默认ACL(仅影响新建文件)setfacl -d -m u:bob:rw /home/sharedsetfacl -d -m g:team:rx /home/sharedsetfacl -d -m o::r /home/shared                   # 其他用户默认读权限# 查看默认ACLgetfacl /home/shared# # file: shared# # owner: root# # group: root# user::rwx# user:alice:rwx# group::r-x# group:team:r-x# mask::rwx# other::r-x# default:user::rwx# default:user:bob:rw-# default:group::r-x# default:group:team:r-x# default:mask::rwx# default:other::r--# 测试继承效果touch /home/shared/testfile.txtgetfacl /home/shared/testfile.txt# 新文件自动继承默认ACL
1.4  ACL 移除与备份恢复
●●●Terminal
# 移除特定用户的ACLsetfacl -x u:john /tmp/acl_test.txt# 移除特定组的ACLsetfacl -x g:developers /tmp/acl_test.txt# 移除所有扩展ACL(保留基础权限)setfacl -b /tmp/acl_test.txt# 备份ACLgetfacl -R /home/shared > /tmp/acl_backup.txt# 恢复ACLsetfacl --restore=/tmp/acl_backup.txt# 复制ACL到其他文件getfacl file1.txt | setfacl --set-file=- file2.txt
1.5 ACL 权限计算

•ACL 权限检查顺序

•1. 如果进程以文件owner身份运行 -> 应用 owner ACL 条目

•2. 如果进程属于文件关联的group或ACL中的某个group -> 应用匹配的最优ACL组条目

•3. 应用 other ACL 条目

•mask 对扩展ACL的影响

•1. mask 限制了所有ACL条目的有效权限(除了owner和other)

•2. 即使单独设置了 u:john:rwx,如果mask是r--,实际权限也是r--

●●●Terminal
# 调整masksetfacl -m m::r /tmp/acl_test.txt   # 设置mask为r--setfacl -m m::rw /tmp/acl_test.txt  # 设置mask为rw-
1.6 ACL 实用脚本
●●●Terminal
#!/bin/bash# setup_shared_directory.sh - 配置共享目录的ACL权限set -euo pipefailSHARE_DIR="${1:-/home/shared}"PRIMARY_GROUP="${2:-developers}"PERMISSIONS="${3:-2775}"# 用户列表(根据实际情况修改)declare -a ALLOWED_USERS=("alice""bob""charlie")declare -a READONLY_USERS=("qa_user""auditor")if [ ! -d "$SHARE_DIR" ]; then    echo"错误:目录不存在: $SHARE_DIR"    exit 1fiecho"=== 共享目录 ACL 配置 ==="echo"目录: $SHARE_DIR"echo"主组: $PRIMARY_GROUP"echo"权限: $PERMISSIONS"echo""# 设置基础权限echo"[1/4] 设置基础权限..."chown root:"$PRIMARY_GROUP""$SHARE_DIR"chmod "$PERMISSIONS""$SHARE_DIR"# 清理现有ACLecho"[2/4] 清理现有ACL..."setfacl -b "$SHARE_DIR"# 设置默认ACL(递归)echo"[3/4] 设置默认ACL..."for user in"${ALLOWED_USERS[@]}"; do    if id "$user" &>/dev/null; then        setfacl -R -m u:"$user":rwx "$SHARE_DIR"        setfacl -d -R -m u:"$user":rwx "$SHARE_DIR"        echo"  - 添加读写用户: $user"    else        echo"  - 警告:用户不存在: $user"    fidonefor user in"${READONLY_USERS[@]}"; do    if id "$user" &>/dev/null; then        setfacl -R -m u:"$user":r-x "$SHARE_DIR"        setfacl -d -R -m u:"$user":r-x "$SHARE_DIR"        echo"  - 添加只读用户: $user"    else        echo"  - 警告:用户不存在: $user"    fidone# 设置组默认权限setfacl -d -R -m g::rwx "$SHARE_DIR"setfacl -d -R -m g:"$PRIMARY_GROUP":rwx "$SHARE_DIR"setfacl -d -R -m o::rx "$SHARE_DIR"# 设置masksetfacl -R -m m::rwx "$SHARE_DIR"echo"[4/4] 验证配置..."echo""getfacl "$SHARE_DIR"echo""echo"=== 配置完成 ==="echo""echo"测试方法:"for user in"${ALLOWED_USERS[@]}"; do    echo"su - $user -c 'touch $SHARE_DIR/${user}_test.txt'"done
本篇小结

ACL 的价值并不止于为个别用户补充额外权限,而在于将传统权限模型扩展为适合协作、继承与长期维护的控制体系。将默认 ACL、mask 约束、备份恢复和脚本化配置纳入同一链路后,ACL 才真正具备设计、实施、验证和批量复用的治理意义。

欢迎「长按」下方图片👇,关注我们在公众号上的专业知识分享。

最新文章

随机文章