myshell实现Sudo三部曲 : Linux更改用户ID

前言
在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权限

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值