在Unix进程中涉及多个用户ID和用户组ID,包括如下:

1、实际用户ID和实际用户组ID:标识我是谁,身份的识别,谁运行的程序。也就是登录用户的uid和gid,比如我的Linux以simon登录,在Linux运行的所有的命令的实际用户ID都是simon的uid,实际用户组ID都是simon的gid(可以用id命令查看)。

2、有效用户ID和有效用户组ID:进程用来决定我们对资源的访问权限,权利的识别。一般情况下,有效用户ID等于实际用户ID,有效用户组ID等于实际用户组ID。

当设置(SUID)位,则有效用户ID等于文件的所有者的uid;同样,如果设置了(SGID)位,则有效用户组ID等于文件所有者的gid。

进程的RealUID和EffectiveUID 以及进程UID的继承关系

1. 身份的标识: Real UID

* 进程的UID只是泛称, 其实有很多种UID

* 进程的 Real UID 是进程身份的标识, 用来说明Who am I, 没有实权

* 进程能做什么 不是有 RealUID来决定的

2. 权利的标识: Effective UID

* 有身份无权利是不行的, 有权利才能为所欲为

* Effective UID 是进程的权利的标识, 标识了该进程的“权利”

* Linux的授权 是 靠 Effective UID 来识别的

* 有权利就能做一切

* 之前说明的,文件、资源以及特权API操作权限 是 通过 Effective UID来识别的

3. 身份和权利的关系

* 默认情况下 Real UID == Effective UID, 所以使用ps命令输出的 就是 Effective UID

* 我们也可以显示完整的 Effective UID 和Real UID

4. ROOT 用户的特权

* Root 用户, 均是指 Effective UID == ROOT的进程

* 不受任何限制,可以为所欲为

* ROOT进程可以调用setUID 修改自己的Real UID,它也可以把自己的Effective UID改为普通的UID

5. UID的世袭

* 在Linux世界里,为了安全考虑,UID世袭规则: 身份可以世袭,权利不能世袭

* 子进程的 Real UID = Effective UID,  继承 父进程的Real UID

若父进程的Effective UID 与 Real UID 不一样,则不具有父进程的权利

四、文件的setUID -- 文件的setUID标志以及其作用。

1. 平民身份,皇族特权(ROOT权限)  需求及解决

1.1  需求:

* Linux的passwd是一个可执行程序, 用于修改用户的密码

* passwd需要修改多用户的账号文件(该文件仅能ROOT用户可以读写)

* 但是 普通用户 也要修改自己的密码

* passwd虽然 是平民身份(由普通用户启动),但是却需要皇族的权限  ---- 身份 和 权利不同

1.2 解决:

* 临时替身进程的Effective UID, 而维持身份不变(Real UID), 让他能够利用特权,而又不传给子进程

2. Linux的文件的setUID的标志

文件的Owner UID设置为特权用户(如ROOT)

文件面向 Owner UID的群体和操作权限 增加额外的setUID标志

Linux系统保证,任何用户(进程)执行该文件时(Fork一个新的进程来加载该可执行文件),子进程的Real UID仍然继承起父进程的RealUID, Effective UID 却被提升 到特权UID

setUID的前提是可执行文件,其他文件不能setUID

rws,用s替代了x;而且s包含了x

3. chmod设置setUID的方式

chmod 4775 test.txt    4就是特殊的设置方法

chmod 0775 test.txt    0可以清楚该标志

chmod u+s test.txt 也具有相同的效果

chmod u-s test.txt

4. setUID的安全问题

setUID的进程的EUID提升了, RUID没有提升

但是如果该进程为自己正身(将自己的RUID改成了和EUID一样的)了, 它的所有子进程都具有了该特殊权限

passwd没有正身

Android将自己的su 正身了

5. 有RealGID, EffectiveGID, setGID吗

答案是存在

详细分析如下:

以上来自:APUE(《高级UNIX环境编程》)

Unix系统通过进程的有效用户ID和有效用户组ID来决定进程对系统资源的访问权限。

以上这些概念还是比较的抽象,那么下面写一个小的测试程序:

#include #include#include

int main(void)

{

printf("uid=%d, gid=%d, euid=%d, egid=%d", getuid(), getgid(), geteuid(), getegid());//sleep(10);

}

这个程序非常简单没有什么好说的。我们编译这个程序生成test 程序

jiangzhaowei@kitking:~/share/test$ iduid=1000(jiangzhaowei) gid=1000(jiangzhaowei) groups=1000(jiangzhaowei),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),108(lxd),999(docker)

jiangzhaowei@kitking:~/share/test$ ./test

uid=1000, gid=1000, euid=1000, egid=1000

通过id命令看到当前登录用户为jiangzhaowei,uid=1000,gid=1000。通过ls命令我们可以看出test程序没有设置SUID和SGID,所有者是jiangzhaowei,所有组也是jiangzhaowei。执行test我们发现有效用户ID等于实际用户ID(1000),有效用户组ID等于实际用户组ID(1000)。

Linux中的每一个进程都关联有一个用户,也就是对应有一个UID ,如下面test进程,关联用户为“jiangzhaowei”,而jiangzhaowei对应的UID 为1000

jiangzhaowei@kitking:~$ ps -aux

USER PID%CPU %MEM VSZ RSS TTY STAT START TIME COMMANDjiangzh+ 10558 0.0 0.0 4508 744 pts/0 S+ 08:41 0:00 ./test

jiangzh+ 10562 0.0 0.0 38372 3584 pts/1 R+ 08:41 0:00 ps -auxnobody19758 0.0 0.1 401716 8452 ? Sl Oct14 0:07 Passenger ust-router

daemon19853 0.0 2.5 795640 197504 ? Sl Oct14 0:59 Passenger RubyApp: /opt/redmine.org.cn/apps/redmine/htdocs/

进一步说明:

由于每一个用户都对应有一个主用户组,以及若干个补充用户组,因此,每一个进程除了有一个对应的UID之外,还对应有一个主GID,以及若干个Supplementary GIDs。这些EUID和EGID就决定了一个进程所能访问的文件或者所能调用的系统API。例如,在下图中,PID为340的进程一般来说,就只能访问所有者为u0_a19的文件。

一个进程的UID是怎么来的呢?在默认情况下,就等于创建它的进程的UID,也就是它的父进程的UID。Linux的第一个进程是init进程,它是由内核在启动完成后创建的,它的UID是root。然后系统中的所有其它进程都是直接由init进程或者间接由init进程的子进程来创建。所以默认情况下,系统的所有进程的UID都应该是root。但是实际情况并非如此,因为父进程在创建子进程之后,也就是在fork之后,可以调用setuid来改变它的UID。例如,在PC中,init进程启动之后,会先让用户登录。用户登录成功后,就对应有一个shell进程。该shell进程的UID就会被setuid修改为所登录的用户。之后系统中创建的其余进程的UID为所登录的用户。

进程的UID除了来自于父进程之外,还有另外一种途径。上面我们说到,Linux的文件有三种权限,分别是Read、Wirte和Execute。其实还有另外一个种权限,叫做SUID。

一个可执行文件一旦被设置了SUID位,那么当它被一个进程通过exec加载之后,该进程的EUID就会变成该可执行文件的所有者的UID。

与SUID类似,文件还有另外一个称为SGID的权限,不过它描述的是用户组。也就是说,一个可执行文件一旦被设置了EGUID位,么当它被一个进程通过exec加载之后,该进程的主UID就会变成该可执行文件的所有者的主UID。

接下来我使用“gitadmin”用户登录,运行test程序,如下:

jiangzhaowei@kitking:~/share/test$ ll-rwxrwxr-x 1 jiangzhaowei jiangzhaowei 8520 Oct 18 08:40 test*

//gitadmin运行test程序

gitadmin@kitking:/home/jiangzhaowei/share/test$ id

uid=1002(gitadmin) gid=1002(gitadmin) groups=1002(gitadmin)

gitadmin@kitking:/home/jiangzhaowei/share/test$ ./test

uid=1002, gid=1002, euid=1002, egid=1002

我们增加test的SUID/SGID属性,EUID/EGID已经改变为文件所有者的权限。

jiangzhaowei@kitking:~/share/test$ ll-rwsrwsr-x 1 jiangzhaowei jiangzhaowei 8520 Oct 18 08:40 test*

//同样gitadmin再运行test程序,程序已经有了用户jiangzhaowei所取得的所有权限

gitadmin@kitking:/home/jiangzhaowei/share/test$ ./test

uid=1002, gid=1002, euid=1000, egid=1000

linux普通用户id一般是,实际用户ID和有效用户ID (一) *****相关推荐

  1. 16.linux用户和组详解演练,useradd,usermod,chage,userdel,id,su,groups,passwd,shadow,group,gshadow等命令和文件

    前言 本小节会详细介绍用户和组的关系,UID和GID,初始组和附加组,同时详细介绍groups,passwd,shadow,group,gshadow,login.defs,useradd 等文件含义 ...

  2. 10.30 linux和windows互传文件,用户配置文件和密码配置文件,用户组管理,用户管理...

    2019独角兽企业重金招聘Python工程师标准>>> 2.27 linux和windows互传文件 putty不支持  xshell和securecrt支持 如果是centos系统 ...

  3. mysql切换用户命令_linux基础04:linux用户相关的命令有哪些?怎样切换用户?

    通过前面的几节课,我们在windows系统中安装好了linux虚拟机,也通过xshell远程终端连接上了linux虚拟.从今天开始,我们就可以正式开始学习linux的知识了.今天,我们主要介绍的是用户 ...

  4. 在linux中建立一个vim的目录,Linux学习笔记一(目录结构、Vim编辑器、用户管理)...

    1.Linux介绍 linux是一个开源.免费的操做系统,其稳定性.安全性.处理多并发已经获得 业界的承认,目前不少企业级的项目都会部署到Linux/unix系统上. Linux主要的发行版: Ubu ...

  5. linux sudo权限_Linux Sudo 被曝漏洞,可导致用户以 root 权限运行命令

    聚焦源代码安全,网罗国内外最新资讯!编译:奇安信代码卫士团队 Linux 用户要注意了!几乎所有基于 UNIX 和 Linux 的操作系统上安装的核心命令,也是最重要.最强大也最常用的工具 Sudo中 ...

  6. Linux中last的用法及参数,查看登陆系统用户的信息

    1.作用 功能说明:列出目前与过去登入系统的用户相关信息. linux系统中last命令的作用是显示近期用户或终端的登录情况,它的使用权限是所有用户.通过last命令查看该程序的log,管理员可以获知 ...

  7. 查看linux创建了哪些用户组,Linux查看用户属于哪些组/查看用户组下有哪些用户...

    一.关于/etc/group格式的讨论 在说/etc/group格式的时候,网上很多文章都会说是"组名:组密码:组ID:组下用户列表",这说法对了解/etc/group格式是没问题 ...

  8. linux下新增ftp账号,【转】Linux下添加FTP账号和服务器、增加密码和用户,更改FTP目录...

    转自:http://blog.csdn.net/cloudday/article/details/8640234 1. 启动VSFTP服务器 A:cenos下运行:yum  install  vsft ...

  9. Linux入门到精通:第 1 关——创建/删除新用户(第二章:Linux之用户管理)

    第 1 关--创建/删除新用户 任务描述 相关知识 Linux创建用户命令 案例演示 Linux删除用户命令 案例演示 编程要求 评测说明 任务描述 恭喜你已经完成了Linux入门的实训,接下来让我们 ...

  10. linux 用户文件字段解释,0220自学Linux_逻辑理解用户进程权限相关+理解文件内各字段(passwd,shadow,group)(示例代码)...

    11 内核是真正意义上的操作系统 库有动态库也有静态库,Linux的动态库是.so后缀的,也称为共享库 库是不能够独立运行的,只能被调用 Window的动态库是.dll后缀的 我们平时所谓的安装操作系 ...

最新文章

  1. 名人问题 算法 时间复杂度
  2. 在Java中实现单例模式的有效方法是什么? [关闭]
  3. 十六进制字符转二进制字符
  4. 关于面象接口编程的理解
  5. 【数据结构与算法】之深入解析“颜色分类”的求解思路与算法示例
  6. P1101 单词方阵(DFS)
  7. python实现决策树数据直接赋值导入_决策树在python中的数据实现
  8. C语言知识分享:面向对象和面向过程到底是怎么回事?
  9. yum挂在iso文件yum源配置
  10. java——ArrayList中contains()方法中的疑问
  11. 计算机ws2_32dll丢失,电脑显示计算机中丢失ws2-32.dll,怎么办
  12. kali安装zmap
  13. 高考加油别学计算机图片,高考加油图片励志壁纸图片欣赏
  14. 【每日面试】2021北京联通Java一面
  15. 定时打开指定程序软件
  16. 找出n以内最大的质数。python
  17. Android使用的MQTT客户端
  18. 滤波、信号、数字与模拟、金字塔 一看就懂 教程
  19. python 残差网络--ResNeXt (附python代码)
  20. 明亮美丽的霓虹灯标题动画展示Pr预设

热门文章

  1. 异常Exception(Java)
  2. JavaScript:数据的存储
  3. Open3d之网格(Mesh)操作
  4. python中center()函数的用法
  5. VS2017 15.4提供预览版,面向Windows 10秋季更新(FCU)
  6. Linux命令解释之sed
  7. iOS 推送 获取手机设备的 deviceToken
  8. 如何在Ubuntu 13.04, 13.10上安装Sublime Text 3
  9. node.js学习笔记之模拟路由
  10. 【数据结构笔记12】平衡二叉树,AVL树,RR旋转/LL旋转/LR旋转/RL旋转,AVL树插入的代码实现