Linux 文件相关操作
文件权限
在 Linux 系统中,普通的文件权限控制通过关联身份三元组 (user
, group
,other
) 和权限三元组 (r
, w
, x
) 来实现访问控制。
系统存在一个 umask
值(针对用户),umask
是一个权限掩码,它决定了新建的文件或者目录的默认权限,使用 umask
命令可以查看当前(用户) 的 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,更细力度的控制还包括 SELinux. 相关扩展权限标志如下:
- 文件/目录 权限最后会包含一个
.
: 表示 SELinux (Security Enhanced Linux)扩展权限。可以使用命令ls -l -Z
查看具体权限。 - 文件/目录 权限最后会包含一个
+
: 表示 文件/目录 有 ACL(Access Control List) 扩展权限,相关操作及命令参考 - 目录 权限最后会包含一个
t
: 表示此 目录 有 Sticky Bit 扩展权限,相关操作及命令参考 - 可执行文件 权限中属主(Owner)的
x
位变为s
: 表示此 可执行文件 配置了 Set UID 扩展权限 - 可执行文件/目录 权限中属组(Group)的
x
位变为s
: 表示此 目录 配置了 Set GID 扩展权限
Linux 文件权限控制中,除了 SELinux 权限,其他权限控制属于 DAC(Discretionary Access Control),SELinux 属于 MAC(Mandatory Access Control),系统执行权限控制的过程中, 如果 DAC 权限允许资源访问,会继续进行 SElinux 权限检查,如果 DAC 权限拒绝资源访问,不会再进行 SELinux 权限检查
Set UID
- 只有 可执行的二进制程序和可执行的代码 才能设定 SUID 权限。
- 命令执行者首先要对该程序拥有
x
(执行)权限。 - 命令执行者在执行该程序时获得该程序文件 属主(Owner) 的身份。
- SetUID 权限只在该程序 执行过程中 有效,也就是说身份改变只在执行过程中有效。
设定 SUID 和 SGID 时,传统的 3 元组权限方式(如 rwxrwxrwx
= 777
) 变为 4 元组(Srwxrwxrwx
),其中的 S
选项包括:
4
代表 SUID,如4777
2
代表 GID,如2777
1
代表 Sticky BIT,如1777
7
代表全部设置, 如7777
SUID 设定命令格式:
chmod 4777 可执行文件名 |
取消 SUID 设置:
chmod 777 可执行文件名 |
假如某个可执行文件的属主为
root
,其设置了 SUID,普通用户运行此可执行文件时会暂时拥有root
的权限,有一定的风险存在,因此要谨慎设置,为系统安全考虑,要定期查找系统上拥有 SUID 权限的可执行文件并核对其是否存在风险。
Set GID
对 可执行文件 来说,SGID 拥有和 SUID 同样的作用,只不过 **命令执行者在执行该程序时获得该程序文件 属组(Group) 的身份。
SGID 设定方法:
chmod 2777 可执行文件名 |
Sticky Bit
粘滞位 (Sticky Bit
) 只能用于目录,并对其中的文件有特殊的权限控制。他的主要作用是确保只有文件的所有者才能够删除或者修改文件。要给某个目录配置 粘滞位 (Sticky Bit
) ,使用以下命令
chmod +t directoryname |
这将为目录 directoryname
配置粘滞位 (Sticky Bit
),以下命令可以验证 粘滞位 (Sticky Bit
)是否存在。如果目录的权限列表中有 t
标志,表示目录设置了 粘滞位 (Sticky Bit
)
ls -l directoryname |
设置粘滞位后,只有文件的所有者才能删除或修改该文件。其他用户即使有写权限(w
),也无法删除其他用户的文件。