sudo是Linux上的常用命令,其目的是为了给普通用户提升操作权限,完成一些需要root权限才能完成的任务。那么sudo是如何提升权限的呢?

linux操作系统有着严格、灵活的权限访问控制。主要体现在两方面:

1、文件权限 2、进程权限

文件权限

文件权限包括五种:

r:可读取文件内容或目录结构
w:可修改文件的内容或目录的结构(但不包括删除)
x:文件可被系统执行或目录可被作文工作目录
s:文件在执行阶段具有文件所有者的权限
t:使一个目录既能够让任何用户写入文档,又不让用户删除这个目录下他人的文档

一个文件拥有三组权限,所有者权限、所属组权限、其他人权限

进程权限

进程就是用户访问计算机资源的代理,用户执行的操作其实是带有用户身份信息的进程执行的操作。这里介绍两个最重要的进程权限id

reaal user id(ruid):执行进程者的 user id,一般情况下就是用户登录时的 user id effective user id(euid):决定进程是否对某个文件有操作权限,默认为ruid

在文件权限和进程权限id里,s文件权限和euid权限id是sudo实现提升权限的根本。一个进程是否能操作某个文件,取决于进程的euid是否拥有这个文件的相应权限,而不是ruid。也就是说,如果想要让进程获得某个用户的权限,只要把进程的euid设置为该用户id就可以了。在具体一点,我们想要让进程拥有root用户的权限,我只要想办法把进程的euid设置成root的id:0就可以了。

Linux提供了一个seteuid的函数,可以更改进程的euid。函数声明在头文件里。

int seteuid(uid_t euid);

但是,如果一个进程本身没有root权限,也就是说euid不是0,是无法通过调用seteuid将进程的权限提升的,调用seteuid会出现错误。 那该怎么把进程的euid该为root的id:0呢?那就是通过s权限。

如果一个文件拥有x权限,表示这个文件可以被执行。shell执行命令或程序的时候,先fork一个进程,再通过exec函数族执行这个命令或程序,这样的话,执行这个文件的进程的ruid和euid就是当前登入shell的用户id。

当这个文件拥有x权限和s权限时,在shell进行fork后调动exec函数族执行这个文件的时候,这个进程的euid将被系统更改为这个文件的拥有者id。

比如,一个文件的拥有者为user_1,权限为rwsr-xr-x,那么你用user_2的文件执行他的时候,执行这个文件的进程的ruid为user_2的id,euid为user_1的id。

创建一个main.c文件,并写入如下代码:

#include <stdio.h>
#include <unistd.h>int main(int argc, char* argv[])
{printf("ruid: %d\n",getuid());printf("euid: %d\n",geteuid());return 0;
}

gcc ./main.c -o ./main

编译运行,结果如下:

ruid: 1000
euid: 1000

通过chmod和chown为文件更改拥有者和添加s权限

sudo chown root ./main
sudo chmod +s ./main

再次运行,结果如下:

ruid: 1000
euid: 0

此时由于文件的s权限,euid已经变为了root的id:0

将代码修改如下:

#include <stdio.h>
#include <unistd.h>int maind(int argc, char* argv[])
{printf("ruid: %d\n",getuid());printf("euid: %d\n",geteuid());if(execvp(argv[1], argv+1) == -1){perror("execvp error");};return 0;
}

gcc ./main.c --o main,编译后,执行

sudo chown root ./main
sudo chmod +s ./main
./main apt update

可以看到,已经成功运行apt并进行了软件列表的更新。

查看sudo的权限

ls -al /usr/bin/sudo

输出如下

-rwsr-xr-x 1 root root

可以看到,sudo就是一个拥有者为root且拥有s权限的可执行文件。

当然sudo的实现要比这复杂的很多,比如sudo通过检查配置文件,来决定哪些用户可以使用sudo,为了安全考虑sudo还要求验证ruid的用户密码等。

linux sudo 实现原理相关推荐

  1. 【Linux】Linux的挂载原理 |MOUNT|挂载NAS|自动挂载

    目录 零.常用挂载命令 一.Linux的挂载原理 1.概念 2.举例 3.补充 4.LINUX文件结构和WINDOWS的不同 5.挂载文件系统 6.mount结构与原理 7.mount 和umount ...

  2. Linux 快照 (snapshot) 原理与实践(二) 快照功能实践

    文章目录 0. 概要 1. 准备演示数据 2. 创建 snapshot-origin 目标 3. 创建 snapshot 目标 4. 验证 COW 操作 4.1 第一次写数据 4.2 第二次写数据 5 ...

  3. Linux 企业级安全原理和防范技巧

    Linux 企业级安全原理和防范技巧 1. 企业级Linux系统防护概述 1.1 企业级Linux系统安全威胁 1.2 企业级Linux系统安全立体式防范体系 1.2.1 Linux文件系统访问安全 ...

  4. linux sudo命令

    Linux sudo命令 正在上传-重新上传取消​ Linux 命令大全 Linux sudo命令以系统管理者的身份执行指令,也就是说,经由 sudo 所执行的指令就好像是 root 亲自执行. 使用 ...

  5. [转帖]linux下的X server:linux图形界面原理

    linux下的X server:linux图形界面原理 https://www.cnblogs.com/liangxiaofeng/p/5034912.html linux下的X server:lin ...

  6. linux下的X server:linux图形界面原理

    linux下的X server:linux图形界面原理 Moblin Core是在Gnome Mobile的平台上建立.我以前玩Linux,提交的都和图像没有关系,连Xwindows都不用启动,开机后 ...

  7. linux系统调用的封装格式,ARM Linux系统调用的原理

    ARM Linux系统调用的原理ARM Linux系统调用的原理 操作系统为在用户态运行的进程与硬件设备进行交互提供了一组接口.在应用程序和硬件之间设置一个额外层具有很多优点.首先,这使得编程更加容易 ...

  8. Linux 输入子系统原理理解(原创)

    linux    输入子系统原理理解(原创) 以前学了单独的按键设备驱动以及鼠标驱动,实际上,在linux中实现这些设备驱动,有一种更为推荐的方法,就是input输入子系统.平常我们的按键,触摸屏,鼠 ...

  9. linux用户的vim命令无效,Linux SUDO Bug可让您以root用户身份运行命令,大多数命令不受影响...

    已发现Linux sudo命令中的漏洞,该漏洞可能允许非特权用户以root用户身份执行命令.幸运的是,此漏洞仅在非标准配置中有效,并且大多数Linux服务器不受影响. 在获得此漏洞之前,重要的是要掌握 ...

最新文章

  1. 【220】◀▶ IDL 数组操作函数说明
  2. python 计算最后一个单词的长度
  3. HTML5 速查列表
  4. mysql索引需要了解的几个注意
  5. Java 项目开发及管理常用工具收集
  6. 秒速五厘米男主php,秒速五厘米最后男主从事的是什么工作?
  7. python 模块路径搜索_Python模块搜索路径问题
  8. keycloak中文使用文档_基于DOCKER安装配置keycloak
  9. Linux排查java程序CPU占用过高问题
  10. 文本分类的python实现-基于Xgboost算法
  11. Towards Fully 8-bit Integer Inference for the Transformer Model
  12. 保护隐私型浏览器Tor发布安卓试用版
  13. linux iozone测试工具,iozone命令 – 进行linux下的硬盘性能测试
  14. win7右键没有新建文本文档怎么办
  15. Windows常见基本进程三:dumprep or dumprep进程(Dump Reporting Tool启动项)
  16. windows电脑提醒功能,定时打卡
  17. 2018年博客之星评选,No 138号“铭毅天下”需要您宝贵的一票,万分感谢!
  18. 信而泰测试仪之 TeleATT软件 模拟 路由性能测试
  19. 2、简单的onclick点击事件
  20. TORCH.TRIU

热门文章

  1. Git 分布式版本控制系统
  2. 好程序员web前端分享js剪切板Clipboard.js 使用
  3. 转:Object-Runtime的基本数据类型
  4. 【斗医】【13】Web应用开发20天
  5. 关于睡眠你不可不知的十件事
  6. PLMN概念和应用设置
  7. rhel6.0配置rsyslog传送日志到远程主机
  8. 以后所有内容均以摘要方式发布
  9. 使用 flex 实现 5 种常用布局
  10. CentOS下安装JDK的三种方法