@

文件的访问权限

当我们要打开一个文件时,分两种情况:

  • 通过路径打开,如/usr/include/stdio.h,此时需要对路径上的目录 /、/usr、/include 都具有执行权限,同时需要对stdio.h具有相应权限,这取决于我们如何打开它(只读、读写)。
  • 在当前目录打开,这需要对当前目录具有执行权限,对要打开的文件具有相应权限。

目录是文件的一种:

  • 目录的读权限[r]用于读取目录结构列表
  • 进入/打开目录需要执行权限[x] ,[x]表示可以对该目录进行搜索
  • 在目录中创建、删除、重命名、移动文件或目录,需要对该目录有写和执行权限[wx]。删除目录中的文件,对文件本身不需要具有写和执行权限。

访问权限位

ls -al 或 ll

文件的三种身份:owner group others
-rwsr–r– , 一共10个字符:

  • 第1项代表文件类型,如文件是[-],目录是[d],linkfile是[l]
  • 第2-4项3为owner权限,可读[r] ,可写[w],可执行[x]
  • 第5-7项为group权限
  • 最后三项为其他非本组用户others权限
  • root具有全部权限。
    对上述四项,可以用八进制数字进行表示,如 rwx = 111(二进制) = 7(八进制),-rwxrwxr-x = 1775

用户ID和组ID

与一个进程关联的ID有6个或更多
在这里插入图片描述

查看用户id /etc/passwd
切换用户 su id/name su操作是在当前的shell中重新启动了一个shell,并切换了用户权限
退出 exit

访问权限判断

进程打开、删除、创建文件时,内核对文件进行权限判断,根据文件的所有者(st_uid、gid),进程的有效用户ID、有效组ID、附属组ID

  1. 如果进程有效用户ID是0,即root,则允许访问
  2. 如果进程的有效用户ID=文件的所有者ID,即进程拥有此文件,则判断所有者是否被设置相应的访问权限位,即若进程对该文件的打开方式是读,则文件的访问权限位上,用户读位应为[r],否则拒绝访问
  3. 若进程的有效组ID或附属组ID=文件的组ID,则判断文件的组是否被设置相应的访问权限位,否则拒绝。
  4. 若文件的others设置了相应的访问权限位,则允许访问,否则拒绝。

用户权限改变

  • setuid(uid)
    若当前用户是root,则setuid函数将real id、effective id和saved id改为uid;
    若uid=real id或saved id则将effective id改为uid;
    否则,返回-1 。

  • seteuid(uid), 设置effective id,非root用户可以将其effective id 改为real id 或 saved id

  • getuid(), 获取文件的real id;

  • geteuid(), 获取e id;

chown root:root backdoor   //改owner,将backdoor的用户:用户组改为root:root
chmod 775 backdoor //改权限为 -rwsrwxr-x

例:以root权限打开一个新的shell,替换当前shell

#include <stdio.h>
#include <unistd.h>
int main(){
        printf("real id is: %d; effective id is: %d.\n",getuid(),geteuid());
        setuid(0);
        execlp("/bin/bash","/bin/bash",NULL);
        return 0;
}

在这里插入图片描述

参考:
《UNIX环境高级编程》
https://zhuanlan.zhihu.com/p/61870331

版权声明:本文为ChengzhiYang原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/ChengzhiYang/p/11359943.html