linux 设置用户id 设置组id

来源:互联网 发布:js给html元素赋值 编辑:程序博客网 时间:2024/06/07 19:45
最近看apue,简单记录对设置用户id理解(设置组id同理)。

    1. 相关的id好像很多,共有哪些?

     文件2个id 2个位:

          拥有者id            拥有者组id

          设置用户id位         设置组id位

     进程6个或更多的id(如果有附加组id):

        实际用户id             实际组id       (仅仅标志我们是谁,不参与文件访问权限检测)

         有效用户id             有效组id        (用于文件访问检测)

         保存的设置用户id       保存的设置组id  (有exec函数保存)

    2. 进程打开、创建、删除文件时的权限测试?

        测试的参与者是进程的有效用户id、有效组id、文件的拥有者id、文件拥有者组id。

      (1)进程的有效用户id是0(超级用户),则允许访问;

      (2)进程的有效用户id等于文件拥有者id,则按照拥有者的权限访问;

      (3)进程有效组id或附加组id之一等于文件拥有者组id,则按照文件拥有者组的权限访问;

      (4)否则,按照文件的其他用户访问权限访问;

       上述的四步是按续依次进行的。

     3. 什么时候用到设置用户id和设置组id?

         当进程通过exec函数执行某个文件的时候,而且文件的设置用户id只会影响到进程的有效用户id

       (其实也足够了,因为只有有效用户id参与权限测试),这样说不够严谨,因为进程的保存设置用

          户id和保存设置组id会被exec函数从有效用户id和有效组id复制过来,所以保存的设置用户id和

          保存的设置组id也会随之改变。

       (1)当文件的设置用户id位和设置组id位没有打开:

               进程的有效用户id和有效组id保持不变,严格按照第2步进行权限测试;

       (2)文件的设置用户id位和设置组id位被打开:

              exec函数才会把进程的有效用户id和有效组id设置为文件拥有者的用户id和组id,这时再进

              行权限测试,进程就拥有了和文件拥有者一样的访问权限。

     4. 进程保存设置用户id和保存设置组id有什么用?

         顾名思义,这两个id存在的价值就是保存,保存谁呢?保存有效用户id和有效组id。当进程的

         实际用户id和有效用户id不同时(组id同理),保存的设置用户id才有意义。因为这样就可以通

         过调用setuid()把有效用户id切换为与进程的实际用户id或保存的设置用户id相同的值,不保存下

         来,我们就弄丢了。

 

     书上例子:

           man程序文件的所有者及他属组通常是为man自身保留的用户和组, man可能需要执行许多其

           他命令,以处理包含显示手册页的文件,为了防止被欺骗或重写错误文件, man在两种权限间

           切换: 运行man命令用户的权限, 拥有man可执行文件用户的权限。下面列出其工作步骤:

    (1)man拥有者是名为man的用户,且设置用户id位已经设置。当我们exec此程序时,用户id情况:

             实际用户ID = 我们的用户ID
            有效用户ID = man      //设置用户id位已设置,有效用户id改变
            保存的设置用户ID = man  // 复制有效用户ID

      (2) 进程访问需要的配置文件和手册页,这些文件由man用户拥有, 因为有效用户ID是man,

           所以可以访问

      (3)man 代表我们运行任一命令前, 调用setuid(getuid()) , 我们不是超级用户, 所以仅仅改变有效

           用户ID,

          用户ID情况变成:
          实际用户ID = 我们的用户ID (未改变)
          有效用户ID = 我们的用户ID
          保存的设置用户ID = man
    //看出来了吧,如果不保存下来,我们就把man用户丢了,再想

         setuid(man)就不会成功, 因为只允许将有效用户id设置为与实际用户id或保存的设置用户id

          相同的值。 这时候,我们做回了自己,就只能访问我们通常可以访问的东西,没有特殊权限了。

           man代表我们安全执行一次过滤。

    (4)执行完过滤后,man再调用setuid(euid)(euid是man的数值用户id,man自己通过 geteuid

         获得并保存的)。因为euid 等于保存的设置用户id,设置成功。(保存的设置用户id的价值所在

         得到:

         实际用户ID = 我们的用户ID (未改变)
         有效用户ID = man
         保存的设置用户ID = man (未改变)

     5) 因为有效用户是man, 所以现在可以对其他文件进行操作了

0 0
原创粉丝点击