25、Linux 特殊权限

Linux 中的"特殊权限"是对基础权限(r 读、w 写、x 执行)的补充,核心解决 "基础权限无法覆盖的场景"(如普通用户执行特定命令临时提权、目录文件权限继承、公共目录文件保护等)

特殊权限主要分为两类:

  1. 传统特殊权限SUIDSGIDSticky Bit(通过 chmod 配置,体现在权限位中)
  2. 文件系统属性chattr/lsattr 配置的底层属性(如不可修改、只能追加)优先级高于基础权限

a. 传统特殊权限(SUID、SGID、Sticky Bit)

传统特殊权限占用基础权限的 执行位(x) ,通过符号(st)或数字(421)表示,优先级高于普通权限

  1. 先看懂权限位中的特殊权限
    ls -l 查看文件时,特殊权限会显示在基础权限的执行位上:
  • 所有者执行位(第4位):sSUID
  • 组执行位(第7位):sSGID
  • 其他执行位(第10位):tSticky 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权限) 有效,对普通文件/目录无效
  • 谨慎使用:若给 bashrm 等危险命令添加 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) 执行文件时临时获得所有者权限 可执行文件 禁止给 bashrmcp 等危险命令添加
SGID(2) 目录新建文件继承组;执行文件临时获组权限 目录/可执行文件 共享目录建议设置 2775(同组读写,其他只读)
Sticky(1) 公共目录仅所有者可删除文件 目录 /tmp 默认 1777,自定义公共目录建议设置
chattr i 禁止任何修改/删除 重要文件(如配置文件) 忘记取消会导致无法维护,谨慎使用
chattr a 仅允许追加 日志、审计文件 适合需要长期记录且不允许篡改的场景
  1. 权限数字组合示例
  • 4755:SUID + rwxr-xr-x(普通用户执行时获所有者权限);
  • 2775:SGID + rwxrwxr-x(共享目录,新建文件继承组);
  • 1777:Sticky + rwxrwxrwx(公共目录,仅所有者可删文件);
  • 6755:SUID + SGID + rwxr-xr-x(同时临时获所有者和组权限)。

g. 常见问题

  1. 添加 SUID 后权限位显示 S(大写)
    原因 :文件原本没有所有者的 x 权限(-rw-r--r--),添加 SUID 后变成 -rwSr--r--(大写 S),此时 SUID 无效。
    解决 :先给文件添加所有者 x 权限(chmod u+x 文件名),再添加 SUID(chmod u+s)。

  2. root 无法删除文件
    原因 :文件/目录被添加了 chattr +i 属性。
    解决chattr -i 文件名 取消属性后再删除。

  3. 共享目录新建文件同组用户无法读写
    原因 :仅设置了 SGID,但文件默认权限受 umask 影响(如 umask 022 导致新建文件 rw-r--r--)。

    解决:修改用户 umask002echo "umask 002" >> ~/.bashrc),或目录设置 2777(需配合 Sticky Bit)。

掌握特殊权限能解决基础权限无法覆盖的场景(如临时提权、共享目录、文件保护),但需注意安全风险,避免滥用 SUID/SGID 导致权限泄露。

相关推荐
宴之敖者、20 分钟前
Linux——\r,\n和缓冲区
linux·运维·服务器
LuDvei22 分钟前
LINUX错误提示函数
linux·运维·服务器
未来可期LJ28 分钟前
【Linux 系统】进程间的通信方式
linux·服务器
Abona30 分钟前
C语言嵌入式全栈Demo
linux·c语言·面试
心理之旅40 分钟前
高校文献检索系统
运维·服务器·容器
Lenyiin43 分钟前
Linux 基础IO
java·linux·服务器
The Chosen One9851 小时前
【Linux】深入理解Linux进程(一):PCB结构、Fork创建与状态切换详解
linux·运维·服务器
大佐不会说日语~1 小时前
使用Docker Compose 部署时网络冲突问题排查与解决
运维·网络·spring boot·docker·容器
Kira Skyler1 小时前
eBPF debugfs中的追踪点format实现原理
linux
2501_927773072 小时前
uboot挂载
linux·运维·服务器