引言
在Linux系统中,文件权限控制是保障系统安全的核心机制。我们经常看到类似0440
的权限表示,其中440
代表所有者可读、组可读、其他无权限。但除了基本权限外,还有三种特殊权限:SUID、SGID和Sticky Bit。它们能实现更精细的访问控制,本文将通过实际案例深入解析这些特殊权限。
一、特殊权限的作用与分类
特殊权限用于实现超越常规r/w/x
的控制逻辑,分为三类:
- SUID(Set UID)
- 作用:用户执行文件时,临时获得文件所有者的权限。
- 典型场景:
passwd
命令允许普通用户修改/etc/shadow
(仅root可写)。 - 标志:文件权限位
rwsr-xr-x
(s
表示SUID)。
- SGID(Set GID)
- 作用:
- 对文件:进程继承文件所属组ID。
- 对目录:新建文件自动继承目录的组ID。
- 典型场景:团队协作目录强制文件归属同一组。
- 标志:文件权限位
rwSr--r--
(S
表示未设置执行权限)。
- 作用:
- Sticky Bit(粘着位)
- 作用:限制目录中文件的删除权限,仅创建者可删除。
- 典型场景:系统临时目录
/tmp
。 - 标志:目录权限位
drwxrwxrwt
(t
表示Sticky Bit)。
二、实战案例详解
案例1:SUID实现密码修改(深度解析)
为什么passwd
需要SUID权限?
用户密码存储在/etc/shadow
文件中,其权限为-rw-r-----
,仅允许root
读写。普通用户需通过passwd
命令修改密码,但默认无权限直接操作/etc/shadow
。SUID的作用就是让普通用户临时获得root
权限完成修改。
验证SUID权限
ls -l /usr/bin/passwd
# 输出示例:-rwsr-xr-x 1 root root 59640 Apr 15 2024 /usr/bin/passwd
权限位中的rws
表明SUID生效。
执行流程演示
- 普通用户执行命令:
passwd
- 输入旧密码并验证。
- 输入新密码并验证强度(由
pam_pwquality
模块控制)。 passwd
以root
权限写入/etc/shadow
。- 完成修改后,权限恢复为普通用户。
安全风险与对策
- 风险:若
passwd
存在漏洞,攻击者可能利用SUID权限执行任意代码。 - 对策:定期更新系统补丁,禁止非必要SUID文件。
案例2:SGID实现团队协作
需求:团队目录/team
要求:
- 所有新建文件归属
dev
组。 - 组成员可读写,其他用户只读。
操作步骤:
# 创建目录并设置SGID
mkdir /team
chmod 2775 /team # 2=SGID, 775=rw-rwxr-x
chown :dev /team # 设置组为dev
# 验证新建文件的组归属
touch /team/test.txt
ls -l /team
# 输出示例:-rw-rw-r-- 1 user dev ...
案例3:Sticky Bit保护临时目录
场景:/tmp
目录允许所有用户读写,但只能删除自己的文件。
验证权限:
ls -ld /tmp
# 输出示例:drwxrwxrwt 18 root root 4096 Mar 18 10:00 /tmp
权限位中的rwt
表明Sticky Bit生效。
操作演示:
- 用户A创建文件:
userA@server:~$ touch /tmp/fileA
- 用户B尝试删除文件:
userB@server:~$ rm /tmp/fileA # 报错:Operation not permitted
三、特殊权限的设置方法
1. 数字表示法
在八进制表示法里,能够把特殊权限对应的数字和基本权限对应的数字相加,以此来表示更多的权限组合。
- 特殊权限:
4
:代表SUID。2
:代表SGID。1
:代表Sticky Bit。
- 基本权限:
4
:代表读(r)权限。2
:代表写(w)权限。1
:代表执行(x)权限。- 基本权限的三位八进制数,从左到右依次表示文件所有者、所属组、其他用户的权限。例如,
7
是4 + 2 + 1
,意味着具有读、写、执行权限;6
是4 + 2
,表示具有读、写权限。
组合示例:
同时设置SUID和SGID
假设你有一个可执行文件 test_program
,想要同时给它设置SUID和SGID权限,并且让文件所有者有读、写、执行权限,所属组用户和其他用户有读和执行权限。可以这样操作:
# 计算特殊权限:SUID(4) + SGID(2) = 6
# 基本权限设置为755
chmod 6755 test_program
这里的 6
是 4
(SUID)和 2
(SGID)相加的结果。设置后,文件的权限位会显示为 rwsr-sr-x
,其中所有者和所属组的执行权限位置变成了 s
,表明同时设置了SUID和SGID权限。
设置SUID、SGID和Sticky Bit
若要给一个目录 test_dir
同时设置SUID、SGID和Sticky Bit权限,并且让目录所有者、所属组和其他用户都有读、写、执行权限,可以这样做:
# 计算特殊权限:SUID(4) + SGID(2) + Sticky Bit(1) = 7
# 基本权限设置为777
chmod 7777 test_dir
设置之后,目录的权限位会显示为 drwsrwsrwt
。
2. 符号表示法
# 给文件添加SUID
chmod u+s /path/to/file
# 给目录添加SGID并移除其他用户写权限
chmod g+s,o-w /project/dir
四、安全注意事项
- SUID审计
定期检查系统SUID文件:find / -type f -perm -4000
- SGID的合理应用
仅对共享目录设置SGID,避免文件权限混乱。 - Sticky Bit的必要性
对公共可写目录(如/tmp
)必须设置,防止恶意删除。
五、总结
特殊权限是Linux权限体系的高级功能,正确使用能显著提升系统安全性和管理效率。建议结合以下原则:
- 遵循最小权限原则,仅赋予必要权限。
- 使用符号表示法修改权限,避免八进制数字记忆错误。
- 定期审计特殊权限文件,及时发现潜在风险。