程序存储在硬盘中,需要执行的时候被加载到内存里,内存中的程序以进程的方式运行,进程会根据程序的内容去做读写文件,执行指令等操作。
文件/指令等都有自己的执行权限,符合权限的才能被执行。相应的,进程也需要有这些权限才能执行相应的操作。

进程权限

命令 cat /proc/<PID>/status | egrep "Uid|Gid" 查看进程的权限:
[root@lianhua lib]$ cat /proc/37220/status | egrep "Uid|Gid"
Uid: 1004 1004 1004 1004
Gid: 1007 1007 1007 1007
以第一行为例,从左到右分别表示进程的 real user id, effective user id,saved set user id 和 filesystem UID。
 
各 id 的意义如下:
read user id: 进程执行者 id,从父进程那里继承来的 user id。
 
effective user id: 进程执行的实际 id,通过这个 id 验证进程是否有文件的访问权限。如果设置了 SUID 则进程执行时的 effective user id 会成为执行文件/程序的 owner id,这时候 effective user id 和 real user id 是不一样的。比如,passwd 命令(只有 root 才能执行)设置了 SUID,如果进程以 1004 的身份去执行 passwd, effective user id 会成为 root 的 id:
[robot@lianhua ~]$ ll /bin/passwd
-rwsr-xr-x. 1 root root 27832 Jan 30 2014 /bin/passwd
[robot@lianhua ~]$ passwd
Changing password for user robot.
Changing password for robot.
(current) UNIX password: [root@lianhua ~]$ ps -lA | grep passwd
4 S 0 38063 37943 0 80 0 - 47201 wait_w pts/15 00:00:00 passwd
[root@lianhua ~]$ cat /proc/38063/status | egrep "Uid|Gid"
Uid: 1004 0 0 0
Gid: 1007 1007 1007 1007
 
saved set user id: saved set user id 相当于是一个 buffer,在 exec 函数启动之后,它会拷贝 effective user id 位的信息覆盖自己。所以从上面例子看出 saved user id 也随之改成了 root 的 id 0。
 

程序实现

通过一个简单的小例子加深进程权限的印象。
写一个 copy.sh 脚本,它做的事情是拷贝一个 root 权限的文件到另一个目录,然后更改这个文件的属性:
[root@lianhua lib]$ cat copy.sh
#!/bin/bash sleep 10 cp /home_local/robot/systemd/tmp.log /home_local/robot/systemd/lib/
chown test /home_local/robot/systemd/lib/tmp.log
rm -rf /home_local/robot/systemd/lib/tmp.log sleep 10
 
写个服务 copy.service 将这个脚本添加到服务中,并且更改服务中执行脚本的用户(systemd Drop-in 的方式更改)为 robot:
[root@lianhua lib]$ systemctl cat copy.service
# /usr/lib/systemd/system/copy.service
[Unit]
Description=a test copy demo for process conflict handle
Documentation=man:systemd.unit(8) [Service]
Type=simple
ExecStart=/bin/bash /home_local/robot/systemd/lib/copy.sh
Restart=on-failure # /usr/lib/systemd/system/copy.service.d/app.conf
[Service]
User=
User=robot
 
启动 copy.service ,查看进程权限 id:
[root@lianhua ~]$ systemctl status copy.service
● copy.service - a test copy demo for process conflict handle
Loaded: loaded (/usr/lib/systemd/system/copy.service; static; vendor preset: disabled)
Drop-In: /usr/lib/systemd/system/copy.service.d
└─app.conf
Active: activating (start) since Sun 2020-05-10 16:24:40 CST; 7s ago
Docs: man:systemd.unit(8)
Control: 40081 (bash)
Memory: 432.0K
CGroup: /system.slice/copy.service
├─40081 /bin/bash /home_local/robot/systemd/lib/copy.sh
└─40083 sleep 10
May 10 16:33:52 lianhua systemd[1]: Starting a test copy demo for process conflict handle...
May 10 16:34:02 lianhua bash[40767]: chown: changing ownership of ‘/home_local/robot/systemd/lib/tmp.log’: Opera…ermitted [root@lianhua ~]$ cat /proc/40081/status| egrep "Uid|Gid"
Uid: 1004 1004 1004 1004
Gid: 1007 1007 1007 1007
[root@lianhua ~]$ ps -lAf | grep copy.service
4 S root 40075 32280 0 80 0 - 33707 poll_s 16:24 pts/15 00:00:00 systemctl restart copy.service
0 S root 40130 32507 0 80 0 - 28179 pipe_w 16:25 pts/16 00:00:00 grep --color=auto copy.service
[root@lianhua ~]$ ps -lAf | grep 40081
4 S robot 40081 1 0 80 0 - 28296 do_wai 16:24 ? 00:00:00 /bin/bash /home_local/robot/systemd/lib/copy.sh
0 S robot 40098 40081 0 80 0 - 26990 hrtime 16:24 ? 00:00:00 sleep 10 [root@lianhua lib]$ ll
total 4
-rw-r--r-- 1 root root 197 May 10 16:24 copy.sh
-rw-r--r-- 1 robot robot 0 May 10 16:26 tmp.log
[root@lianhua lib]$ cd ..
[root@lianhua systemd]$ ll
total 0
drwxrwxrwx 2 root root 6 May 7 11:17 bin
drwxrwxrwx 2 root root 36 May 10 16:24 lib
-rw-r--r-- 1 root root 0 May 7 11:17 tmp.log
 
从上述结果可以看出:
1. systemd 以 root 身份执行 copy.service ,它的父进程是 bash 进程 32280。
2. systemd 以 robot 身份执行 copy.sh 脚本,默认 systemd 以 root 身份去执行,这里添加了 Drop-in 文件,使得 systemd 去掉 root 而以 robot 身份去执行该脚本。进程 id 是 40081,它的父进程是 id 为 1 的 systemd 进程。
3. 执行 copy.sh 脚本会产生一个 40081 的进程来执行脚本里的内容,它的 Uid/Gid 分别是 1004(robot 用户的 Uid) 和 1007(robot 用户的 Gid)。
4. 进程在执行 cp 过程时,会更改原本权限为 root/root 的 tmp.log 文件为自己的 Uid/Gid 对应的用户身份 robot/robot。
5. 脚本中使用的 chown 命令并未设置 SUID,所以进程 40081 执行 chown 会报错,显示权限不允许。
6. sleep 命令对于用户 robot 来说时可以执行的,内核以 fork and exec 的方式执行它,产生了一个 40098 的进程,它的父进程是 40081,且执行的用户身份是继承自父进程的。
 

SUID and SGID

针对上述第五点,进程 40081 没办法使用 chown 命令,这里简单介绍 SUID 以及 SGID,再手动更改 chown 的 SUID 使得进程可以执行它。
 
SUID:
  • SUID 仅对二进程程序有效;
  • 执行者对于该程序需要有 x 的可执行权限;
  • 执行者将执行程序时将取得该程序所有者的权限;
  • 执行者取得该程序的权限仅在运行过程 (run-time) 中有效;
 
SGID 也是类似的,不介绍了。
 
查看 chown 的权限:
[root@lianhua ~]$ which chown
/usr/bin/chown
[root@lianhua ~]$ ll /usr/bin/chown
-rwxr-xr-x. 1 root root 62904 Dec 4 2017 /usr/bin/chown
 
更改 chown 使它具有 SUID 权限:
[root@lianhua ~]$ chmod 4755 /usr/bin/chown
[root@lianhua ~]$ ll /usr/bin/chown
-rwsr-xr-x. 1 root root 62904 Dec 4 2017 /usr/bin/chown
chmod 执行的第一个参数表示设置 SUID/SGID/SBIT,其中 4 表示 SUID,2 表示 SGID,1表示 SBIT。
 
以 robot 用户执行 chown 命令:
[root@lianhua ~]$ su - robot
[robot@lianhua ~]$ ll /home_local/robot/systemd/lib/tmp.log
-rw-r--r-- 1 robot robot 0 May 10 17:14 /home_local/robot/systemd/lib/tmp.log
[robot@lianhua ~]$ chown test /home_local/robot/systemd/lib/tmp.log
[robot@lianhua ~]$ ll /home_local/robot/systemd/lib/tmp.log
-rw-r--r-- 1 test robot 0 May 10 17:14 /home_local/robot/systemd/lib/tmp.log [root@lianhua lib]$ systemctl status copy.service
● copy.service - a test copy demo for process conflict handle
Loaded: loaded (/usr/lib/systemd/system/copy.service; static; vendor preset: disabled)
Drop-In: /usr/lib/systemd/system/copy.service.d
└─app.conf
Active: inactive (dead)
Docs: man:systemd.unit(8) May 10 17:31:03 lianhua systemd[1]: Starting a test copy demo for process conflict handle...
May 10 17:31:23 lianhua systemd[1]: Started a test copy demo for process conflict handle.
 
robot 用户可以执行 chown 命令,服务 copy.service 顺利执行。
 
 
 
(完)
 

每天学五分钟 Liunx 0111 | 服务篇:进程权限的更多相关文章

  1. 五分钟学Java:如何才能学好Java Web里这么多的技术

    原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 系列文章介绍 本文是<五分钟学Java>系列文章的一篇 本系列文章主要围绕Java程序员必须掌握的核心技能,结合我个人三年 ...

  2. 如何从40亿整数中找到不存在的一个 webservice Asp.Net Core 轻松学-10分钟使用EFCore连接MSSQL数据库 WPF实战案例-打印 RabbitMQ与.net core(五) topic类型 与 headers类型 的Exchange

    如何从40亿整数中找到不存在的一个 前言 给定一个最多包含40亿个随机排列的32位的顺序整数的顺序文件,找出一个不在文件中的32位整数.(在文件中至少确实一个这样的数-为什么?).在具有足够内存的情况 ...

  3. 零元学Expression Blend 4 - Chapter 42 五分钟快速完成扇形变圆形动画

    原文:零元学Expression Blend 4 - Chapter 42 五分钟快速完成扇形变圆形动画 零元学Expression Blend 4 - Chapter 42 五分钟快速完成扇形变圆形 ...

  4. 五分钟给你的 gRPC服务 加上 HTTP 接口

    gRPC 服务要加 HTTP 接口? go-zero 给大家带来极简的 RESTful 和 gRPC 服务开发体验的同时,社区又给我们提出了新的期望: 我想只写一次代码 既要 gRPC 接口 也要 H ...

  5. [分享] 史上最简单的封装教程,五分钟学会封装系统(以封装Windows 7为例)

    [分享] 史上最简单的封装教程,五分钟学会封装系统(以封装Windows 7为例) 踏雁寻花 发表于 2015-8-23 23:31:28 https://www.itsk.com/thread-35 ...

  6. (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  7. 《sed的流艺术之一》-linux命令五分钟系列之二十一

    本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket. 为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. ...

  8. GC算法精解(五分钟让你彻底明白标记/清除算法)

    GC算法精解(五分钟让你彻底明白标记/清除算法) 相信不少猿友看到标题就认为LZ是标题党了,不过既然您已经被LZ忽悠进来了,那就好好的享受一顿算法大餐吧.不过LZ丑话说前面哦,这篇文章应该能让各位彻底 ...

  9. zookeeper-架构设计与角色分工-《每日五分钟搞定大数据》

    本篇文章阅读时间5分钟左右 点击看<每日五分钟搞定大数据>完整思维导图   zookeeper作为一个分布式协调系统,很多组件都会依赖它,那么此时它的可用性就非常重要了,那么保证可用性的同 ...

  10. zookeeper核心-zab协议-《每日五分钟搞定大数据》

    上篇文章<paxos与一致性>说到zab是在paxos的基础上做了重要的改造,解决了一系列的问题,这一篇我们就来说下这个zab. zab协议的全称是ZooKeeper Atomic Bro ...

随机推荐

  1. Shell下处理JSON数据工具向导

    目录 下载离线安装包 安装 源码包安装 选项及含义 JQ 程序代码演示在线平台 JQ 语法 基本过滤器 身份运算符 --- . 标识符-索引 --- .foo`, `.foo.bar 对象索引 --- ...

  2. 数字孪生系统融合GIS系统能够在洪涝灾害防治上带来什么帮助?

    数字孪生技术与GIS系统的融合,为防治洪涝灾害方式带来了巨大的改变.这种整合的力量超越了过去单一技术的局限,为防洪抗灾工作提供了更全面.更准确的决策支持和应急响应能力. 在过去,防洪抗灾工作主要依赖于 ...

  3. 【scikit-learn基础】--『监督学习』之 LASSO回归

    LASSO(Least Absolute Shrinkage and Selection Operator)回归模型一般都是用英文缩写表示,硬要翻译的话,可翻译为 最小绝对收缩和选择算子. 它是一种线 ...

  4. JS的对象

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  5. OpenGL纹理转换谜团:纹理写入FRAMEBUFFER后的镜像现象

    在OpenGL中,最近将一个 GL_TEXTURE_2D 纹理写入到 GL_FRAMEBUFFER ,然后从GL_FRAMEBUFFER读取为GL_TEXTURE_2D纹理后,发现GL_TEXTURE ...

  6. 如何使用.NET在2.2秒内处理10亿行数据(1brc挑战)

    译者注 在上周我就关注到了在github上有1brc这样一个挑战,当时看到了由Victor Baybekov提交了.NET下最快的实现,当时计划抽时间写一篇文章解析他的代码实现,今天突然看到作者自己写 ...

  7. 一图看懂CodeArts Release三大特性

    本文分享自华为云社区<一图看懂CodeArts Release三大特性,带你玩转发布管理服务>,作者:华为云PaaS服务小智. 华为云发布管理服务Codearts Release,是面向开 ...

  8. 重磅更新!Sermant 1.2.0 release版本新特性速览

    本文分享自华为云社区<重磅更新!Sermant 1.2.0 release版本新特性速览>,作者:华为云开源. 10月,Sermant社区正式发布了1.2.0 release版本,距离上一 ...

  9. 拥抱Serverless释放生产力,探索华为云Serverless车联网最佳实践

    华为云Serverless车联网场景解决方案,以FunctionGraph为核心的Serverless化组合方案,使用FunctionGraph.OBS.DIS等技术,可以实现架构的灵活扩展,在出行高 ...

  10. Volcano 监控设计解读,一看就懂

    摘要:Volcano 方便AI,大数据,基因,渲染等诸多行业通用计算框架介入,提供高性能任务调度引擎,高性能异构芯片管理,高性能任务运行管理等能力. Volcano 是一个 Kubernetes 云原 ...