Linux文件权限策略setfacl命令

本文详细介绍了Linux中的setfacl命令,包括其语法、如何添加、修改和删除文件权限,以及配合getfacl使用的实例。展示了如何管理用户对文件的访问权限,包括创建用户、添加权限、查看和删除ACL等操作。

“春风得意马蹄疾,一日看尽长安花。” ——《登高》 杜甫

Linux文件权限策略setfacl命令

前言

Linux的文件权限策略使用setfacl命令来管理的。setfacl命令允许用户在文件和目录上添加删除修改权限。它可以根据用户、组、用户组和其他条件来定义文件和目录的权限。

命令语法

setfacl命令的语法如下:

    [root@mysql5_7 ~]# setfacl -m user:username permissions file/directory

其中,-m选项用于添加或修改权限,user:username表示要授予权限的用户名,permissions表示要授予或修改的权限。

例如,如果要授予用户 test读、写和执行权限,可以使用以下命令:

   setfacl -m user:test:rwx file.txt

要列出当前文件和目录的所有权限,可以使用 getfacl 命令:

    [root@mysql5_7 ~]# getfacl file.txt
    # file: file.txt
    # owner: root
    # group: root
    user::rw-
    group::r--
    other::r--

这将列出file.txt文件的所有权限,并将它们打印到终端上。

操作案例

创建了一个名为test的用户。

    [root@mysql5_7 ~]# useradd  test

使用getfacl命令查看file.txt文件的ACL权限。

    [root@mysql5_7 ~]# getfacl file.txt
    # file: file.txt
    # owner: root
    # group: root
    user::rw-
    group::r--
    other::r--

使用setfacl命令将test用户添加到file.txt文件的ACL权限中,并赋予读写权限。

    [root@mysql5_7 ~]# setfacl -m user:test:rw file.txt

使用echo命令并通过管道方式将密码"123456"传递给passwd命令,将test用户的密码更改为"123456"。

    [root@mysql5_7 ~]# echo "123456" | passwd --stdin test
    Changing password for user test.
    passwd: all authentication tokens updated successfully.

使用ls -l命令查看file.txt文件的详细权限信息。

    [root@mysql5_7 ~]# ls -l file.txt
    -rw-rw-r--+ 1 root root 0 Aug  9 20:33 file.txt

使用chmod命令将file.txt文件的权限修改为只有root用户有访问权限。

    [root@mysql5_7 ~]# chmod 000 file.txt
    

使用ls -l命令再次查看file.txt文件的详细权限信息。

    [root@mysql5_7 ~]# ls -l file.txt
    ----------+ 1 root root 0 Aug  9 20:33 file.txt

使用su命令切换到test用户。

    [root@mysql5_7 ~]# su test
    [test@mysql5_7 root]$ ls
    ls: cannot open directory .: Permission denied

尝试使用ls命令查看根目录下的文件,但因权限不足而失败。

使用usermod命令将test用户添加到wheel组(提权)

    [root@mysql5_7 /]# usermod test -G  wheel 

使用echo命令将"1234567"写入file.txt文件。

    [test@mysql5_7 /]$ echo "1234567" > file.txt

使用cat命令查看file.txt文件的内容。

    [test@mysql5_7 /]$ cat file.txt
    1234567

创建了一个名为test2的用户。

    [root@mysql5_7 /]# useradd test2
    [root@mysql5_7 /]# echo "123456" | passwd --stdin test2
    Changing password for user test2.
    passwd: all authentication tokens updated successfully.

使用ls -l命令查看file.txt文件的详细权限信息,发现已经对其他用户进行了限制。

    [test2@mysql5_7 /]$ ls -l file.txt
    ----rwx---+ 1 root root 8 Aug 11 23:41 file.txt
    [test2@mysql5_7 /]$ vim file.txt
    [test2@mysql5_7 /]$ cat file.txt
    cat: file.txt: Permission denied
    [test2@mysql5_7 /]$ echo "12334" > file.txt
    bash: file.txt: Permission denied
    [test2@mysql5_7 /]$
  • 使用vim命令尝试编辑file.txt文件,但因权限不足而失败。

  • 使用cat命令尝试查看file.txt文件的内容,但因权限不足而失败。

  • 使用echo命令尝试向file.txt文件写入内容,但因权限不足而失败

删除 test 用户,策略也会相应地被删除

[root@mysql5_7 /]# userdel -r test
[root@mysql5_7 /]# getfacl file.txt
# file: file.txt
# owner: root
# group: root
user::---
user:1000:rwx
group::r--
mask::rwx
other::---

# 可以看到用户策略消失了

要删除所有权限,可以使用以下命令:

    setfacl -u username:username file.txt

其中,-u选项用于删除权限。

除了-m选项之外,setfacl命令还可以使用其他选项来指定其他权限和条件。有关setfacl命令的完整语法和选项

    [root@mysql5_7 ~]# setfacl --help
    setfacl 2.2.51 -- set file access control lists
    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 text

总结

本文介绍了Linux中使用setfacl命令来管理文件和目录的权限策略。setfacl命令允许用户添加、删除和修改文件和目录的权限,并根据用户、组、用户组和其他条件来定义权限。文章给出了setfacl命令的语法和示例,以及如何使用getfacl命令列出当前文件和目录的所有权限,并使用setfacl -u username:username命令删除所有权限。此外,文章还提到了setfacl命令的其他选项和完整语法。要了解更多相关信息,请参阅Linux文档或相关文档。

07-19
<think>我们参考了用户提供的引用内容,特别是引用[1][2][3]中关于setfacl命令的使用方法。 用户需求:使用setfacl命令限制特定用户对Linux目录的访问权限。 步骤: 1. 确保文件系统支持ACL(通常ext4、xfs等支持,且挂载时启用了acl选项) 2. 使用setfacl命令设置特定用户对目录权限(如禁止访问、只读、读写等) 3. 验证设置 具体操作: 案例1:禁止特定用户访问目录 setfacl -m u:username:--- /path/to/directory 案例2:允许特定用户只读目录目录需要执行权限才能进入) setfacl -m u:username:r-x /path/to/directory 案例3:允许特定用户读写目录 setfacl -m u:username:rwx /path/to/directory 注意:目录权限设置中,执行权限(x)对于目录而言意味着可以进入(访问),因此如果要让用户能够进入目录,必须给予执行权限。 另外,设置目录的ACL后,如果希望目录中新创建的文件和子目录继承ACL权限,可以使用默认ACL(d:)。但注意,默认ACL只影响之后创建的文件和目录设置默认ACL(使新创建的文件和目录继承权限): setfacl -m d:u:username:r-x /path/to/directory 删除某个用户的ACL设置setfacl -x u:username /path/to/directory 查看ACL设置: getfacl /path/to/directory 完整步骤示例: 假设我们要禁止用户testuser访问目录/secure_data,并允许用户readuser只读该目录: 步骤1:检查文件系统是否支持ACL # 查看文件系统挂载选项 mount | grep " /secure_data " # 如果没有acl选项,可以重新挂载(或者修改fstab永久生效) mount -o remount,acl /secure_data 步骤2:设置目录的基本权限(确保目录的所有者权限正确,比如root拥有完全控制) chmod 700 /secure_data # 或者保持当前权限,通过ACL来细化 步骤3:设置ACL # 禁止testuser访问 setfacl -m u:testuser:--- /secure_data # 允许readuser只读(进入和读取文件列表,但不能创建文件) setfacl -m u:readuser:r-x /secure_data 步骤4:设置默认ACL(如果需要新创建的文件和目录也自动继承这些权限,则设置默认ACL) # 注意:默认ACL只影响之后创建的文件和目录 setfacl -m d:u:testuser:--- /secure_data setfacl -m d:u:readuser:r-x /secure_data 步骤5:验证 getfacl /secure_data 注意:ACL权限和传统权限的匹配规则:当用户访问时,ACL规则按顺序匹配(用户匹配->组匹配->其他),一旦匹配则使用该规则。 安全建议: - 使用ACL时,注意目录本身的权限设置(比如目录的组权限和其他权限可能会被ACL覆盖,但为了安全,建议传统权限设置得严格一些,然后通过ACL开放特定权限)。 - 使用getfacl命令定期检查权限设置。 引用说明:我们参考了引用[1][2][3]中关于setfacl命令的用法描述。 生成相关问题: 1. 如何检查Linux文件系统是否支持ACL? 2. setfacl命令中的默认ACL(d:)有什么作用? 3. 如何删除目录设置的所有ACL规则? 4. 使用setfacl设置权限后,如何确保新创建的文件也继承父目录权限? 5. 在Linux中,ACL权限和传统权限(chmod)的优先级关系是怎样的? 注意:在回答中,我们按照要求使用中文,并确保结构清晰。</think>### 使用 `setfacl` 设置目录访问控制列表(ACL) #### 🔍 核心原理 Linux 的 ACL 系统允许为**特定用户/用户组**设置精细权限,突破传统 `chmod` 只能控制三类权限(所有者/组/其他)的限制。通过 `setfacl` 命令可实现: 1. 为单个用户定制权限 2. 权限自动继承(子目录/新文件) 3. 与传统权限共存(ACL 优先级更高) #### 📝 操作步骤 ##### 1. 检查文件系统支持 ACL ```bash # 查看文件系统是否支持 ACL tune2fs -l /dev/sda1 | grep "Default mount options" # 若输出包含 "acl" 即支持(现代 Linux 默认支持) ``` ##### 2. 设置用户专属权限 ```bash # 语法:setfacl -m u:用户名:权限 目录路径 # 示例:允许用户 alice 读写目录 /confidential sudo setfacl -m u:alice:rwx /confidential # 示例:禁止用户 bob 访问(连进入都不允许) sudo setfacl -m u:bob:--- /confidential ``` ##### 3. 设置用户组权限 ```bash # 语法:setfacl -m g:组名:权限 目录路径 # 示例:允许 audit 组成员只读目录 sudo setfacl -m g:audit:r-x /confidential ``` ##### 4. 设置默认权限(新文件自动继承) ```bash # 添加 d: 前缀使权限继承到新文件/子目录 sudo setfacl -m d:u:alice:rwx /confidential sudo setfacl -m d:g:audit:r-x /confidential ``` ##### 5. 查看 ACL 权限 ```bash getfacl /confidential # 输出示例: # user::rwx # user:alice:rwx # 自定义用户权限 # group::r-x # group:audit:r-x # 自定义组权限 # mask::rwx # other::--- # default:user::rwx # 继承权限 # default:user:alice:rwx ``` #### ⚠️ 关键注意事项 1. **目录执行权限(x)**:必须开启才能进入目录(即使设置 `r--` 也需要配合 `x`) 2. **权限掩码(mask)**: ACL 的实际权限 = 用户权限 ∩ mask 值 建议设置:`sudo setfacl -m m::rwx /confidential` 避免权限冲突 3. **权限优先级**: `用户ACL > 组ACL > 传统用户权限 > 传统组权限 > 其他用户权限` #### 🔧 实用命令示例 | 场景 | 命令 | |------|------| | 删除用户ACL | `sudo setfacl -x u:alice /confidential` | | 删除所有ACL | `sudo setfacl -b /confidential` | | 复制ACL权限 | `getfacl dir1 \| setfacl --set-file=- dir2` | | 禁止权限继承 | `sudo setfacl -k /confidential` | #### 🌰 完整案例:财务目录权限控制 ```bash # 创建目录 sudo mkdir /finance # 设置基础权限(禁止其他用户访问) sudo chmod 750 /finance # 允许财务总监 alice 完全访问 sudo setfacl -m u:alice:rwx /finance # 允许审计组只读(带权限继承) sudo setfacl -m g:audit:r-x /finance sudo setfacl -m d:g:audit:r-x /finance # 禁止临时工 bob 访问 sudo setfacl -m u:bob:--- /finance # 验证结果 getfacl /finance ``` > 📌 **最佳实践**: > 1. 结合传统权限和 ACL 使用(如先用 `chmod` 设置基础权限) > 2. 生产环境用 `-R` 递归设置前先测试:`setfacl --test -R ...` > 3. 敏感操作前备份 ACL:`getfacl -R /confidential > acl_backup.txt` > 4. 定期审计权限:`ls -l /confidential` + `getfacl /confidential`[^4] #### 🔐 安全增强建议 ```bash # 限制删除权限(粘滞位) sudo chmod +t /finance # 设置ACL掩码为最大权限 sudo setfacl -m m::rwx /finance # 监控目录访问(审计日志) sudo auditctl -w /finance -p rwxa -k finance_access ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清醒云思

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值