Linux 中的"特殊权限"是对基础权限(r 读、w 写、x 执行)的补充,核心解决 "基础权限无法覆盖的场景"(如普通用户执行特定命令临时提权、目录文件权限继承、公共目录文件保护等)
特殊权限主要分为两类:
- 传统特殊权限 :
SUID、SGID、Sticky Bit(通过chmod配置,体现在权限位中) - 文件系统属性 :
chattr/lsattr配置的底层属性(如不可修改、只能追加)优先级高于基础权限
a. 传统特殊权限(SUID、SGID、Sticky Bit)
传统特殊权限占用基础权限的 执行位(x) ,通过符号(s、t)或数字(4、2、1)表示,优先级高于普通权限
- 先看懂权限位中的特殊权限
用ls -l查看文件时,特殊权限会显示在基础权限的执行位上:
- 所有者执行位(第4位):
s→SUID - 组执行位(第7位):
s→SGID - 其他执行位(第10位):
t→Sticky Bit - 若原执行位无
x,特殊权限会显示为大写S/T(表示"空权限+特殊权限",通常无效)
示例:
bash
-rwsr-xr-x # SUID(所有者x位为s)
drwxr-sr-x # SGID(组x位为s,目录)
drwxrwxrwt # Sticky Bit(其他x位为t,目录)
b. SUID(Set User ID,数字标识 4)
i. 核心作用:
普通用户执行带有 SUID 权限的可执行文件 时,会临时获得该文件 所有者(owner)的权限(执行完毕后权限收回)
ii. 适用场景:
需要普通用户临时提权执行特定命令(如修改密码、挂载设备),但又不想赋予完整 root 权限
iii. 示例(最典型:passwd 命令):
bash
# 查看 passwd 权限(所有者为 root,带有 SUID 权限)
ls -l /usr/bin/passwd
# 输出:-rwsr-xr-x. 1 root root 32656 May 15 2022 /usr/bin/passwd
- 原理:
/etc/passwd文件是系统用户密码文件(-rw-r--r--),普通用户无写权限,但passwd命令带有 SUID,因此普通用户执行passwd时,会临时获得 root 权限,从而修改/etc/passwd
iiii. 配置与取消:
- 符号方式(推荐):
chmod u+s 文件名(添加 SUID)、chmod u-s 文件名(取消) - 数字方式:
chmod 4755 文件名(4=SUID + 755=基础权限)
示例:给 touch 命令添加 SUID(仅测试,实际不推荐):
bash
sudo chmod u+s /usr/bin/touch # 添加 SUID
ls -l /usr/bin/touch # 输出:-rwsr-xr-x
sudo chmod u-s /usr/bin/touch # 取消 SUID
iiiii. 注意:
- 仅对 可执行文件(x权限) 有效,对普通文件/目录无效
- 谨慎使用:若给
bash、rm等危险命令添加 SUID,可能导致普通用户获得 root 权限,引发安全风险
c. SGID(Set Group ID,数字标识 2)
i. 核心作用:
- 对可执行文件 :普通用户执行时,临时获得文件 所属组(group)的权限
- 对目录 :在该目录下新建的文件/目录,会自动继承目录的 所属组(而非创建者的主组),适合团队共享目录。
ii. 适用场景:
- 团队协作:多个用户共享一个目录,确保新建文件能被同组用户访问
- 特定命令提权:如
ping命令(需要 raw 网络权限,所属组为netraw,带有 SGID)。
iii. 示例1:团队共享目录(最常用)
bash
# 1. 创建共享目录,所属组为 dev(假设团队用户都在 dev 组)
sudo mkdir /data/dev_share
sudo chgrp dev /data/dev_share
# 2. 给目录添加 SGID 权限(数字 2 + 基础权限 775)
sudo chmod 2775 /data/dev_share
ls -l /data/ # 输出:drwxrwsr-x 2 root dev 4096 11月 19 10:00 dev_share
# 3. 普通用户(属于 dev 组)在目录下新建文件
su - user1 # 切换到 user1(主组为 user1,附加组为 dev)
touch /data/dev_share/test.txt
ls -l /data/dev_share/test.txt # 输出:-rw-rw-r-- 1 user1 dev 0 11月 19 10:01 test.txt
# 结论:新建文件的所属组为 dev(继承目录的 SGID 组),同组用户可读写
iiii. 示例2:可执行文件的 SGID(ping 命令)
bash
ls -l /usr/bin/ping
# 输出:-rwxr-sr-x 1 root netraw 72776 3月 2 2022 /usr/bin/ping
# 原理:ping 需要 raw 网络权限,普通用户执行时,临时获得 netraw 组的权限
iiiii. 配置与取消:
- 符号方式:
chmod g+s 目标(添加 SGID)、chmod g-s 目标(取消); - 数字方式:
chmod 2775 目录(2=SGID + 775=基础权限);
d. Sticky Bit(粘滞位,数字标识 1)
i. 核心作用:
仅对 目录 有效,限制目录下的文件只能被 文件所有者、目录所有者、root 删除/重命名,其他用户即使有目录的 w 权限(写权限),也无法删除他人文件。
ii. 适用场景:
公共目录(如 /tmp),所有用户可读写,但需防止恶意删除他人文件。
iii. 示例(系统默认:/tmp 目录)
bash
ls -l / # 查看 /tmp 权限
# 输出:drwxrwxrwt 10 root root 4096 11月 19 10:05 tmp
# 解析:rwxrwxrwt → 其他用户有 w 权限,但 t 粘滞位限制只能删除自己的文件
测试:
bash
# user1 在 /tmp 新建文件
su - user1
touch /tmp/user1_file.txt
# user2 尝试删除 user1 的文件(失败)
su - user2
rm /tmp/user1_file.txt
# 输出:rm: 无法删除 '/tmp/user1_file.txt': 不允许的操作
iiii. 配置与取消:
- 符号方式:
chmod o+t 目录(添加粘滞位)、chmod o-t 目录(取消); - 数字方式:
chmod 1777 目录(1=Sticky Bit + 777=基础权限);
e. 文件系统特殊属性(chattr/lsattr)
这类属性是 底层文件系统级别的权限 ,优先级高于基础权限和传统特殊权限,即使是 root 用户,若未取消属性也无法修改/删除文件。仅支持 ext2/3/4、xfs 等主流文件系统。
i. 核心命令:
lsattr 文件名:查看文件的特殊属性chattr [+-=] 属性 文件名:添加(+)、移除(-)、设置(=)特殊属性(需 root 权限)
ii. 常用特殊属性:
| 属性 | 作用 | 适用对象 | 示例 |
|---|---|---|---|
i |
不可修改(禁止删除、修改、重命名、新建) | 文件/目录 | chattr +i /etc/passwd(保护密码文件) |
a |
只能追加(仅允许 echo >>、cat >> 追加内容,禁止删除/修改) |
文件 | chattr +a /var/log/syslog(保护日志不被篡改) |
s |
删除后数据清零(彻底删除,无法通过恢复工具找回) | 文件 | chattr +s secret.txt |
u |
删除后保留数据(可通过 debugfs 恢复,与 s 互斥) |
文件 | chattr +u important.txt |
iii. 示例1:保护 /etc/passwd 不被修改
bash
# 添加 i 属性(不可修改)
sudo chattr +i /etc/passwd
# 尝试修改(失败)
sudo echo "test:x:1001:1001::/home/test:/bin/bash" >> /etc/passwd
# 输出:bash: /etc/passwd: 权限不够
# 查看属性
lsattr /etc/passwd
# 输出:----i---------e------- /etc/passwd(i 表示已添加)
# 取消 i 属性(恢复修改权限)
sudo chattr -i /etc/passwd
iiii. 示例2:日志文件仅允许追加
bash
# 给 syslog 添加 a 属性
sudo chattr +a /var/log/syslog
# 追加内容(允许)
sudo echo "test log" >> /var/log/syslog
# 尝试删除(失败)
sudo rm /var/log/syslog
# 输出:rm: 无法删除 '/var/log/syslog': 不允许的操作
f. 特殊权限总结与安全建议
| 权限类型 | 核心作用 | 适用对象 | 安全注意 |
|---|---|---|---|
| SUID(4) | 执行文件时临时获得所有者权限 | 可执行文件 | 禁止给 bash、rm、cp 等危险命令添加 |
| SGID(2) | 目录新建文件继承组;执行文件临时获组权限 | 目录/可执行文件 | 共享目录建议设置 2775(同组读写,其他只读) |
| Sticky(1) | 公共目录仅所有者可删除文件 | 目录 | /tmp 默认 1777,自定义公共目录建议设置 |
chattr i |
禁止任何修改/删除 | 重要文件(如配置文件) | 忘记取消会导致无法维护,谨慎使用 |
chattr a |
仅允许追加 | 日志、审计文件 | 适合需要长期记录且不允许篡改的场景 |
- 权限数字组合示例:
4755:SUID + rwxr-xr-x(普通用户执行时获所有者权限);2775:SGID + rwxrwxr-x(共享目录,新建文件继承组);1777:Sticky + rwxrwxrwx(公共目录,仅所有者可删文件);6755:SUID + SGID + rwxr-xr-x(同时临时获所有者和组权限)。
g. 常见问题
-
添加 SUID 后权限位显示
S(大写) :
原因 :文件原本没有所有者的x权限(-rw-r--r--),添加 SUID 后变成-rwSr--r--(大写 S),此时 SUID 无效。
解决 :先给文件添加所有者x权限(chmod u+x 文件名),再添加 SUID(chmod u+s)。 -
root 无法删除文件 :
原因 :文件/目录被添加了chattr +i属性。
解决 :chattr -i 文件名取消属性后再删除。 -
共享目录新建文件同组用户无法读写 :
原因 :仅设置了 SGID,但文件默认权限受umask影响(如umask 022导致新建文件rw-r--r--)。解决:修改用户
umask为002(echo "umask 002" >> ~/.bashrc),或目录设置2777(需配合 Sticky Bit)。
掌握特殊权限能解决基础权限无法覆盖的场景(如临时提权、共享目录、文件保护),但需注意安全风险,避免滥用 SUID/SGID 导致权限泄露。