Linux 文件权限控制
在 Linux 系统中,普通的文件权限控制通过关联身份三元组 (user
, group
,other
) 和权限三元组 (r
, w
, x
) 来实现访问控制。
系统存在一个 umask
值(针对用户),umask
是一个权限掩码,它决定了新建的文件或者目录的默认权限,使用 mask
命令可以查看当前(用户) 的 umask
值
umask |
比如如上所示的 umask
值,决定了当前(用户)创建的文件和目录的默认权限
目录
- 默认权限为0755
(777-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 |
设置粘滞位后,只有文件的所有者才能删除或修改该文件。其他用户即使有写权限(w
),也无法删除其他用户的文件。
ACL
使用访问控制列表(ACL),可以为单个文件或目录添加更细粒度的权限控制。使用的命令为 setfacl
和 getfacl
。
相比普通权限控制,文件访问控制列表(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 -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 |