从`/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标志在属主的执行位这就是SUIDSet User ID权限。它的工作原理是当任何用户执行带有SUID权限的文件时进程会临时获得文件属主这里是root的权限执行完成后恢复原用户权限SUID权限设置方法chmod us filename # 添加SUID权限 chmod u-s filename # 移除SUID权限1.2 实际案例验证让我们做个实验验证SUID的作用首先备份passwd命令sudo cp /usr/bin/passwd /usr/bin/passwd.bak移除SUID权限sudo chmod u-s /usr/bin/passwd尝试以普通用户修改密码passwd此时会提示Authentication token manipulation error因为普通用户失去了临时root权限。恢复SUID权限sudo chmod us /usr/bin/passwd注意SUID只对二进制可执行文件有效对shell脚本设置SUID是无效的这是Linux系统的安全机制。2. SGID目录继承的组权限如果说SUID改变了执行者的用户身份那么SGIDSet Group ID则改变了执行者的组身份。SGID对文件和目录有不同的作用对象类型SGID作用文件执行时进程获得文件所属组的权限目录在该目录下创建的新文件继承目录的所属组2.1 目录SGID的实际应用让我们通过一个团队协作的场景来理解目录的SGID权限创建两个测试目录mkdir project1 project2设置project2的SGID权限chmod gs project2查看权限差异ls -ld project1 project2输出中project2的组权限位会有s标志drwxr-sr-x 2 user group 4096 Aug 1 10:00 project2在不同目录下创建文件测试touch project1/file1 project2/file2 ls -l project1/file1 project2/file2你会发现file2自动继承了project2的组而file1保持创建者的主组。SGID权限设置方法chmod gs 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其他用户也无法删除这种特性就是由SBITSticky 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的作用让我们通过实验验证创建一个测试目录并设置SBITmkdir testdir chmod t testdir用户A创建文件su - userA -c touch testdir/fileA用户B尝试删除su - userB -c rm testdir/fileA会收到Operation not permitted错误。移除SBIT后再次尝试chmod -t testdir su - userB -c rm testdir/fileA这次删除操作会成功。4. 特殊权限的数字表示法除了字母表示法us, gs, t特殊权限也可以用数字表示权限数字值SUID4SGID2SBIT1这些值可以组合使用放在普通权限的三位数字之前。例如chmod 4755 file # 设置SUID权限为-rwsr-xr-x chmod 2755 dir # 设置SGID权限为drwxr-sr-x chmod 1777 dir # 设置SBIT权限为drwxrwxrwt常见组合权限对比表权限设置数字表示字母表示典型应用场景SUID4755us/usr/bin/passwdSGID2775gs共享目录SBIT1777t/tmp目录SUIDSGID6755us,gs极少使用5. 安全注意事项虽然特殊权限很强大但使用不当会带来安全隐患SUID风险尽量减少SUID程序数量绝对不要给编辑器或解释器设置SUID定期检查系统中的SUID文件find / -perm -4000 -type f -ls 2/dev/nullSGID风险确保SGID目录的属组是受控的避免敏感目录设置SGIDSBIT最佳实践对需要多用户共享写入的目录设置SBIT配合适当的umask值使用安全提示使用特殊权限时遵循最小权限原则只给必要的文件/目录设置必要的权限。6. 实际应用场景让我们看几个特殊权限的实际应用案例6.1 团队项目目录配置假设有一个开发团队需要共享项目文件创建共享目录mkdir /opt/team_project设置适当的权限chown root:dev_team /opt/team_project chmod 2775 /opt/team_project设置默认umask如002确保新创建的文件组可写这样所有开发人员都能在目录中创建和修改文件且新文件会自动继承dev_team组。6.2 系统日志收集假设需要让多个用户向一个日志目录写入数据但防止互相删除创建日志目录mkdir /var/log/custom_app设置权限chmod 1777 /var/log/custom_app这样任何用户都可以写入日志但只能删除自己的日志文件。7. 排查特殊权限问题当遇到权限相关问题时可以按照以下步骤排查检查文件/目录的特殊权限标志ls -ld /path/to/item确认当前用户身份和组id检查进程实际运行的UID/GIDps aux | grep process_name对于SUID问题检查二进制文件是否真的设置了SUIDfind /path/to/binary -perm -4000对于SGID问题检查父目录的SGID设置find /parent/dir -type d -perm -20008. 高级技巧与注意事项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, p2-4属主权限r, w, x, s, S5-7组权限r, w, x, s, S8-10其他用户权限r, w, x, t, T其中s在属主执行位表示SUIDs在组执行位表示SGIDt在其他用户执行位表示SBIT大写S或T表示设置了特殊权限但没有执行权限10. 性能考量虽然特殊权限非常有用但需要考虑以下性能因素SUID程序每次执行都需要切换用户上下文对性能敏感的应用避免过度使用考虑使用能力capabilities替代SGID目录文件创建时需要额外处理组继承在大规模文件操作中可能有微小开销SBIT目录删除文件时需要额外权限检查影响可以忽略不计在实际使用中这些性能影响通常可以忽略除非在极端高性能要求的场景。