[代码修订版] Python 踩坑之旅 [进程篇其四] 踩透 uid euid suid gid egid sgid的坑坑洼洼
| 代码示例支持 |
|---|
| 平台: Centos 6.3 |
| Python: 2.7.14 |
| 代码示例: 公众号点击 踩坑之旅菜单 或者 https://github.com/mythmgn/awesome_py_traps |
1.1 踩坑案例
小明是个服务器管理员, 他从老管理员手里接手了一个非常繁琐的运维工作: 短暂授权root 账号给不同的 team 接口人运行备份任务
该运维任务有几个特点:
- 任务需且仅需运行在 root 下
- root 账号只能短暂授权给各个小组
- 通过账号管理平台, 提前申请一段时间的临时密码
- 将临时密码提供给小组接口人
- 时间超时后密码自动变更
- 不同 team 分时使用, 无法并发使用
小明非常烦躁, 为了填上这个坑, 他调研了填坑解法.
1.2 填坑解法
填坑解法满足:
- 短时出借权限
- (在权限范围内)执行该任务时才能使用 root 权限
- 做完任务立即失去 root 权限
- 权限范围必须清晰
- 能做什么
- 能做数据备份
- 不能做什么
- 除了数据备份其他什么都不在 root 权限下做
- 能做什么
具体做法:
利用c/c++程序出借部分 root 权限 (完整代码关注公号点击菜单查看)
- 该c程序限定执行的备份操作为 python 代码 euid_backup.py
int main(int argc, char **argv){
if(0==isRunUnderRoot()){
fprintf(stderr,"does not run under +S attribute. Exiting....\n");
return EXIT_FAILURE;
}
exit(runNewProcess("./", "env python ./euid_backup.py"));
}
- euid_backup.py owner 为 root, 非 root 用户不准更改备份操作内容
为生成的执行文件euid_cp及euid_backup.py 设置root权限借用
sudo rm -f ./euid_cp
sudo gcc euid_cp.c -o euid_cp
# 设置文件owner为root, 非root用户无法更改执行内容
sudo chown root euid_cp euid_backup.py
# 设置a. 非root只读 b. 增加执行权限
sudo chmod 755 euid_cp
# 设置stick bit, 执行euid_cp即可短暂获取root 权限, 执行任务
sudo chmod +s euid_cp
euid_backup.py Python 代码执行具体的备份任务
from __future__ import print_function
import os
import time print('euid is {0}'.format(os.geteuid())) if os.geteuid() == 0:
print('start to copy under root')
print('do some operations here')
time.sleep(2)
print('end copying things')
print('drop privileges from root')
else:
print('non-root, euid {0} will exit'.format(os.geteuid()))
运行试验:
通过 ./euid_cp 执行, 可以在非 root 下执行 root 权限才能执行的备份任务(euid_backup.py)
- 执行环境: Mac 10.14.4 (18E226)

直接执行备份任务(euid_backup.py) 会失败, 没有权限
- 执行环境: 同上

1.3 坑位分析
uid / euid / suid 是什么
- uid 是用户的 userid
- 登陆后, 在不切换用户情况下 uid 一般不变
- euid 是用户的有效 id
- euid 在正常执行情况下一般等于uid
- euid 一般决定了用户对系统中存储介质的access (访问) 权限
- suid (saved uid) 是文件在被访问过程中的短暂切换用户euid的属性设置
- 简单来说, suid让本没有权限的用户可以短暂访问这些资源
- suid 在执行过程中进行了权限切换
- 执行之初, 切换到这个saved uid(文中为 root)
- fork执行过程中, euid == suid
- 执行完成后, euid 在切换回 uid
- uid 是用户的 userid
gid, egid 等同理, [*]uid的判断优先
1.4 技术关键字
- uid euid suid
- gid egid sgid
1.5 坑后思考
为什么本文没有直接对euid_backup.py文件进行设置+s操作, 而是用可执行的c/c++程序做执行器
Linux 系统里的passwd 程序是否也是这个原理? 它跟哪些文件/命令相关
下期坑位预告
进程篇其五之眼花缭乱的进程间通信
Life is short. We use Python.
[代码修订版] Python 踩坑之旅 [进程篇其四] 踩透 uid euid suid gid egid sgid的坑坑洼洼的更多相关文章
- Python 踩坑之旅进程篇其四一次性踩透 uid euid suid gid egid sgid的坑坑洼洼
目录 1.1 踩坑案例 1.2 填坑解法 1.3 坑位分析 1.4 技术关键字 1.5 坑后思考 下期坑位预告 代码示例支持 平台: Centos 6.3 Python: 2.7.14 代码示例: 菜 ...
- Python 踩坑之旅进程篇其三pgid是个什么鬼 (子进程\子孙进程无法kill 退出的解法)
目录 1.1 踩坑案例 1.2 填坑解法 1.3 坑位分析 1.4.1 技术关键字 下期坑位预告 代码示例支持 平台: Centos 6.3 Python: 2.7.14 Github: https: ...
- [代码修订版] Python 踩坑之旅进程篇其五打不开的文件
目录 1.1 踩坑案例 1.2 填坑和分析 1.2.1 从程序优化入手 1.2.2 从资源软硬限入手 1.4.1 技术关键字 下期坑位预告 代码示例支持 平台: Centos 6.3 Python: ...
- Python 踩坑之旅文件系统篇其一文件夹也是个文件
目录 1.1 案例 1.2 分析 1.3 扩展 1.4 技术关键字 下期预告 代码示例支持 平台: Mac OS Python: 2.7.10 代码示例: - wx: 菜单 - Python踩坑指南代 ...
- 美团热修复Robust的踩坑之旅-使用篇
最近需要在项目中使用热修复框架,在这里以美团的Robust为主写一篇文章总结一下学习的过程. 一直认为要学习一个框架的原理,首先需要让他跑起来,从效果反推回去,这样更容易理解. 一.美团Robust的 ...
- Python踩坑之旅其一杀不死的Shell子进程
目录 1.1 踩坑案例 1.2 填坑解法 1.3 坑位分析 1.4 坑后扩展 1.4.1 扩展知识 1.4.1 技术关键字 1.5 填坑总结 1.1 踩坑案例 踩坑的程序是个常驻的Agent类管理进程 ...
- EasyTrader踩坑之旅总结
easytrader是用python写的可以调用主要券商完成自动化炒股的一个软件 ,但我用的是同花顺,在研究过程中,发现同花顺暂时调不通.后来搜索发现thstrade的源码作者说是easytrad ...
- 我的微信小程序入门踩坑之旅
前言 更好的阅读体验请:我的微信小程序入门踩坑之旅 小程序出来也有一段日子了,刚出来时也留意了一下.不过赶上生病,加上公司里也有别的事,主要是自己犯懒,就一直没做.这星期一,赶紧趁着这股热乎劲,也不是 ...
- 微信小程序之mpvue+iview踩坑之旅
因为之前参照微信的原生的文档写过一些小程序的demo,写的过程比较繁琐,后来出了美团的mpvue,可以直接使用vue开发,其他的不作对比,这篇文章记录一下踩坑之旅. 参照mpvue http://mp ...
随机推荐
- codeforces 703D D. Mishka and Interesting sum(树状数组)
题目链接: D. Mishka and Interesting sum time limit per test 3.5 seconds memory limit per test 256 megaby ...
- 「CF779B」「LOJ#10201.」「一本通 6.2 练习 4」Sherlock and His Girlfriend(埃氏筛
题目描述 原题来自:Codeforces Round #400 B. Sherlock 有了一个新女友(这太不像他了!).情人节到了,他想送给女友一些珠宝当做礼物. 他买了 nnn 件珠宝.第 iii ...
- Python文件运行时报TabError: inconsistent use of tabs and spaces in indentation
1. 问题描述 Python文件运行时报TabError: inconsistent use of tabs and spaces in indentation 2. 问题原因 tab 和 space ...
- C 汉字处理
好像有个wchar_t类型的,这里不深究了,只研究char型(1个字符大小)的 1.定义 直接使用char,但每个汉字占据2个字符,所以必须以字符串形式存在 char s[10]; 2.定义时直接赋值 ...
- soap入门篇
摘自:http://blog.csdn.net/erica_1230/article/details/54982081 SOAP的全称是Simple Object Access Protocol,即简 ...
- linux c实现的提取文件名的小程序
/*@author etangyushan *工作中很多时候会和文件名打交道,有时候只需要文件名称,就写了这么一个小程序 *这个函数实现了把一个文件的绝对路径和后缀去除,只留下文件名的功能 * */ ...
- JAVA正则表达式之 Pattern介绍
1.简介: java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. 它包括两个类:Pattern和Matcher. Pattern 一个Pattern是一个正则表 ...
- Laravel框架中使用邮件发送功能
这里是演示的用户注册之后,进行邮件激活的功能. 点击注册之后,系统会自动发送一个份邮件到注册者的邮箱,注册者点击链接激活账号. 先配置laravel中的(.env)文件 MAIL_DRIVER=smt ...
- Gridview 每秒刷新数据
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx. ...
- HDU - 5451 Best Solver(循环节+矩阵快速幂)
Best Solver The so-called best problem solver can easily solve this problem, with his/her childhood ...