zoukankan      html  css  js  c++  java
  • Linux权限管理

    @

    文件的访问权限

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

    • 通过路径打开,如/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.
    ",getuid(),geteuid());
            setuid(0);
            execlp("/bin/bash","/bin/bash",NULL);
            return 0;
    }
    
    

    在这里插入图片描述

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

  • 相关阅读:
    Linux tail 命令详解
    解决ArrayList的ConcurrentModificationException
    DOS简单实用的批量输出
    sqlite显示查询所消耗时间
    监听短信增删以及短信会话增删
    getContentResolver().query()方法selection参数使用详解(转)
    intellij编译报错:Internal error: com.intellij.psi.tree.IFileElementType cannot be cast to com.intellij.psi.tree.IStubFileElementType
    Android开发中如何改变RadioButton背景图片和文字的相对位置(转)
    php 获取系统时间
    优化android studio编译的apk大小
  • 原文地址:https://www.cnblogs.com/chzhyang/p/11359943.html
Copyright © 2011-2022 走看看