最小权限原则(最早由 Saltzer 和 Schroeder 提出): 每个程序和系统用户都应该具有完成任务所必需的最小权限集合。 限制代码运行所需的安全权限,有一个非常重要的原因,就是降低你的代码在被恶意用户利用时,造成的损失。如果你的代码仅仅使用最小权限来执行,恶意用户就难以使用它造成损失。如果你需要用户使用管理员权限来执行代码,任何代码中的安全缺陷,都会通过利用该缺陷的恶意用户,潜在造成更大的损失。
编写特权程序时的问题:
Unix 为我们提供了什么机制,来实现最小权限原则?
setuid()
,seteuid()
,setgid()
,和setegid()
。seteuid(uid)
:它为调用进程设置有效 UID。
uid
参数可以是任何东西。这通常由超级用户用来暂时让渡/获取权限。但是,进程的超级用户权限并没有丢失,进程可以拿回来。setuid(uid)
:它设置了当前进程的有效 UID。如果调用者的有效 UID 是 Root,也会设置真实和保存的 UID。
uid
参数。之后,程序就不能够拿回 Root 权限(假设 UID 不是 Root)。这用于永久让渡高权限的访问权。setuid
来拿回权限。你可以使用seteuid
调用来完成它。uid
。这类似于seteuid
。setuid(500); setuid(0);
:答案:500/500(第一个调用生成 500/500,第二个调用失败)。seteuid(500); setuid(0);
:答案:0/500(第一个调用生成 500/500,第二个调用生成 0/500)。seteuid(600); setuid(500);
:答案:500/500(第一个调用生成 600/500,第二个调用生成 500/500)。seteuid(600); setuid(500); setuid(0);
:答案:0/500(第一个调用生成 600/500,第二个调用生成 500/500,第三个调用生成 0/500)。