前言
在Linux系统中,特权和访问控制都是基于用户ID和组ID的. 当程序想要访问当前不允许访问的资源时, 它就需要改变用户ID或组ID. 使得新ID具有合适的特权或访问权限.
在设计程序的时候, 我们应该使用最小特权模型, 最小特权模型表示, 我们程序应该只具有完成目的任务的最小特权.
三个用户ID
实际用户ID
实际用户ID就是在用户登录时候, login()程序设置的, 一般不会改变它有效用户ID
进程用来决定我们对资源的访问权限的用户ID, 说白了, 就是当前执行进程的ID设置用户ID
这个用户ID听起来很懵逼, 其实当有了设置用户ID之后, 内核会将有效用户ID变为文件所有者的ID. 我们用一个例子来解释一下吧.普通用户要执行一个
需要root权限
才能操作的进程, 如果没有设置用户ID的话, 他是没有办法执行的, 而root又希望普通用户能执行, 这时候该怎么办呢?
Linux采用了设置用户ID
的方式来实现普通用户执行需要root权限的进程. root给该进程加上设置用户ID之后,无论谁运行该进程运行,它的有效ID都是文件所有者也就是root
如何加上设置用户ID
chmod u+s <filename>
更改用户ID
几个函数了解一下?
int setuid(uid_t uid);
int seteuid(uid_t gid);
uid_t getuid(void);
uid_t geteuid(void);
setuid()
setuid可以设置实际用户ID和有效用户ID. 但是root和普通用户在设置的时候, 是有一些差别的.
root : setuid 会将 实际用户ID 有效用户ID 保存的设置用户ID 都设置为uid
如果在设置用户ID为root的进程中使用, 将普通用户的uid传参给setuid. 执行setuid之后,
整个进程就没有root权限了
, 大家谨慎使用!普通用户: 倘若uid等于实际用户或者保存的设置用户ID, 则setuid只将有效用户ID设置为uid. 它并不改变实际用户ID和保存的设置用户ID
seteuid()
seteuid可以设置有效用户ID, 同样的, root和普通用户是由一定差别
root : 将有效用户ID设置成参数uid
普通用户 : 将有效用户ID设置成为实际用户ID 或者 保存的设置用户ID
getuid 和 geteuid
这两个函数是获取实际用户和有效用户的
最后
shell 的一个简单的逻辑框架, 以此来就加深一下对最小权限的理解
由图可知 shell 在运行的时候, 并不一直是以root身份运行的, 只有命令为sudo 时, 才会临时切成root权限