zoukankan      html  css  js  c++  java
  • 《APUE》之权限篇

    新年假期因肺炎疫情延迟十多天,利用这段时间重温了一下《UNIX环境高级编程》。第一次读是在2013年刚毕业,有些内容也不知道如何用于实践,硬着头皮啃完。现在工作六年有余,再读还有些新收获,顺便做一下笔记。

    从章节看,学习操作系统,2/7左右内容在文件系统,5/7左右是进程和线程。其它有些共性的内容,比如最重要的权限机制。所以把笔记分成三部分,第一部分的是Linux系统权限相关,第二部分是文件系统,第三部分是进程。

    权限由文件权限标志和进程的身份(ID)共同构成,权限机制用于限制操作系统中,进程对文件进行的读、写等各类操作。

    Linux中,与一个进程关联的ID有7个,分别是:

    实际用户ID 我们实际上是谁
    实际组ID
    有效用户ID 用于文件访问权限检查
    有效组ID
    附加组ID
    保存的设置用户ID 由exec函数保存,它是一个有效ID的副本
    保存的设置组ID

    每个文件有9个访问权限位,另外还包含粘住位( sticky bit )、设置用户ID位(set-user-ID)和设置组ID位(set-group-ID)等特殊位。

    权限位 意义
    S_IRUSR
    S_IWUSR
    S_IXUSR
    用户-读
    用户-写
    用户-执行
    S_IRGRP
    S_IWGRP
    S_IXGRP
    组-读
    组-写
    组-执行
    S_IROTH
    S_IWOTH
    S_IXOTH
    其他-读
    其他-写
    其他-执行
    S_ISVTX 粘住位

    Linux内核进行文件权限检查的过程:

    (1)若进程的有效用户ID是0(超级用户),则允许访问。这给予了超级用户对整个文件系统进行处理的最充分的自由。

    (2)若进程的有效用户ID等于文件的所有者ID(也就是该进程拥有此文件),那么:若所有者适当的访问权限位被设置,则允许访问,否则拒绝访问。适当的访问权限位指的是,若进程为读而打开该文件,则用户读位应为1;若进程为写而打开该文件,则用户写位应为1;若进行将执行该文件,则用户执行位应为1。

    (3)若进程的有效组ID或进程的附加组ID之一等于文件的组ID,那么:若组适当的访问权限位被设置,则允许访问,否则拒绝访问。

    (4)若其他用户适当的访问权限位被设置,则允许访问,否则拒绝访问。

    特殊权限位之设置用户ID位(set-user-ID bit)和设置组ID位(set-group-ID bit)

    我们知道,用户使用Linux的passwd命令,可以修改当前帐号的密码,密码修改时会更新/etc/shadow文件,而查看shadow文件权限:

    -rw-r—– 1 root shadow 852 Feb 6 09:32 shadow

    只有root用户才有写的权限,如何实现普通用户更新shadow呢?

    查看/usr/bin/passwd程序:

    -rwsr-xr-x 1 root root 54256 Mar 29 2016 /usr/bin/passwd*

    上述我们看到passwd程序设置了一个特殊的s位,即上面写的设置用户ID位(set-user-ID)

    当执行一个程序文件时,进程的有效用户ID通常就是实际用户ID,有效组ID通常就是实际组ID。但是可以在文件模式字(st_mode)中设置一个特殊标志,其含义是“当执行此文件时,将进程的有效用户ID设置为文件所有者的用户ID(st_uid)”。与此相类似,在文件模式字中可以设置另一们,它使得将执行此文件的进程的有效组ID为设置为文件的组所有者ID(st_gid)。在文件模式中的这两个位被称为设置用户ID(set-user-ID))位和设置组ID(set-group-ID)位。

    passwd程序由于s位的存在,执行此程序的进程,将拥有文件所有者的权限,即root权限 。

    当普通用户执行passwd命令时,shell会fork出一个子进程,此时进程有效用户ID还是普通用户ID,然后调用exec执行/usr/bin/passwd,exec发现/usr/bin/passwd有设置用户ID位,于是会把进程的有效用户ID设置成文件所有者ID即root,此时这个进程提权为root,拥有了读写/etc/shadow文件的权限,从而使普通用户可完成密码的修改。exec进程退出后会恢复用效用户ID为普通用户ID,这样就不会使普通用户一直拥有root权限。

    特殊权限位之粘住位(sticky bit)

    如果对一个目录设置了粘住位,则只有对该目录具有写权限的用户在满足下列条件之一的情况下,才能删除或更名该目录下的文件:

    • 拥有该文件
    • 拥有此目录
    • 是超级用户

    目录/tmp是设置粘住位的典型例子——任何用户都可以在该目录下创建文件。任一用户(用户、组或其他)对这个目录的权限通常都是读、写和执行。但是用户不应该能删除或更名属于其他人的文件,为此这个目录的文件模式设置了粘住位。

    drwxrwxrwt 9 root root 4096 Feb 6 11:47 tmp/ 这是设置了粘住位的目录(注意这个标粗的t)
    drwxr-xr-x 10 root root 4096 Dec 16 2016 usr/ 这是未设置粘住位的目录

    Linux /etc/passwd和/etc/shadow文件

    root@20200206A858HU6:~# cat /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin #不允许登录,将打印可自定义的出错信息,然后以非0状态终止。

    /etc/passwd文件是由多行组成,每一行记录一个用户信息,信息之间由冒号分隔。注意第2个x所有用户都是一样的,这是由于早期操作系统,这里存储的是加密口令(hash单向加密),如今口令放到了/etc/shadow文件中,这里x仅是一个兼容历史的占位符。

    把口令放到/etc/shadow的原因是,/etc/passwd文件任何用户都可以读,由于使用单向哈希加密,存在彩虹表等攻击手段,提供给外界更少的语料,被破解的风险也就越低。

    -rw-r–r– 1 root root 1571 Feb 6 13:39 passwd

    而/etc/shadow文件,是只有root用户,或shadow组可读的,只有设置了设置用户ID位或设置组ID位的程序才有权限读,如/usr/bin/passwd,/usr/bin/login等程序。

    -rw-r—– 1 root shadow 879 Feb 6 13:39 shadow

  • 相关阅读:
    csp-s模拟 77/78 (达哥专场)
    csp-s 模拟76
    csp-s模拟75 导弹袭击
    反思集
    模拟69/70 考试反思
    抱大腿
    csp-s模拟61 甜圈
    实时记录
    好题思路集汇
    半集训反思 8.28 「路,还是要自己走的」
  • 原文地址:https://www.cnblogs.com/gm-201705/p/12897921.html
Copyright © 2011-2022 走看看