• Linux 用户ID和组ID

    2017-07-30 14:34:03
    Linux进程有两个ID,一个就是用户ID,为每个用户的唯一标识符;另一个是组ID,为用户组的唯一标识符UID:UID的值为0时,表示系统管理员;(1-99)为系统预设账号;(100-499)保留给一些服务使用;(500-65535)给...

    Linux进程有两个ID,一个就是用户ID,为每个用户的唯一标识符;另一个是组ID,为用户组的唯一标识符

    UID:UID的值为0时,表示系统管理员;(1-99)为系统预设账号;(100-499)保留给一些服务使用;(500-65535)给一般使用者使用

    可在终端输入cat /etc/passwd | grep 你的用户名指令查询UID和GID

    这里写图片描述

    user用户的UID和GID分别是1000:1000

    setuid, setgid 可以来改变这种设置.
      setuid: 设置使文件在执行阶段具有文件所有者的权限。典型的文件是 /usr/bin/passwd. 如果一般用户执行该文件, 则在执行过程中, 该文件可以获得root权限, 从而可以更改用户的密码。
      setgid: 该权限只对目录有效,目录被设置该位后, 任何用户在此目录下创建的文件都具有和该目录所属的组相同的组。

    展开全文
  • 有效用户id、实际用户id、设置用户id概念更改用户ID以下内容均来自https://www.cnblogs.com/stemon/p/5287631.html的内容实例分析一: 概念 实际用户id(RUID,进程特有的概念): 在开机时,你输入的账号的对应id...

    概念

    实际用户id(RUID,进程特有的概念): 在开机时,你输入的账号的对应id就是实际用户uid,说白了就是登录号,站在用户的角度上看。
    有效用户id(EUID,进程特有的概念): 一般和RUID相同,站在操作系统的角度上看,用于给操作系统判断某个进程是否拥有操作某个文件的权限。
    设置用户id(SUID,set user id,文件特有的概念): 站在文件的角度上看,文件权限有r-w-x-s-t类型,其中的s表示SUID是打开状态(即可用状态)。如果一个文件的权限位里面没有s,则表示SUID是关闭状态(即不可用状态)。注意:SUID只能用于可执行文件,其作用是修改EUID(有效用户id)
    保存的设置用户id(SSUID,saved SUID,《Unix高级环境编程 第3版》的8.11节里面定义的,进程特有的概念),也有博客称为保留的设置用户id: EUID(有效用户id)的备份,既然是备份,则应该是恢复的作用。SSUID由linux的exec()函数保存,可以把SSUID理解为exec()函数里面的一个局部变量。exec()的执行逻辑大概如下(自己猜测的,为了好理解SSUID的作用):

    // 这里假设 "可执行文件"为/etc/passwd, 该文件的权限位-rwsr-xr-x,文件的拥有者是root
    void exec("可执行文件") {
    	SSUID = EID;
    	进程的EID = 可执行文件用户(即root用户);
    	执行"可执行文件";
    	//此时调用本函数的进程已经拥有root权限了
    	
    	EID = SSUID;
    	
    }
    

    文件特有的概念:
    **FUID(file uid):**文件的拥有者
    **FGID(file gid):**文件的拥有者所在组的组id
    设置用户id(SUID,set user id,文件特有的概念): 站在文件的角度上看,文件权限有r-w-x-s-t类型,其中的s表示SUID是打开状态(即可用状态)。如果一个文件的权限位里面没有s,则表示SUID是关闭状态(即不可用状态)。注意:SUID只能用于可执行文件,其作用是修改EUID(有效用户id)

    总结:RUID、EUID、SSUID都是针对进程的,即站在进程的角度,即进程特有的概念。而SUID则是针对文件的,即站在文件的角度,或者说是SUID是可执行文件特有的概念!为什么要修改进程的EUID?目的是想让进程在某一时刻能够拥有特殊的权限。

    更改用户ID

    进程特有的概念
    一个文件有9个文件权限位,比如/etc/passwd的9个权限位是 rwsr-xr-x, 其中的s就是SUID(设置用户ID位),说明/etc/passwd的设置用户ID位是打开状态。

    在这里插入图片描述

    以下内容均来自https://www.cnblogs.com/stemon/p/5287631.html的内容

    对于一个普通文件,有三个ID,这三个ID对应三组权限,这三组权限控制着进程对该文件的访问权限。
    在这里插入图片描述
    对于linux系统,某个用户登录后,创建一个文件,那个这个文件的用户ID就是这个用户的ID。该用户创建的所有的进程都可以访问这个文件,因为该用户创建的进程的实际用户ID和有效用户ID都是这个用户的ID。但是当一个用户创建的进程要去访问其他用户创建的文件的时候,就需要用到有效用户ID的改变,来能够有权限访问这个文件。

    实例分析一:

    如何在权限不够的情况下执行特权权限,具体的方法就是更改进程的有效用户ID。
    对于linux系统来说,用户的密码都存放在/etc/shadow文件下,查看一下这个文件的权限:

    在这里插入图片描述

    假如我是一个普通的用户,显然我是可以修改我自己的密码的,通过passwd命令,无可厚非,自己修改自己的密码当然是允许的。

    但是仔细想想有没有什么不对的地方,作为一个普通的用户登录后,我的所有的进程的实际用户ID和有效用户ID都应该是我自己(这个用户)的UID。从上面对/etc/shadow文件用户ID和所属的组ID看,我不具备修改这个文件的权限,那么执行passwd命令是怎么修改我的密码的呢?

    根据上面所讲的知识,决定进程对文件的访问权限的是执行操作时的有效用户ID,所以在执行passwd命令时,进行的有效用户ID肯定不是我这个普通用户的UID,一定被修改过了。

    还有一点,在执行passwd这个命令的时候,在磁盘上肯定有一个可执行的文件,下面看看这个可执行文件的权限:
    在这里插入图片描述

    我们看到了一个s,这就是使用户设置ID位有效,上面说过这个位的作用就是修改执行这个可执行文件的进程的有效用户ID,那么我么来看看他是怎样修改执行passwd命令的进程的有效用户ID的。

    首先看一下命令的执行的过程,当普通用户执行passwd命令时,shell会fork出一个子进程,此时该进程的有效用户ID还是这个普通用户的ID,然后exec程序执行/usr/bin/passwd这个例程(可执行文件)。通过上面的表我们就能知道,exec发现/usr/bin/passwd这个可执行文件有SUID为,于是会把进程的有效用户ID设置成可执行文件的用户ID,显示是root,此时这个进程就获得了root的权限,得到了读写/etc/shadow文件的权限,从而普通用户可以完成密码的修改。exec进程退出后,会恢复普通用户的有效用户ID为实际用户ID(也就是该普通用户的ID),这样就保证了不会是普通用户一直具有root权限。

    在exec时,修改进程的有效用户ID为文件的用户ID,还是恢复进程的有效用户ID为进程的实际用户ID,这些都是linux内核完成的,用户是不能干预这些步骤的。

    这样的过程既实现了普通用户权限的暂时的提升,不让普通用户长久的拥有root权限。同时即使在普通用户拥有root权限的这段短暂的时间里,普通用户也不能为所欲为,因为普通用户的这个进程必须按照/usr/bin/passwd这个可执行文件的指令内容执行,不能干之外的任何事情,而这个可执行文件又是root事先写好的,多么完美的设计啊~~

    这就是设置用户ID为的作用,它的存在就是为了普通用户能够在某些时候获取一段时间的超级权限,但是你可能疑问,为什么不能用setuid直接修改呢?

    如果这里可以用setuid直接修改进程的有效用户ID来获得特权权限,那么整个系统的超级权限就不可控制了,这违背了最小权限模型。所以linux的设计是:setuid在非特权用户下面,有效用户ID只能设置成为实际用户ID或者保存的设置用户ID。保存的设置用户ID又是有效用户ID的副本,有效用户ID只能是实际用户ID或者文件的所有者ID(在设置了保存用户ID位时)。

    这样你就不能将有效用户ID设置成随意的值,所以对普通用户创建的任何文件,如果没有得到超级用户的授权,那么无论怎么编写代码来设置运行进程的有效用户ID或者设置用户ID位,由于这个可执行文件是普通用户自己编写的,所以权限根本没有任何改变。这里就是说只有root自己创建的可执行文件并且设置了用户ID位,才能够提升执行该可执行文件的进程的权限。

    展开全文
  • linux 设置用户ID、设置组ID

    转载出处:http://blog.chinaunix.net/uid-26817066-id-3275353.html  



    1、一个进程相关的ID主要有:


     实际用户ID 、 实际组ID : 标识空间我们是谁, 登录时取自口令文件登录项,登录会话期间一直不变,超级用户可改变
     
    有效用户ID 、 有效组ID : 决定了我们的文件访问权限,也就是用来测试本进程对某些文件的访问权限
     
    保存的设置用户ID 、 保存的设置组ID: 执行一个程序时包含了有效用户ID 和有效组ID的副本

    ps: 通常 有效用户ID等于实际用户ID,有效组ID等于实际组ID ,当执行一个文件时, 如果文件设置了设置用户ID位设置用户组ID位 即SUID  SGID 则情况不同


    2、进程每次打开一个文件时, 内核进行访问权限测试:


     涉及到用户所有者(st_uid st_gid), 进程有效ID(有效用户ID和有效组ID)以及附加组ID(若支持的话)
     所有者ID是文件的性质, 
    两个有效ID和附加组ID则是进程的性质

    内核进行的测试步骤:
     1. 如果
    进程的有效用户ID是0(超级用户), 则允许访问
     2. 若
    进程有效用户ID等于文件所有者ID, 则根据文件所有者所设置的权限访问

    点击(此处)折叠或打开

    1. -rwxr-xr-x 1 201 202 1891 7月 16 10:24 test.sh
       如上, 如果进程的有效用户ID 等于201, 则进程对文件的权限为 -rwxr-xr-x  紫色所表示的权限
     
     3.  如进程的有效组ID或进程的附加组ID之一等于文件的组ID(即文件的实际组ID) , 那么进程对文件的权限为文件所有组所设置的权限  .

        还是上面这个例子, 如果进程的有效组ID或附加组ID之一为202的话, 那么进程对文件的权限 为 -rwxr-xr-x 紫色所表示的权限

     4. 若其他用户适当权限被设置 则进程此文件的权限为文件的其他访问权限

       就是上面例子的最后三位权限了!

    注意: 
    这四步是依次执行的, 如果不是超级用户, 但是进程拥有此文件( 也就是有效用户ID等于文件的实际用户ID) 那么就按文件所有者权限来确认进程对此文件的权限, 后面的步骤不再执行!

    对于进程访问文件权限测试的总结
       从上面可以看出, 内核对进程文件的权限测试 主要是针对 进程的有效用户ID来进行测试的,  也就是说, 如果有效用户ID 等于文件所有者ID  那么我(打开文件的进程) 就是文件的所有者 拥有文件所有者所拥有的权限, 如果不是文件的所有者 就再测试进程有效组ID...

    3、文件模式中的设置用户ID位和设置组ID位

       
       关于具体的描述网上很多文章都说了, 简单说下书上说的:
    文件 设置用户ID位: 当执行此文件时, 将进程的有效用户ID设置成文件的所有者用户ID
         设置组ID位: 当执行此文件时, 将进程的有效组ID设置成文件的组所有者ID



    1. -rwsr-sr-x 1 200 201 1891 7月 16 10:24 test.sh
    如上  -rwsr-sr-x 紫色表示文件设置了 设置用户ID位;  -rwsr-sr-x  紫色表示设置了 设置组ID位 , 如果这里的S位为大写, 表示执行位没有设置,连文件执行位都没设置, 那么设置了 设置用户或设置组ID位 也没有用。

    最经常看到的例子:
     passwd程序就是一个设置用户ID程序, 允许任何用户修改其口令, 因为命令可以将新口令写入口令文件/etc/passwd, 但只有超级用户才有该文件的写权限, 所以设置了该passwd设置用户ID位, 当执行passwd时, 进程有效用户ID设置成程序passwd的所有者ID, 即root, 所以可以写入新命令到口令文件中了!


    4、新文件和新目录的所有权


     1. 新文件的用户ID设置成进程的有效用户ID
     2. 新文件的组ID两种情况:
        (1)  新文件的组ID是进程的有效组ID
        (2)  如果新文件的组ID所在目录的 设置组ID位 设置了的话, 新文件的组ID将设为目录的组ID (这设置组ID位这里的作用与权限测试的时候有点类似)
     3. 其他:

     
    (1). mkdir 函数自动的传递了目录的 设置组ID位
     (2) access 函数是用实际用户ID和实际组ID来进行访问权限的测试的
     如果你只想测试下实际用户所拥有的权限 ,就可以使用这个函数了。

    5、编程应用


     1. 在执行exec前后 进程的实际用户ID和实际组ID不变, 而有效ID 取决于所执行的程序文件 是否设置了设置用户ID位设置组ID位, 如果设置了 设置用户ID位, 则有效用户ID变成程序文件所有者ID,否则有效用户ID不变, 对组ID处理方式与此相同,

     2.  保存的设置用户ID是由exec复制有效用户ID后得来的, 所有第一点里面介绍设置用户ID时说 是有效用户ID的副本!

     3
    . 一般设计应用程序时, 总是试图使用最小特权模型, 依照模型, 程序应当只具有为完成任务所需的最小特权.

     4. 使用函数:


    1. #include ,unistd.h>

    2.     int setuid(uid_t uid); //设置实际用户ID和有效用户ID,如果进程为超级用户,则会设置实际、有效、保存的设置用户ID
    3.     int setgid(gid_t gid); //设置实际组ID和有效组ID
    4.     int setreuid(uid_t ruid, uid_t euid); //交换实际用户ID和有效用户ID
    5.     int setregid(gid_t rgid, gid_t egid);
    6.     int seteuid(uid_t uid); //更改有效用户ID
    7.     int setegid(gid_t gid);
    注意: 
       根据书上来看, 特权用户使用这几个函数的时候, 都是直接用参数的值来设置实际用户ID或者有效用户ID,这些值都可以是
    任意的. 
           例如:setreuid(ruid, euid), 如果是特权用户,则直接设置实际用户ID为ruid,有效用户ID为euid

      但非特权用户就不行了, 非特权用户
    用setuid(), seteuid()则只能将有效有户ID设置为实际用户ID或保存的设置用户ID,如果不是这两个数,设置失败! 

    对编程应用方面的总结:
      非特权用户不能指定任意的有效用户ID, 结合其他几个函数来交换或设置有效用户ID, 与设置用户ID位 一起实现权限的控制 

    6、以书上的例子结束

     
    man程序文件的所有者及他属组通宵是为man自身保留的用户和组, man可能需要执行许多其他命令,以处理包含显示手册页的文件,为了防止被欺骗或重写错误文件, man在两种权限间切换: 运行man命令用户的权限, 拥有man可执行文件用户的权限

     1. man程序文件由名为man的用户所拥有, 设置用户ID位已设置, exec 此程序时 , 用户ID情况:

    实际用户ID = 我们的用户ID
    有效用户ID = man      //因为设置用户ID位,所有进程的有效用户ID成了文件的所有者ID
    保存的设置用户ID = man  // 保存的设置用户ID,复制有效用户ID得来

     2.  程序访问需要的配置文件和手册页,这些文件由man用户拥有, 因为有效用户ID是man,所以可以访问

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

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

       现在man 以有效用户为我们的用户ID运行, 所以man 只能搜索我们通常可以访问的文件, 代表我们安全的执行一次过滤

    4.  当过滤完成后 ,  再调用setuid(euid), {euid 由用户man调用geteuid()保存下来,  这里setuid的参数为设置用户ID 所以是许可的} ,现在用户ID情况:

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

    注意:  一个进程无法直接获取他的保存的设置用户ID, 但因为exec时设置用户ID是由复制有效ID获取的, 所以开始时应该用euid=geteuid()保存这个有效ID 即后面的设置用户ID, 供这里使用.

     
    5. 因为有效用户是man, 所以现在可以对其他文件进行操作了
    展开全文
  • Linux id命令用于显示用户ID,以及所属群组的IDid会显示用户以及所属群组的实际与有效ID。若两个ID相同,则仅显示实际ID。若仅指定用户名称,则显示目前用户ID。 语法 id [-gGnru][--help][--version]...

    Linux id命令用于显示用户的ID,以及所属群组的ID。

    id会显示用户以及所属群组的实际与有效ID。若两个ID相同,则仅显示实际ID。若仅指定用户名称,则显示目前用户的ID。

    语法

    id [-gGnru][--help][--version][用户名称]

    参数说明

    • -g或--group  显示用户所属群组的ID。
    • -G或--groups  显示用户所属附加群组的ID。
    • -n或--name  显示用户,所属群组或附加群组的名称。
    • -r或--real  显示实际ID。
    • -u或--user  显示用户ID。
    • -help  显示帮助。
    • -version  显示版本信息。

    实例

    显示当前用户信息

    # id //显示当前用户ID
    uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) context=root:system_r:unconfined_t

    显示用户群组的ID

    # id -g
    0

    显示所有群组的ID

    # id -g
    0 1 2 3 4 5 6 10

    显示指定用户信息

    # id hnlinux



    展开全文
  • Linux通过进程的 实际用户ID/实际组ID,有效用户ID/有效组ID/附加组ID,保存的设置用户ID/保存的设置组ID  来控制进程对资源的访问。  其中,实际用户ID/实际组ID标识进程究竟是谁(即是进程在系统的唯一标识...
    Linux通过进程的 实际用户ID/实际组ID,有效用户ID/有效组ID/附加组ID,保存的设置用户ID/保存的设置组ID 
    来控制进程对资源的访问。 

    其中,实际用户ID/实际组ID标识进程究竟是谁(即是进程在系统的唯一标识) 
          有效用户ID/有效组ID/附加组ID决定了进程的访问权限 
          保存的设置用户ID/保存的设置组ID在执行一个程序时包含了有效用户ID和有效组ID的副本 

    通常,有效用户ID等于实际用户ID,有效组ID等于实际组ID 
    但是可以在文件模式字(st_mode)中设置一个特殊标志(如S_ISUID,S_ISGID)来实现"当执行该程序文件时,将进 
    程的有效用户ID设置为程序文件所有者的用户ID(s_uid)"(组也一样) 

    在文件模式字s_mode中这两位S_ISUID,S_ISGID被称为设置用户ID位和设置组ID位 

    当程序需要增加特权以访问当前不允许访问的资源时,我们需要更换程序的用户ID或组ID,使新ID具有合适的特权 
    或者访问权限。 
    Linux系统提供了setuid/setgid(unistd.h)来设置用户ID.这种设置必须遵循一下规则: 
    1.若进程具有超级用户权限,则setuid(uid)将实际用户ID,有效用户ID,以及保存的设置用户ID设置为uid 
    2.若进程没有超级用户特权,但是uid等于实际用户ID或保存的设置用户ID,则setuid(uid)将有效的用户ID设置为 
      uid 
    3.如果以上两个条件都不满足,则将errno设置为EPERM,并返回-1 
    关于内核所维护的三个用户ID,还需注意一下几点: 
    1.只有超级用户进程可以改变实际用户ID。实际的用户ID通常在登陆时由login程序设置 
    2.仅当对程序文件设置了设置用户ID位时,exec函数才会设置有效用户ID,如果设置用户ID位没有设置,则exec函 
      数不会改变有效用户ID,而将其维持为原先值。任何时候都可以调用setuid(uid)将有效用户ID设置为实际用户 
      ID或者保存的设置用户ID。但不能将有效的用户ID设置为任意值(前面的规则约束) 

    3.保存的设置用户ID是由exec复制有效用户ID而得来的 


    未完待续,分析一个实际例子

    展开全文
  • linux查看用户ID和组ID

    2014-12-19 18:14:46
    通过/etc/passwd来查看用户ID和用户组ID. 总感觉这么做有点麻烦,其实是可以写一个小脚本来完成这一动作,但是比较懒.(伟大的牛哥说过,程序员就是要偷懒) 所以就绞尽脑汁在终端上键入id.我去,竟然有反应. 啥也不说...
  • Linux中的用户ID

    2014-09-04 11:47:25
    用户ID(英语:user identifier,一般缩写为User ID或UID),全称用户标识符,在类UNIX系统中是内核用来辨识用户的一个无符号整型数值,亦是UNIX文件系统与进程的必要组成部分之一。 数值范围 在不同的系统中...
  • linux修改用户id,组id

    2019-06-29 17:50:39
    一、修改用户uid usermod -u 2005 foo 二、修改用户gid groupmod -g 2005 foo usermod -g 2005 foo 三、检查 cat /etc/passwd su foo id 转载于:...
  • Linux中,每个文件都有其所属的用户用户组,默认情况下是文件的创建者,也可以根据chown和chgrp来修改文件所属的用户用户组。文件的属性存放在属性结构stat中,其中有st_uid和st_gid标志着。 先举个例子。...
  • 最近看apue,简单记录对设置用户id理解(设置组id同理)。  1. 相关的id好像很多,共有哪些?  文件2个id 2个位:  拥有者id   拥有者组id  设置用户id位 设置组id位  进程6个或更多的id(如果有...
  • 用户和用户组管理-3.6查看用户ID 写在前面:自己写完检查可能会有所纰漏,读者们如若发现哪里有错误,可在下方留言或私信我,我会第一时间改正
  • Linux系统中用户权限管理 Linux 是一个多用户的操作系统,引入用户,...1、Linux用户及组 Linux 系统用户是根据用户 ID 来识别的,默认 ID 长度为 32 位,从默认 ID 编号从 0 开始,但是为了和老式系统兼容,用...
  • Linux中修改用户UID和组GID的方法 http://www.sijitao.net/2401.html 发表时间:2016-04-20 21:30 | 分类:Linux | 浏览:2,344 次 我在部署nfs的时候,共享了一个文件夹。为了让远程nfs客户端挂载这个文件夹...
  • 修改用户ID和用户组ID

    2018-12-01 15:21:27
    假定原用户和用户组id如下: 用户 admin 500 组 admin 500 ...修改用户ID usermod -u 1000 admin 修改组ID groupmod -g 1000 admin 修改文件权限 find / -user 500 -exec chown -h admin {} \; fi...
  • 一、用户配置文件 用户管理简介: linux把通过把用户分为三个基本组,user,group,other来分配基本的权限 用户通过/etc/passwd用过用户名来获取用户的uid,通过/etc/group来获取用户所属组的gid,系统只能通过id号...
  • 1.权能实验过程中将sudo的s位给去掉了2.恢复sudo权限重启进入recovery模式输入如下指令
  • Linux添加用户用户权限管理 1.新建用户(组) ①用户 新建用户需要通过指令useradd来实现。 useradd的一些基本用法如下: useradd username 新建一个用户 useradd -u uid username 指定用户的uid useradd -g gid ...
  • 当使用某个用户登录时,报无法设置用户ID:资源暂时不可用“”错误。 错误原因: 资源不够,使用ulimit -a 查看,open files和max user processes值过小(缺省为1024) 问题解决: 尝试将open files和max user ...
1 2 3 4 5 ... 20
收藏数 439,020
精华内容 175,608
热门标签