代码示例支持
平台: Centos 6.3
Python: 2.7.14
代码示例: 公众号点击 踩坑之旅菜单 或者 https://github.com/mythmgn/awesome_py_traps

1.1 踩坑案例

小明是个服务器管理员, 他从老管理员手里接手了一个非常繁琐的运维工作: 短暂授权root 账号给不同的 team 接口人运行备份任务

该运维任务有几个特点:

  1. 任务需且仅需运行在 root 下

    • root 账号只能短暂授权给各个小组
    • 通过账号管理平台, 提前申请一段时间的临时密码
    • 将临时密码提供给小组接口人
    • 时间超时后密码自动变更
  2. 不同 team 分时使用, 无法并发使用

小明非常烦躁, 为了填上这个坑, 他调研了填坑解法.

1.2 填坑解法

填坑解法满足:

  • 短时出借权限

    • (在权限范围内)执行该任务时才能使用 root 权限
    • 做完任务立即失去 root 权限
  • 权限范围必须清晰
    • 能做什么

      • 能做数据备份
    • 不能做什么
      • 除了数据备份其他什么都不在 root 权限下做

具体做法:

  1. 利用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 用户不准更改备份操作内容
  2. 为生成的执行文件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()))

运行试验:

  1. 通过 ./euid_cp 执行, 可以在非 root 下执行 root 权限才能执行的备份任务(euid_backup.py)

    • 执行环境: Mac 10.14.4 (18E226)
  2. 直接执行备份任务(euid_backup.py) 会失败, 没有权限

    • 执行环境: 同上

1.3 坑位分析

  1. 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
  2. gid, egid 等同理, [*]uid的判断优先

1.4 技术关键字

  • uid euid suid
  • gid egid sgid

1.5 坑后思考

  1. 为什么本文没有直接对euid_backup.py文件进行设置+s操作, 而是用可执行的c/c++程序做执行器

  2. Linux 系统里的passwd 程序是否也是这个原理? 它跟哪些文件/命令相关

下期坑位预告

进程篇其五之眼花缭乱的进程间通信


Life is short. We use Python.

[代码修订版] Python 踩坑之旅 [进程篇其四] 踩透 uid euid suid gid egid sgid的坑坑洼洼的更多相关文章

  1. Python 踩坑之旅进程篇其四一次性踩透 uid euid suid gid egid sgid的坑坑洼洼

    目录 1.1 踩坑案例 1.2 填坑解法 1.3 坑位分析 1.4 技术关键字 1.5 坑后思考 下期坑位预告 代码示例支持 平台: Centos 6.3 Python: 2.7.14 代码示例: 菜 ...

  2. Python 踩坑之旅进程篇其三pgid是个什么鬼 (子进程\子孙进程无法kill 退出的解法)

    目录 1.1 踩坑案例 1.2 填坑解法 1.3 坑位分析 1.4.1 技术关键字 下期坑位预告 代码示例支持 平台: Centos 6.3 Python: 2.7.14 Github: https: ...

  3. [代码修订版] Python 踩坑之旅进程篇其五打不开的文件

    目录 1.1 踩坑案例 1.2 填坑和分析 1.2.1 从程序优化入手 1.2.2 从资源软硬限入手 1.4.1 技术关键字 下期坑位预告 代码示例支持 平台: Centos 6.3 Python: ...

  4. Python 踩坑之旅文件系统篇其一文件夹也是个文件

    目录 1.1 案例 1.2 分析 1.3 扩展 1.4 技术关键字 下期预告 代码示例支持 平台: Mac OS Python: 2.7.10 代码示例: - wx: 菜单 - Python踩坑指南代 ...

  5. 美团热修复Robust的踩坑之旅-使用篇

    最近需要在项目中使用热修复框架,在这里以美团的Robust为主写一篇文章总结一下学习的过程. 一直认为要学习一个框架的原理,首先需要让他跑起来,从效果反推回去,这样更容易理解. 一.美团Robust的 ...

  6. Python踩坑之旅其一杀不死的Shell子进程

    目录 1.1 踩坑案例 1.2 填坑解法 1.3 坑位分析 1.4 坑后扩展 1.4.1 扩展知识 1.4.1 技术关键字 1.5 填坑总结 1.1 踩坑案例 踩坑的程序是个常驻的Agent类管理进程 ...

  7. EasyTrader踩坑之旅总结

    ​ easytrader是用python写的可以调用主要券商完成自动化炒股的一个软件 ,但我用的是同花顺,在研究过程中,发现同花顺暂时调不通.后来搜索发现thstrade的源码作者说是easytrad ...

  8. 我的微信小程序入门踩坑之旅

    前言 更好的阅读体验请:我的微信小程序入门踩坑之旅 小程序出来也有一段日子了,刚出来时也留意了一下.不过赶上生病,加上公司里也有别的事,主要是自己犯懒,就一直没做.这星期一,赶紧趁着这股热乎劲,也不是 ...

  9. 微信小程序之mpvue+iview踩坑之旅

    因为之前参照微信的原生的文档写过一些小程序的demo,写的过程比较繁琐,后来出了美团的mpvue,可以直接使用vue开发,其他的不作对比,这篇文章记录一下踩坑之旅. 参照mpvue http://mp ...

随机推荐

  1. NO0:重新拾起C语言

    因工作所需,重新捡起C语言,之前在学校里有接触过,但现在已经忘的一干二净了,现决定重新开始学习,为工作,为生活. 以<标准 C程序设计 第5版>的课程进行基础学习,同时以另外两本书为辅助, ...

  2. Hover show tips

    像上面这种效果,hover1时显示2,且1和2有一定间距的东东,一般有两种实现办法: 1.用JS,原理:over1时让2显示,out1时开个定时器延迟500ms再消失,over2时清除定时器,out2 ...

  3. hdfs 查看报告--命令(hdfs dfsadmin -report)

    [hadoop@master sbin]$ hdfs dfsadmin -reportConfigured Capacity: 8202977280 (7.64 GB)Present Capacity ...

  4. UOJ_407_【IOI2018】狼人

    http://uoj.ac/problem/407 分析: 分别建立最小/最大kruskal重构树. 每次询问给出的两个点能走到的部分分别对应两棵树\(dfs\)序的一段区间. 转化成判断矩形中是否有 ...

  5. BZOJ_2813_奇妙的Fibonacci_线性筛

    BZOJ_2813_奇妙的Fibonacci_线性筛 Description Fibonacci数列是这样一个数列: F1 = 1, F2 = 1, F3 = 2 . . . Fi = Fi-1 + ...

  6. 谈"零缺陷"

    在刚参加工作初期的一次关于质量的培训中,第一次听到"零缺陷"这个词懵懵懂懂,当成一道概念题给记下.今年重读<质量免费>时对与零缺陷的部分始终心存疑虑,最近读<第一 ...

  7. 四维偏序 CDQ套CDQ

    对CDQ深一步的理解 昨天做了一道CDQ,看了一堆CDQ可做的题,今天又做了一道四维偏序 感觉对CDQ的理解又深了一点,故来写一写现在自己对于CDQ的理解 CDQ其实就是实现了这样的一个问题的转化: ...

  8. session.write类型引发的思考---Mina Session.write流程探索.doc--zhengli

    基于Mina开发网络通信程序,在传感器数据接入领域应用的很广泛,今天我无意中发现一个问题,那就是我在前端session.write(msg)数据出去之后,却没有经过Filter的Encoder方法,同 ...

  9. SpringMVC之一:SpringMVC原理

    Spring MVC工作流程图   图一   图二  关键组件: DispatcherServlet:前端控制器,与大多数基于Java的Web框架一样, Spring MVC所有的请求都会通过一个前端 ...

  10. node.js setup wizard ended prematurely Win7安装nodejs失败解决方法

    笔记本win7在nodejs官方网站下载.msi文件安装,安装到一半的时候,进度条提示:roll back,because of a error.node.JS setup wizard ended ...