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 导致权限泄露。

相关推荐
S***y39632 分钟前
DevOps监控告警体系
运维·devops
氵文大师1 小时前
A机通过 python -m http.server 下载B机的文件
linux·开发语言·python·http
HUT_Tyne2651 小时前
Linux 快速入门
linux·运维·服务器
leoufung2 小时前
逆波兰表达式 LeetCode 题解及相关思路笔记
linux·笔记·leetcode
鸠摩智首席音效师2 小时前
如何在 Linux 中使用 dd 命令 ?
linux·运维·服务器
一夜空中最亮的星一2 小时前
【Linux】ubuntu24.04 安装docker
linux·docker·eureka
赖small强2 小时前
【Linux 网络基础】libwebsockets 技术文档
linux·网络·https·tls·lib·websockets
q***51893 小时前
ubuntu 安装 Redis
linux·redis·ubuntu
JuiceFS3 小时前
JuiceFS sync 原理解析与性能优化,企业级数据同步利器
运维·后端