Linux 文件权限控制

在 Linux 系统中,普通的文件权限控制通过关联身份三元组 (user, group,other) 和权限三元组 (r, w, x) 来实现访问控制。

系统存在一个 umask 值(针对用户),umask 是一个权限掩码,它决定了新建的文件或者目录的默认权限,使用 mask 命令可以查看当前(用户) 的 umask

$ umask
0022

比如如上所示的 umask 值,决定了当前(用户)创建的文件和目录的默认权限

  • 目录 - 默认权限为 0755777-022),即 rwxr-xr-x
  • 文件 - 默认权限为 644 (666-022),即 rw-r--r--

因此要配置当前(用户)创建的文件或者目录的默认权限,只需要配置合适的 umask 值即可。配置 umask 值可以通过以下方法

  • 临时方法
    umask 027
  • 永久方法
    根据需求将 umask 027 配置添加到配置文件中,如 /etc/profile~/.bashrc~/.bash_profile

如果需要更进一步的权限控制,需要使用到 Sticky Bit 和 ACL

Sticky Bit

粘滞位 (Sticky Bit) 只能用于目录,并对其中的文件有特殊的权限控制。他的主要作用是确保只有文件的所有者才能够删除或者修改文件。要给某个目录配置 粘滞位 (Sticky Bit),使用以下命令

chmod +t directoryname

这将为目录 directoryname 配置粘滞位 (Sticky Bit),以下命令可以验证 粘滞位 (Sticky Bit)是否存在。如果目录的权限列表中有 t 标志,表示目录设置了 粘滞位 (Sticky Bit)

$ ls -l directoryname
drwxrwxrwt 2 owner group 4096 Jun 26 10:15 directoryname

设置粘滞位后,只有文件的所有者才能删除或修改该文件。其他用户即使有写权限(w),也无法删除其他用户的文件。

ACL

使用访问控制列表(ACL),可以为单个文件或目录添加更细粒度的权限控制。使用的命令为 setfaclgetfacl

相比普通权限控制,文件访问控制列表(ACL)权限的优先级更高,当存在 ACL 权限时,它将覆盖普通权限。需要注意的是 ACL 权限是基于文件系统的,而不是基于传统的文件权限,因此,如果将具有 ACL 权限的文件移动到另一个文件系统,ACL 权限会丢失

setfacl 命令常用选项

选项 说明 示例
-m, --modify 修改现有的 ACL 权限
-x, --remote 移除现有的 ACL 权限
-b, --remove-all 移除文件的所有 ACL 权限
-R, --recursive 递归的应用 ACL 权限到目录及其子目录及文件
-d, --default 设置默认 ACL 权限,只适用于目录,用于控制在该目录中创建的新文件的 ACL 权限,即权限继承
默认 ACL 只影响新建的文件或目录,对现有的文件或目录不影响
-n, --no-mask 忽略文件系统的默认掩码(umask),直接应用 ACL 规则

ACL 配置示例

以下示例配置单个用户的 ACL

setfacl -m u:username:rwx filename

setfacl -R -m o::r filename

配置多个目标权限

setfacl -m u:user:rwx,g:group:rwx,o::rx directoryname

设置默认 ACL 权限,以下命令将为目录配置指定的默认 ACL 权限,默认的 ACL 权限会被此目录下新建的文件和目录继承,即新创建的目录和文件拥有和默认 ACL 一样的权限设置

setfacl -m d:u:user:rwx,d:g:group:rwx,d:o::rx directoryname

查看默认 ACL

getfacl -d directoryname

修改默认 ACL

setfacl -m d:u:user:rwx,d:g:group:rw-,d:o::--- directoryname