Linux系统中有几种不同类型的用户ID,每种都有其特定的功能和用途:
ID类型 | 主要用途 | 可修改性 | 典型使用场景 |
---|---|---|---|
RUID | 标识原始用户 | 仅root可改 | 审计、记账 |
EUID | 权限检查 | 可修改 | 程序执行时的权限控制 |
SUID | 保存权限 | 通过特定系统调用 | 权限临时切换 |
FSUID | 文件系统权限 | 可独立设置 | NFS等特殊文件系统 |
当普通用户执行一个设置了setuid位的程序时: - RUID保持为执行用户的ID - EUID变为程序文件所有者的ID - SUID保存原始EUID
chmod u+s /path/to/program # 设置setuid位
程序可以暂时放弃特权:
// 放弃特权
euid = geteuid();
seteuid(getuid());
// 恢复特权
seteuid(euid);
系统管理员可以通过合理设置这些ID来实现: - 限制服务账户权限 - 实现最小权限原则 - 安全地执行特权操作
id # 显示当前用户的RUID和所属组
ps -eo pid,ruid,euid,suid,fsuid,cmd # 查看进程的各种ID
#include <unistd.h>
uid_t getuid(void); // 获取RUID
uid_t geteuid(void); // 获取EUID
理解这些用户ID的区别和作用对于Linux系统安全管理和程序开发至关重要,能够帮助管理员和开发者更好地控制系统权限,防止权限提升攻击。