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

进程权限

命令 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. Oracle-Rman备份全解析

    RMAN备份数据库物理文件到备份集(backupset)中.在创建备份集时,仅备份已经使用的数据库(不备份空闲的数据块),而且还可以采用压缩功能. RMAN恢复时指当数据库出现介质失败时,使用RMAN ...

  2. Selenium-ActionChains动作链(针对鼠标、滚轮等操作

    https://www.selenium.dev/documentation/webdriver/actions_api/ 注意:对于滚轮的操作,只支持chrome浏览器,且selenium版本在4. ...

  3. python tkinter 使用(六)

    python tkinter 使用(六) 本文主要讲述tkinter中进度条的使用. 1:确定的进度条 progressbar = tkinter.ttk.Progressbar(root, mode ...

  4. 为什么要重写equals()?

    为什么要重写equals()? Equals和 == 的区别: ==:是个运算符, 判断是否相等,基本数据类型进行判断 也可判断两个对象相等,比较两个对象的哈希码值 Equals:是个Object类的 ...

  5. MS17-010(永恒之蓝)漏洞分析与复现

    一.漏洞简介1.永恒之蓝介绍:永恒之蓝漏洞(MS17-010),它的爆发源于 WannaCry 勒索病毒的诞生,该病毒是不法分子利用NSA(National Security Agency,美国国家安 ...

  6. IDEA将JavaFx打包为exe Win+Mac+Linux多平台分发等等

    IDEA将JavaFx打包为exe Win+Mac+Linux多平台分发等等 前面介绍到了用packr打包javafx17为exe多平台分发,比较复杂,这篇则介绍用idea直接打包exe,比较简单,但 ...

  7. Azure Data Factory(十一)Data Flow 的使用解析

    一,引言 上一篇文字,我们初步对 Data Flow 有个简单的了解,也就是说可以使用 Data Flow 完成一些复杂的逻辑,如,数据计算,数据筛选,数据清洗,数据整合等操作,那我们今天就结合 Da ...

  8. DevOps常用工具全家桶,实现高效运维和交付

    DevOps常用工具全家桶,实现高效运维和交付 1.DevOps发展 DevOps发展背景: 随着互联网技术的快速发展,软件开发和运维的挑战也日益增加.传统的软件开发和运维模式往往存在分离.效率低下. ...

  9. C#数据结构与算法系列(十七):时间复杂度(下)

    1.常见的时间复杂度 常数阶:O(1) 对数阶:O(log2n) 线性阶:O(n) 线性对数阶:O(nlog2n) 平方阶:O(n^2) 立方阶:O(n^3) k次方阶:O(2^n) 常见的算法时间复 ...

  10. 华为云GaussDB圈层活动走进香港,以技术创新构筑金融政企数智发展基石

    摘要:近日,华为云GaussDB圈层活动在中国·香港如期举办,活动聚集了22家香港金融政企客户和合作伙伴. 本文分享自华为云社区<华为云GaussDB圈层活动走进香港,赋能金融政企数字化转型&g ...