帮你快速理解、总结文档立即下载

文件权限与 ACL

最近更新时间:2026-08-27 18:07:01
我的收藏
本文介绍 TencentOS Server 中的文件权限管理,包括 SUID/SGID/Sticky BIT 特殊权限、umask 设置,以及 ACL(访问控制列表)的配置方法。

合理配置文件权限

在 Linux 中可以将普通文件和目录都统一当作文件来处理,而文件的安全性主要通过权限和属主来控制。文件系统中,一般通过常见的 rwx 权限控制文件的访问。但在部分场景下,单一的 rwx 权限可能不够灵活,还会用到特殊权限 s。例如,/etc/shadow 文件存储了系统中所有用户的加密密码,因此不能直接授予所有用户对该文件的访问。但是普通用户确实会有变更密码的需求,此时便可引入 SUID 权限,以允许用户更改自己的密码。

SUID 权限

SUID 权限查看
当普通用户修改密码时,并不会直接授予其操作 /etc/shadow 文件的权限,而是通过 /usr/bin/passwd 进行操作,因此需要先赋予 SetUID(简称 SUID)权限。ls 查看可知:
ls -l /usr/bin/passwd
输出示例:
-rwsr-xr-x. 1 root root 31984 Mar 31 23:51 /usr/bin/passwd
可以看到 owner 权限为 rws,而不是 rwx。当 s 出现在 x 的位置上时,即可称之为 SetUID Bits 或 SUID。其特点如下:
SUID 权限仅作用于可执行二进制文件。
当执行者对该二进制文件有执行权限,则执行者会短暂获得该文件的 owner 权限。
所以对于本次密码修改过程,当普通用户执行 /usr/bin/passwd 时,会短暂获得 root 权限进而执行该指令,完成密码的修改访问。
SUID 权限设置
SUID 权限可以通过符号方式设置,也可以通过数字方式设置。SUID 权限对应数字 4:
chmod u+s filename # 符号方式,+ 表增加该权限
chmod 4755 filename # 数字方式,对应数字 4
SUID 权限取消
SUID 权限可以通过符号和数字两种方式取消:
chmod u-s filename # 符号方式,- 表取消该权限
chmod 755 filename # 数字方式

SGID 权限

SGID 权限查看
SGID 适用于目录,用户组也有一个等效的属性:SGID。其特点如下:
SGID 权限作用于目录。
用户在此目录下所创建的新文件,其用户组与该目录的用户组相同。
您可以通过 ls -ld 命令查看目录的 SGID 权限。以下示例中,目录 /shared/project 已通过 chmod 2755 设置了 SGID 权限:
ls -ld /shared/project
输出示例:
drwxr-sr-x. 2 root root 4096 May 6 15:03 /shared/project
输出中用户组权限位为 r-ss 出现在用户组执行权限 x 的位置上,表明该目录已被设置 SGID 权限。
SGID 权限设置
SGID 权限可以通过符号和数字方式设置。SGID 权限对应数字 2:
chmod g+s dirname # 符号方式,+ 表增加该权限
chmod 2755 dirname # 数字方式,对应数字 2
SGID 权限取消
chmod g-s dirname # 符号方式,- 表取消该权限
chmod 755 dirname # 数字方式

Sticky BIT 权限

SBIT 权限查看
Sticky BIT(全称为 the restricted deletion flag or sticky bit,简称 SBIT),可意为黏滞位、防删除位。
SBIT 目前只对目录有效,用来阻止非文件 owner 删除文件,比较常见的例子为 /tmp 目录:
ls -ld /tmp/
输出示例:
drwxrwxrwt. 7 root root 140 May 6 15:03 /tmp/
可以看到权限信息中最后一位被设置为 t,表明该目录被设置了 SBIT 权限。此时,当用户在该目录下创建新文件或目录时,仅有自己和 root 才有权限删除,防止他人的删除操作。
SBIT 权限设置
SBIT 也可以通过符号和数字方式设置,对应数字 1:
chmod o+t dirname # 符号方式,+ 表增加该权限
chmod 1755 dirname # 数字方式,对应数字 1
SBIT 权限取消
chmod o-t dirname # 符号方式,- 表取消该权限
chmod 755 dirname # 数字方式

umask 值设置

user file-creation mode mask(umask)值用于为新创建的文件和目录设置默认权限。如果没有设定 umask 值,则生成的文件对任意系统用户而言都有可写权限,存在一定的风险。
您可以通过执行 umask 查看当前系统的默认 umask 值:
umask
输出示例:
0022
说明
root 用户默认 umask 值为 0022,普通用户默认 umask 值为 0002。新生成目录/文件的默认权限为 777/666 减去 umask 值。
当然您也可以根据安全需要,自行指定更严格的 umask 值:
临时更改:
umask 0037 # 临时生效
永久更改:
要在系统中持久更改 umask 值,可以编辑 /etc/bashrc,修改其中已有的 umask 行,或在文件末尾添加 umask 设置(对所有用户生效)。以将 umask 值修改为 0037 为例,在 /etc/bashrc 末尾添加:
umask 0037
如果只需要为单个用户持久更改 umask 值,也可以在该用户的 ~/.bashrc 文件末尾添加同样的设置。修改完成后,重新登录或执行以下命令使配置立即生效:
source /etc/bashrc
说明/etc/profile 修改只在用户第一次登录时被执行,而 /etc/bashrc 修改则在用户每次登录加载 shell 时执行。

配置 ACL

在 Linux 系统中,访问控制列表(Access Control Lists,ACL)是一个重要的安全机制。传统文件权限对每个文件和目录,通过划分 owner/group/others 并赋予不同的 rwx 权限。ACL 在此基础上,为每个文件和目录添加了一组更细粒度的访问控制规则,允许您为不同的用户和组设置不同的访问权限。

安装 ACL

ACL 目前已内置支持,因此在大多数情况下无需手动安装。若出现特殊情况未预安装,则可自行安装 ACL:
sudo dnf install acl

查看 ACL

要查看文件或目录的 ACL,可以使用 getfacl 命令。例如,要查看 file1 的 ACL 设置:
getfacl file1
该命令将显示对应文件的访问控制列表,包括默认权限、属主和所属组的访问权限,以及任何特定用户或组的访问权限。例如:
# file: file1
# owner: root
# group: root
user::rw-
group::r--
other::r--

设置 ACL

要设置文件或目录的 ACL,可以使用 setfacl 命令。例如,要给用户 opencloudos 添加对 file1 的读写和执行权限:
sudo setfacl -m u:opencloudos:rwx file1
然后再次查看 file1 的 ACL:
getfacl file1
输出示例:
# file: file1
# owner: root
# group: root
user::rw-
user:opencloudos:rwx
group::r--
mask::rwx
other::r--
可以看到 user:opencloudos:rwx 行已添加,表示用户 opencloudos 拥有对 file1 的读写和执行权限。同时,ACL 会自动生成一个 mask 条目,表示 ACL 中所有用户和组的最大有效权限。

设置组 ACL

可以为用户组设置 ACL,例如给 devteam 组添加读写权限:
sudo setfacl -m g:devteam:rw file1

删除 ACL 条目

删除特定用户或组的 ACL 条目:
sudo setfacl -x u:opencloudos file1
删除所有 ACL 扩展条目,恢复到基本权限:
sudo setfacl -b file1

设置默认 ACL

可以为目录设置默认 ACL,使得在该目录下新建的文件和子目录自动继承 ACL 规则:
sudo setfacl -d -m u:opencloudos:rx /shared/project
这样,在 /shared/project 目录下新建的文件,用户 opencloudos 将自动获得读取和执行权限。

递归设置 ACL

对目录及其子目录和文件递归设置 ACL:
sudo setfacl -R -m u:opencloudos:rwx /shared/project
警告
递归设置 ACL 时请谨慎,确保不会过度授予权限。