news 2026/4/19 17:40:26

从`/tmp`目录和`passwd`命令说起:图解Linux特殊权限SUID、SGID、SBIT的工作原理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从`/tmp`目录和`passwd`命令说起:图解Linux特殊权限SUID、SGID、SBIT的工作原理

/tmp目录和passwd命令说起:图解Linux特殊权限SUID、SGID、SBIT的工作原理

你是否遇到过这样的场景:普通用户明明没有/etc/shadow文件的写权限,却能通过passwd命令修改自己的密码?或者好奇为什么/tmp目录下每个用户只能删除自己的文件?这些看似神奇的现象背后,都隐藏着Linux系统中三个特殊的权限机制——SUID、SGID和SBIT。今天我们就通过这两个经典案例,带你深入理解这些特殊权限的工作原理。

1. SUID:为什么普通用户能修改密码?

让我们从一个日常操作开始:修改密码。当你输入passwd命令时,系统会要求你输入新密码,然后更新/etc/shadow文件。但如果你查看这个文件的权限:

ls -l /etc/shadow

你会发现它的权限是---------- 1 root shadow,意味着只有root用户才能修改它。那么问题来了:普通用户是如何绕过这个限制的?

1.1 SUID权限的魔法

关键在于/usr/bin/passwd这个命令文件本身的权限设置。执行以下命令查看:

ls -l /usr/bin/passwd

你会看到类似这样的输出:

-rwsr-xr-x 1 root root 68208 May 28 2023 /usr/bin/passwd

注意权限位中的s标志(在属主的执行位),这就是SUID(Set User ID)权限。它的工作原理是:

  1. 当任何用户执行带有SUID权限的文件时
  2. 进程会临时获得文件属主(这里是root)的权限
  3. 执行完成后恢复原用户权限

SUID权限设置方法

chmod u+s filename # 添加SUID权限 chmod u-s filename # 移除SUID权限

1.2 实际案例验证

让我们做个实验验证SUID的作用:

  1. 首先备份passwd命令:

    sudo cp /usr/bin/passwd /usr/bin/passwd.bak
  2. 移除SUID权限:

    sudo chmod u-s /usr/bin/passwd
  3. 尝试以普通用户修改密码:

    passwd

    此时会提示"Authentication token manipulation error",因为普通用户失去了临时root权限。

  4. 恢复SUID权限:

    sudo chmod u+s /usr/bin/passwd

注意:SUID只对二进制可执行文件有效,对shell脚本设置SUID是无效的,这是Linux系统的安全机制。

2. SGID:目录继承的组权限

如果说SUID改变了执行者的用户身份,那么SGID(Set Group ID)则改变了执行者的组身份。SGID对文件和目录有不同的作用:

对象类型SGID作用
文件执行时进程获得文件所属组的权限
目录在该目录下创建的新文件继承目录的所属组

2.1 目录SGID的实际应用

让我们通过一个团队协作的场景来理解目录的SGID权限:

  1. 创建两个测试目录:

    mkdir project1 project2
  2. 设置project2的SGID权限:

    chmod g+s project2
  3. 查看权限差异:

    ls -ld project1 project2

    输出中project2的组权限位会有s标志:

    drwxr-sr-x 2 user group 4096 Aug 1 10:00 project2
  4. 在不同目录下创建文件测试:

    touch project1/file1 project2/file2 ls -l project1/file1 project2/file2

    你会发现file2自动继承了project2的组,而file1保持创建者的主组。

SGID权限设置方法

chmod g+s directory # 添加SGID权限 chmod g-s directory # 移除SGID权限

2.2 文件SGID的典型案例

虽然文件SGID使用较少,但某些特殊场景下很有用。比如wall命令(向所有终端广播消息):

ls -l /usr/bin/wall

输出类似:

-rwxr-sr-x 1 root tty 23800 Apr 9 2023 /usr/bin/wall

当普通用户执行wall时,进程会获得tty组的权限,从而能向所有终端设备写入消息。

3. SBIT:/tmp目录的安全机制

Linux系统中有一个特殊的目录——/tmp,它有以下特点:

  • 所有用户都可以在其中创建文件
  • 用户只能删除自己创建的文件
  • 即使文件权限是777,其他用户也无法删除

这种特性就是由SBIT(Sticky Bit)权限实现的。

3.1 SBIT权限详解

查看/tmp目录的权限:

ls -ld /tmp

典型输出:

drwxrwxrwt 14 root root 4096 Aug 1 10:00 /tmp

注意最后的t标志,这就是SBIT权限。它的核心规则是:

  • 在设置了SBIT的目录中
  • 只有文件/目录的属主、目录的属主或root才能删除/重命名该文件

SBIT权限设置方法

chmod +t directory # 添加SBIT权限 chmod -t directory # 移除SBIT权限

3.2 实际测试SBIT的作用

让我们通过实验验证:

  1. 创建一个测试目录并设置SBIT:

    mkdir testdir chmod +t testdir
  2. 用户A创建文件:

    su - userA -c "touch testdir/fileA"
  3. 用户B尝试删除:

    su - userB -c "rm testdir/fileA"

    会收到"Operation not permitted"错误。

  4. 移除SBIT后再次尝试:

    chmod -t testdir su - userB -c "rm testdir/fileA"

    这次删除操作会成功。

4. 特殊权限的数字表示法

除了字母表示法(u+s, g+s, +t),特殊权限也可以用数字表示:

权限数字值
SUID4
SGID2
SBIT1

这些值可以组合使用,放在普通权限的三位数字之前。例如:

chmod 4755 file # 设置SUID,权限为-rwsr-xr-x chmod 2755 dir # 设置SGID,权限为drwxr-sr-x chmod 1777 dir # 设置SBIT,权限为drwxrwxrwt

常见组合权限对比表

权限设置数字表示字母表示典型应用场景
SUID4755u+s/usr/bin/passwd
SGID2775g+s共享目录
SBIT1777+t/tmp目录
SUID+SGID6755u+s,g+s极少使用

5. 安全注意事项

虽然特殊权限很强大,但使用不当会带来安全隐患:

  1. SUID风险

    • 尽量减少SUID程序数量
    • 绝对不要给编辑器或解释器设置SUID
    • 定期检查系统中的SUID文件:
      find / -perm -4000 -type f -ls 2>/dev/null
  2. SGID风险

    • 确保SGID目录的属组是受控的
    • 避免敏感目录设置SGID
  3. SBIT最佳实践

    • 对需要多用户共享写入的目录设置SBIT
    • 配合适当的umask值使用

安全提示:使用特殊权限时,遵循最小权限原则,只给必要的文件/目录设置必要的权限。

6. 实际应用场景

让我们看几个特殊权限的实际应用案例:

6.1 团队项目目录配置

假设有一个开发团队需要共享项目文件:

  1. 创建共享目录:

    mkdir /opt/team_project
  2. 设置适当的权限:

    chown root:dev_team /opt/team_project chmod 2775 /opt/team_project
  3. 设置默认umask(如002),确保新创建的文件组可写

这样所有开发人员都能在目录中创建和修改文件,且新文件会自动继承dev_team组。

6.2 系统日志收集

假设需要让多个用户向一个日志目录写入数据,但防止互相删除:

  1. 创建日志目录:

    mkdir /var/log/custom_app
  2. 设置权限:

    chmod 1777 /var/log/custom_app

这样任何用户都可以写入日志,但只能删除自己的日志文件。

7. 排查特殊权限问题

当遇到权限相关问题时,可以按照以下步骤排查:

  1. 检查文件/目录的特殊权限标志:

    ls -ld /path/to/item
  2. 确认当前用户身份和组:

    id
  3. 检查进程实际运行的UID/GID:

    ps aux | grep process_name
  4. 对于SUID问题,检查二进制文件是否真的设置了SUID:

    find /path/to/binary -perm -4000
  5. 对于SGID问题,检查父目录的SGID设置:

    find /parent/dir -type d -perm -2000

8. 高级技巧与注意事项

8.1 特殊权限与文件系统

某些文件系统(如FAT、NTFS)不支持Linux特殊权限标志。当在这些文件系统上挂载目录时:

  • 特殊权限可能会被忽略
  • 可能导致意外行为
  • 解决方案:使用Linux原生文件系统(ext4、xfs等)存储需要特殊权限的数据

8.2 特殊权限与备份恢复

当备份和恢复文件时,特殊权限可能会丢失,特别是:

  • 使用不保留权限的备份工具(如简单的tar)
  • 跨不同系统恢复时
  • 解决方案:使用--preserve-permissions选项或专门的备份工具

8.3 特殊权限与容器环境

在Docker等容器环境中:

  • 默认情况下容器内进程以root运行,SUID/SGID意义不同
  • 最佳实践是避免在容器中使用特殊权限
  • 如果必须使用,需要显式配置

9. 可视化权限表示法

为了更直观地理解权限表示法,这里提供一个参考表:

字符位置含义可能的值
1文件类型-, d, l, c, b, s, p
2-4属主权限r, w, x, s, S
5-7组权限r, w, x, s, S
8-10其他用户权限r, w, x, t, T

其中:

  • s在属主执行位表示SUID
  • s在组执行位表示SGID
  • t在其他用户执行位表示SBIT
  • 大写ST表示设置了特殊权限但没有执行权限

10. 性能考量

虽然特殊权限非常有用,但需要考虑以下性能因素:

  1. SUID程序

    • 每次执行都需要切换用户上下文
    • 对性能敏感的应用避免过度使用
    • 考虑使用能力(capabilities)替代
  2. SGID目录

    • 文件创建时需要额外处理组继承
    • 在大规模文件操作中可能有微小开销
  3. SBIT目录

    • 删除文件时需要额外权限检查
    • 影响可以忽略不计

在实际使用中,这些性能影响通常可以忽略,除非在极端高性能要求的场景。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/19 17:39:18

LeetCode(合并两个有序链表)

题目链接: https://leetcode.cn/problems/merge-two-sorted-lists/ 题目描述: 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 [1,2,4], l2 [1,3,4] 输…

作者头像 李华
网站建设 2026/4/19 17:38:00

告别OLE和COM!在VS2015上用xlnt库读写Excel,这份避坑指南请收好

告别OLE和COM!在VS2015上用xlnt库读写Excel的终极避坑指南 如果你是一名C开发者,正在VS2015环境下寻找一个简单可靠的Excel读写方案,那么这篇文章就是为你量身定制的。我们将深入探讨如何利用xlnt这个轻量级开源库,避开传统方案的…

作者头像 李华
网站建设 2026/4/19 17:37:51

baidupankey技术架构深度解析:百度网盘提取码智能获取机制

baidupankey技术架构深度解析:百度网盘提取码智能获取机制 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 在数字化资源分享日益频繁的技术生态中,资源获取效率成为开发者与用户共同关注的焦点。baidup…

作者头像 李华
网站建设 2026/4/19 17:36:41

mysql如何处理连接数过多导致响应慢_mysql连接数调优

应调小wait_timeout和interactive_timeout(如设为60),及时释放空闲Sleep连接;优先优化应用层连接复用与正确关闭,而非盲目增大max_connections。MySQL 连接数爆满时,show processlist 看到大量 Sleep 状态连…

作者头像 李华