文章目录

  • Unix文件相关属性
    • 文件属性操作相关命令
  • 进程相关ID
    • 设置用户ID和设置组ID
    • 文件访问权限
    • 进程操作文件权限
  • 更改用户ID和组ID

我们在使用类UNIX系统时,经常会涉及到各种ID,比如,文件属性相关的用户ID、组ID,进程运行时相关的6个ID:实际ID、实际组ID、有效ID、有效组ID、保存的用户设置ID、保存的设置组ID。

实际使用过程中,我们经常搞混各个ID基本概念和使用方式,所以,本文用于记录相关内容,方便查阅和使用。

Unix文件相关属性

“一切皆文件”是Unix的基本哲学,Unix系统的所资源都可以用文件来表示。具体到每个文件,其都会有相关的文件属性,本文要说的文件的用户ID、组ID,文件的访问权限就包括在文件的属性中。

文件属性操作相关命令

  1. 通过stat命令查看文件的所有属性:

     lhl@ubuntu18:~/develops/linux$ stat test文件:test大小:0    块:0  IO 块:4096   普通空文件设备:801h/2049d    Inode:5769793 硬链接:1权限:(0644/-rw-r--r--)  Uid:( 1000/ lhl)   Gid:( 1000/ lhl)最近访问:2020-02-12 12:54:38.006718573 +0800最近更改:2020-02-12 12:54:38.006718573 +0800最近改动:2020-02-12 12:54:38.006718573 +0800创建时间:-
    

    可以看到,文件的权限、用户ID、组ID。

  2. 通过id命令查看某个用户的相关信息,默认为当前用户。

     lhl@ubuntu18:~/develops/linux$ id rootuid=0(root) gid=0(root) 组=0(root)
    
  3. 通过chown命令修改文件所属的用户和组。

     hl@ubuntu18:~/develops/linux$ chown --help用法:chown [选项]... [所有者][:[组]] 文件...-R选项:用于递归修改各级目录下的文件所属用户和用户组。
    
  4. 通过chmod修改文件相关权限。

     lhl@ubuntu18:~/develops/linux$ chmod --help用法:chmod [选项]... 模式[,模式]... 文件...其中,模式来自于'[ugoa]*([-+=]([rwxXst]*|[ugo]))+|[-+=][0-7]+'.
    
  5. 通过usermod修改用户相关的信息。

     比如,将用户lhl添加到docker用户组中。lhl@ubuntu18:~/develops/docker/docs$ sudo usermod -aG docker lhl[sudo] lhl 的密码: lhl@ubuntu18:~/develops/docker/docs$ id lhluid=1000(lhl) gid=1000(lhl) 组=1000(lhl),127(docker)
    

进程相关ID

与一个进程相关的ID有6个或更多,表示如下:

下面分别解析一下各种ID:

  • 首先,必须明确上述个ID是依赖于进程存在的,每当谈到这些ID时,都是相对于进程来说的。

  • 实际用户ID和实际组ID标识我是谁。那么,在Unix系统中,这个“谁”是如何来的呢?答案就是,我们登陆系统时,肯定会指定登陆用户,那么这个登陆用户就是这里的“我“。用户登陆成功后,在整个登陆会话期间,这个“我”不会改变。

  • 有效用户ID和有效组ID决定了进程在访问文件时可以获得权限。

  • 保存的设置用户ID和保存的设置组ID在执行一个程序时包含了有效用户ID和有效组ID的副本。

设置用户ID和设置组ID

通常情况下,进程的有效用户ID等于实际用户ID,进程的有效组ID等于实际组ID。每个文件都有自己的所有者和组所有者,可以通过stat命令查看。

由上文可知,进程依赖于有效用户ID和有效组ID来提供对于文件的访问权限的能力。Unix文件系统提供一种这样的能力,那就是,通过在可执行文件的模式字st_mode中设置一个特殊的标志,即"设置用户ID"来实现进程运行时的有效用户ID的切换,即由实际用户ID转换为可执行文件的所有者ID。对于有效用户组,在st_mode中同样有“设置用户组ID”标志位。

举个例子,Unix的系统passwd命令,用户可以使用该命令修改指定用户的密码,该可执行程序文件的权限如下所示:

lhl@ubuntu18:/usr/bin$ stat passwd 文件:passwd大小:59640      块:120        IO 块:4096   普通文件
设备:801h/2049d    Inode:3408705     硬链接:1
权限:(4755/-rwsr-xr-x)  Uid:(    0/    root)   Gid:(    0/    root)

注意,passwd所有者权限中的那个s,表示启用了“设置用户ID”,而且passwd的所有者ID和所有者组ID都为0(root)。

passwd最终修改/etc/passwd和/etc/shadow两个文件来达到用户密码修改目的,/etc/passwd和/ect/shadow两个文件的用户ID和用户组ID都是root。普通用户是没有权限需改这个两个文件的,但是,通过给passwd增加“设置用户ID“标志之后,就可以实现任何普通用户修改/etc/passwd和/etc/shadow文件的目的。

做一个实验,如果将passwd的“设置用户ID”标志位去掉,那么普通用户也就失去了密码的修改能力了。

  1. 去掉passwd的“设置用户ID”标志位。

     lhl@ubuntu18:/usr/bin$ sudo chmod u-s passwd [sudo] lhl 的密码: lhl@ubuntu18:/usr/bin$ stat passwd文件:passwd大小:59640       块:120        IO 块:4096   普通文件设备:801h/2049d Inode:3408705     硬链接:1权限:(0755/-rwxr-xr-x)  Uid:(    0/    root)   Gid:(    0/    root)
    

通过stat passwd可以看到“设置用户ID”标志位已经去掉了。

  1. 尝试修改用户密码。

     lhl@ubuntu18:/usr/bin$ passwd lhl更改 lhl 的密码。(当前)UNIX 密码: 输入新的 UNIX 密码: 重新输入新的 UNIX 密码: passwd:认证令牌操作错误passwd:密码未更改
    

可以看到普通用户lhl,失去了修改其用户密码的能力。

注意,由于给可执行文件增加”设置用户ID“或”设置用户组ID”权限之后,普通用户获得了额外的权限,所以,在使用这项能力时,要特别的谨慎,否则极有可能会造成系统安全问题。

文件访问权限

上面提到过,任何文件都有访问权限,这些对于文件的访问权限保存在文件的模式字st_mode中,Unix系统为三类用户:文件用户,文件用户组,其他用户,分别提供三种权限:可读、可写、可执行,所以共9种权限。

对于文件权限的理解,应该注意一下几个方面:

  • 目录文件:Unix系统把目录当做一种文件,称为目录文件。目录文件的三种权限的含义,经常引起误解,正确的含义如下:

    • 读权限:读取当前目录下所有文件名的权限,所谓的当前目录就是指的具有相应权限的目录。
    • 写权限:修改当前目录下所有文件名的权限,所以在一个目录下创建一个新的文件,或者删除一个文件时,需要对该文件所在的目录具有写权限和执行权限。
    • 执行权限:搜索当前目录下所有文件名的权限,所谓搜索,即 进入目录的权限。对于这个权限,需要注意的PATH环境变量中命令目录,如果引用了一个没有可执行权限的目录,那么shell就不会在该目录下搜索到想要的命令。
  • 对一个文件的读权限决定了我们能够打开该文件进行读操作,这与open函数的O_RSONLY和O_RDWR标志相关。
  • 对一个文件的写权限决定了我们能够打开该文件进行写操作,这与open函数的O_WRONLY和O_RDWR标志相关。
  • 函数族exec执行任何一个普通文件时,必须要有对于该文件的可执行权限。

进程操作文件权限

进程每次打开、创建、删除文件时,内核都会匹配文件访问权限。下图对展示了进程foo访问文件file1时,内核所做的访问权限检验过程。

可以看到,由于进程的有效用户ID和有效用户组ID为101,而文件的用户ID和用户组ID为100,所以,进程匹配到的文件访问权限为r-x,而进程foo调用open系统调用打开文件file1时,需要的访问权限是O_RDWR,所以,进程打开文件失败,失败原因是权限不足。

更改用户ID和组ID

Unix系统中,进程的权限依赖于文件本身的权限、进程的有效用户ID、有效组ID以及内核中进程关于文件权限的验证系统。实际情况下,进程可能为了获得对于某些资源的访问权限,需要提权;同样,为了系统安全,进程也会放弃对于某些敏感资源的访问权限,所以,需要降权。一般情况下,在设计应用程序时,我们应该本着“最小特权”的原则设计我们的应用程序,即,应用程序应该只具有完成自身任务所需的最小特权。

那么,Unix如何实现“提权”和“降权”呢?主要依赖于两个函数和一套规则,先说两个函数。

  1. 设置函数

     #include <unistd.h>int setuid(uid_t uid);int setguid(uid_t gid);两个函数,执行成功返回0,出错返回-1,可以通过perror查看具体的错误信息。
    
  2. 规则

    • 若进程具有root权限,则setuid函数将实际用户ID、有效用户ID,以及保存的设置用户ID设置为uid;
    • 若进程没有root权限,但uid等于实际用户ID或保存的设置用户ID,则setuid只将有效用户ID设置为uid,不改变实际用户ID和保存的设置用户ID;
    • 若上面两个条件都不满足,则将errno设置为EPERM,并返回-1。
  3. 注意事项

    • 只有root用户可以修改进程的实际用户ID;
    • 仅当进程文件设置了设置用户ID标志位时,exec函数才会设置有效用户ID,并且将有效用户ID设置为文件的用户ID。否则,exec不会改变有效用户ID,而是将其维持原值。任何时候,都可以调用setuid,将有效用户ID设置为实际用户ID和保存的设置用户ID。自然,有效用户ID不能任意设置值;
      修改进程的实际用户ID;
    • 保存的设置用户ID是由exec复制有效用户ID而来的。若设置了进程文件的设置用户ID位,则在执行exec时,其会将文件的用户ID设置为保存的设置用户ID,然后保存这个副本。

Unix进程相关用户ID、用户组ID详解相关推荐

  1. Linux用户与用户组配置文件详解

    Linux用户与用户组配置文件详解 出发点 Linux是一个多用户多任务的操作系统,用户需要使用系统,就必须在系统中拥有属于自己的账号. 作为一个Linux管理员,对用户增删改查等操作当然离不开用户与 ...

  2. linux下用户和用户组配置文件详解

    用户(User)和用户组(Group)的配置文件,是系统管理员最应该了解和掌握的系统基础文件之一,从另一方面来说,了解这些文件也是系统安全管理的重要组成部份:做为一个合格的系统管理员应该对用户和用户组 ...

  3. Linux /etc下用户和用户组配置文件详解

    /1.etc/passwd配置文件详解 passwd配置文件是保存计算机用户相关信息的文件,该文件每行按冒号分隔,有7列,分别如下: 示例:fc:X:1000:1000:fc:/home/fc:/bi ...

  4. 开启子进程的两种方式、进程间内存空间隔离、进程对象的方法或属性详解

    1.操作系统(推荐查看书籍:现代操作系统)     操作系统是位于计算机硬件与软件之间的控制程序     作用:         1.将硬件的复杂操作封装成简单的接口,给用户或者应用程序使用      ...

  5. MySQL的用户密码过期功能详解

    MySQL的用户密码过期功能详解 作者:chszs,未经博主允许不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs 先说明两个术语. Payment Ca ...

  6. Android-Binder进程间通讯机制-多图详解

    本系列: Android-Binder进程间通讯机制-多图详解 一次Binder通信最大可以传输多大的数据?​​​​​​​ 关于Binder (AIDL)的 oneway 机制 概述 最近在学习Bin ...

  7. 操作系统 - 进程与线程的区别[超详解]

    操作系统 - 进程与线程的区别[超详解]面试高频考题

  8. java生成唯一字符串_java唯一字符串ID生成方案详解

    工作中经常会有生成唯一字符串的需求.通常最容易想到的是UUID.UUID的唯一性毋庸置疑,但是32位的长度也容易让人退避三舍.也曾经想过参考<短网址生成方案>来生成一串ID,但是试验了一下 ...

  9. 泰拉瑞亚手机版html,泰拉瑞亚手机版幽灵套装怎么做 幽灵套装ID和属性详解

    在泰拉瑞亚手机版(Terraria)中套装是装备系统中想当重要的一种,那么各种各样的套装应该如何获得呢?下面的幽灵套装获得和属性详解大家可以参考一下. 欢迎加入泰拉瑞亚交流总群:1150338051 ...

最新文章

  1. 嘈杂场景语音识别准确率怎么提?脸书:看嘴唇
  2. 8.Windows线程切换_时间片管理
  3. Oracle Sequence
  4. linux编译安装git
  5. npm ERR! code ELIFECYCLE解决方案
  6. 使用Apache Isis快速进行SEMAT应用程序开发
  7. figtree如何编辑进化树_iTOL快速绘制颜值最高的进化树
  8. webstorm配置,快捷键console.log,中文字体,快捷键配置等
  9. Windows环境下Anaconda-Navigator出现闪退、无法打开问题的解决方案记录
  10. Spring Boot基础学习笔记21:自定义用户认证
  11. 5种方法,加密你的Python代码 !
  12. 软考-架构师知识总结
  13. 菜菜的刷题日记 | 215. 数组中的第K个最大元素
  14. Docker Nginx配置(docker.io/nginx)
  15. 建站教程|小鸟云服务器搭建Wordpress站点
  16. 电脑解锁后黑屏有鼠标_电脑开机黑屏就剩鼠标怎么回事?
  17. java向手机号发送短信验证码
  18. #双11故事联播#守护篇| 支付王牌军-我们如何从容应对双11?
  19. xargs的用法--linux
  20. 储存profiles是什么意思_【2018最新】low profile的中文是什么意思-精选word文档 (4页)...

热门文章

  1. Java中的继承 与 多态(中)
  2. Linux 将 /home 目录与 / 根目录磁盘合并
  3. nts包如何下周 php_PHP语言包下载安装与如何搭建PHP运行环境配置的教程
  4. kdtree最简单易懂的介绍
  5. 查看python关键字的方法,查看python关键字的方法
  6. 如何进行内存容量测试?
  7. python调用企业微信机器人API-自动发送文本、图片与CSV文件3种方式
  8. Egret 小米电视接入 遥控器操作
  9. 文本特征提取之词袋模型
  10. 看看大佬是如何用一行代码实现网页变灰的效果的