0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux用户身份与进程权限详解

马哥Linux运维 来源:博客园sparkdev 2024-10-23 11:41 次阅读

在学习 Linux 系统权限相关的主题时,我们首先关注的基本都是文件的 ugo 权限。ugo 权限信息是文件的属性,它指明了用户与文件之间的关系。但是真正操作文件的却是进程,也就是说用户所拥有的文件访问权限是通过进程来体现的。本文主要介绍进程的权限,并通过示例解释用户身份与进程权限之间的关系。说明:本文的演示环境为 ubuntu 16.04。

基本概念

用户
对于支持多任务的 Linux 系统来说,用户就是获取资源的凭证。

权限
权限用来控制用户对计算机资源(CPU、内存、文件等)的访问,一般会分为认证和授权两步。比如用户先经过认证机制(authentication)登录系统,然后由授权系统(authorization)对用户的操作进行授权。

进程
进程是任何支持多道程序设计的操作系统中的基本概念。通常把进程定义为程序执行时的一个实例。因此,如果有 10 个用户同时运行 vi,就会有 10 个独立的进程(尽管它们共享同一份可执行代码)。
实际上,是进程在帮助我们完成各种任务。进程就是用户访问计算机资源的代理,用户执行的操作其实是带有用户身份信息的进程执行的操作。

进程权限
既然是进程在为用户执行具体的操作,那么当用户要访问系统的资源时就必须给进程赋予权限。也就是说进程必须携带发起这个进程的用户的身份信息才能够进行合法的操作。

从登陆过程观察进程携带的用户身份信息

在 Linux 系统启动后,init 系统会 fork 出子进程执行 /sbin/getty 程序等待用户登录。当用户进行登录操作时,该子进程通过 exec 函数开始执行 /bin/login 程序(此时该进程已经变成了 login 进程)。由 login 进程验证我们的用户名和密码并查询 /etc/passwd 和 /etc/shadow 确定其合法性。如果是合法的用户,该进程再次通过 exec 函数执行用户的默认 shell 程序,此时的 login 进程就变成了 shell 进程(笔者机器上是 bash 进程)。并且该 shell 进程的有效身份被设置成为该用户的身份,之后 fork 此 shell 进程的子进程都会继承该有效身份。我们可以通过下图来理解用户从 tty 登录系统的过程(此图来自互联网):

e1b32790-9081-11ef-a511-92fbcf53809c.png

上图描述了 init 进程、getty 进程、login 进程和 shell 进程的交互。
简单点说就是:用户登录后, shell 进程的有效用户就是该用户。下面我们来了解下进程的用户信息。

进程的 real user id、effective user id 和 saved set user id

通过 cat /proc/status 命令,我们可以查看到进程所属的用户和组相关的信息:

e1cf933a-9081-11ef-a511-92fbcf53809c.png

通过 man proc 可以查询到第一行的四个数字分别是 real user id, effective user id, saved set user id 和 filesystem UID,第二行则是对应的组 ID。这里我们只介绍第一行中的前三个 ID,即 real user id, effective user id 和 saved set user id。

real user id
real user id 是执行进程者的 user id,一般情况下就是用户登录时的 user id。子进程的 real user id 从父进继承。通常这个是不更改的,也不需要更改。比如我以用户 nick 登录 Linux 系统,我接下来运行的所有命令的进程的 real user id 都是 nick 的 user id。

effective user id
如果要判断一个进程是否对某个文件有操作权限,验证的是进程的 effective user id,而不是 real user id。
通常我们是不建议直接使用 root 用户进行操作的,但是在很多情况下,程序可能需要特殊的权限。比如 passwd 程序需要 root 权限才能够为普通用户修改密码,一些 services 程序的操作也经常需要特殊的权限。为此,Linux 中设计了一些特殊的权限,请参考《Linux 特殊权限 SUID,SGID,SBIT》一文。这里我们以 passwd 程序为例,为二进制可执行文件 /usr/bin/passwd 设置 set-user-id bit=ON,这个可执行文件被用 exec 启动之后的进程的 effective user id 就是这个可执行文件的 owner id,而并非父进程的 real user id。如果 set-user-id bit=OFF 的时候,这个被 exec 起来的进程的 effective user id 应该是等于进程的 user id 的。所以,effective user id 存在的意义在于,它可能和 real user id 不同。

saved set user id
saved set user id 相当于是一个 buffer,在 exec 函数启动之后,它会拷贝 effective user id 位的信息覆盖自己。对于非 root 用户来说,可以在未来使用 setuid() 函数将 effective user id 设置成为 real user id 或 saved set user id 中的任何一个。但是不允许非 root 用户用 setuid() 函数把 effective user id 设置成为任何第三个 user id。
对于 root 用户来说,调用 setuid() 的时候,将会设置所有的这三个 user id。

从总体上来看,进程中 real user id, effective user id 和 saved set user id 的设计是为了让 unprivilege user 可以获得两种不同的权限。同时我们也可以得出下面的结论:
Linux 系统通过进程的有效用户 ID(effective user id) 和有效用户组 ID(effective group id) 来决定进程对系统资源的访问权限。

其实我们通过 ps aux 查看的结果中,第一列显示的就是进程的 effective user:

e1dafd2e-9081-11ef-a511-92fbcf53809c.png

Shell 中外部命令的执行方式

在 shell 中执行的命令分为内部命令和外部命令两种。

内部命令:内建的,相当于 shell 的子函数

外部命令:在文件系统的某个路径下的一个可执行文件

外部命令的执行过程如下:

Shell 通过 fork() 函数建立一个新的子进程,新的子进程为当前 shell 进程的一个副本。

在新的进程里,从 PATH 变量所列出的目录中寻找指定的命令程序。当命令名称包含有斜杠(/)符号时,将略过路径查找步骤。

在新的进程里,通过 exec 系列函数,以所找到的新程序替换 shell 程序并执行。

子进程退出后,最初的 shell 会接着从终端读取并执行下一条命令。

我们通过下面的例子来理解在 shell 中执行外部命令的过程,例子很简单就是通过 cat 命令查看一个文本文件 test.log:

$ cat test.log

我们先来检查一下当前用户以及相关文件的权限:

e1f88b14-9081-11ef-a511-92fbcf53809c.png

当前用户 nick 的 real user id 为 1000,/bin/cat 文件的所有者为 root,但是所有人都有执行权限,test.log 文件的所有者为 nick。我们结合下图来介绍 cat test.log 命令的执行过程:

e21584bc-9081-11ef-a511-92fbcf53809c.png

当我们在 shell 中执行一个外部程序的时候,默认情况下进程的 effective user ID 等于 real user ID,进程的 effective group ID 等于 real group ID(接下来的介绍中省略 group ID)。当我们以用户 nick 登录系统,并在 bash 中键入 cat test.log 命令并回车后。Bash 先通过 fork() 建立一个新的子进程,这个新的子进程是当前 bash 进程的一个副本。新的进程在 PATH 变量指定的路径中搜索 cat 程序,找到 /bin/cat 程序后检查其权限。/bin/cat 程序的所有者为 root,但是其他人具有读和执行的权限,所以新进程可以通过 exec 函数用 cat 程序的代码段替换当前进程中的代码段(把 /bin/cat 程序加载到了内存中,此时的进程已经变成了 cat 进程,cat 进程会从 _start 函数开始执行)。由于 cat 进程是由用户 nick 启动的,所以 cat 进程的 effective user ID 是 1000(nick)。同时 cat 进程的 effective user ID 和 test.log 文件的 owner ID 相同(都是 1000),所以 cat 进程拥有对此文件的 rw- 权限,那么顺理成章地就可以读写 test.log 文件的内容了。

下面我们演示一个通过设置特殊权限 set uid ID 改变进程 effective user ID 的例子。
创建文件 root.log,权限为 640,此时只有 root 有权限读写该文件的内容,用户 nick 连读取该文件的权限都没有:

e22b8a1e-9081-11ef-a511-92fbcf53809c.png

然后通过设置特殊权限 set uid ID 让运行 cat 程序的进程具有 root 权限:

$ sudo chmod 4755 /bin/cat 

e243c6c4-9081-11ef-a511-92fbcf53809c.png

现在可以了!因为运行 cat 程序的进程的 effective user ID 变成了 root。记得要把 /bin/cat 的权限改回去呀:

$ sudo chmod 755 /bin/cat

Shell 脚本的执行方式

在 shell 中执行脚本的方式和执行外部命令的方式差不多,比如我们要执行下面的脚本:

$ /bin/bash ./test.sh

这时同样会 fork 出一个子进程。只不过脚本与程序相比没有代码段,也没有 _start 函数,此时 exec 函数就会执行另外一套机制。比如我们在 test.sh 文件的第一行通过 #!/bin/bash 指定了一个解释器,那么解释器程序的代码段会用来替换当前进程的代码段,并且从解释器的 _start 函数开始执行,而这个文本文件被当作命令行参数传给解释器。所以上面的命令执行过程为:Bash 进程 fork/exec 一个子 bash 进程用于执行脚本,子 bash 进程继承父进程的环境变量、用户信息等内容,父进程等待子 bash 进程终止。

总结

文件上的权限信息和用户的信息都是静态的,而进程是动态的,它把自身携带的用户信息和将要进行的操作结合起来,从而实现权限管理。至此我们也基本上搞明白了 Linux 权限系统的工作原理

链接:https://www.cnblogs.com/sparkdev/p/9694103.html

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11225

    浏览量

    208910
  • 计算机
    +关注

    关注

    19

    文章

    7418

    浏览量

    87711
  • 内存
    +关注

    关注

    8

    文章

    2998

    浏览量

    73881
  • Ubuntu
    +关注

    关注

    5

    文章

    560

    浏览量

    29559

原文标题:深入解析:Linux 用户身份与进程权限管理

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Linux守护进程

    就是daemon的意思)。 由于在Linux中,每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端称为这些进程的控制终端,当控制终端被关闭
    发表于 08-22 09:17

    linux权限和指令

    进程的 PID。它只有一个参数就是pid。 su:是切换用户权限的命名,当我们从普通用户切换至超级用户时使用该命令 sudo命令用来以其他
    发表于 07-04 06:58

    【4412开发板】理解和掌握linux用户用户组、权限等方法

    Linux 中的用户管理与 Windows 中的用户管理很相似,但又很不相同。两个系统都是多用户系统,基于用户
    发表于 11-18 13:45

    Linux如何修改用户权限

    迅为IMX6ULL开发板-Linux用户权限
    发表于 12-29 06:18

    Linux 中文件权限管理的探讨

    Linux 是一种多用户的操作系统,其文件权限管理在文件管理中占有重要的地位。为了更好地把握Linux 的文件权限的相关内容,本文以多种
    发表于 06-11 09:37 11次下载

    Linux守护进程详解

    分享到:标签:进程控制 Linux 守护进程进程 7.3 Linux守护进程 7.3.1 守
    发表于 10-18 14:24 0次下载
    <b class='flag-5'>Linux</b>守护<b class='flag-5'>进程</b><b class='flag-5'>详解</b>

    详解如何监控和保护Linux进程安全

    通过综合采用用户级别的top、ps等系统工具以及Linux内核防护技术,我们可以从用户/内核两个层次全方位地保护Linux系统中重要系统进程
    发表于 11-06 11:20 0次下载

    浅谈Linux权限管理的ACL权限

    Linux权限管理是Linux很重要的一项内容,重则引起用户信息泄露,轻则导致文件错乱和丢失。企业服务器里有些目录下面的东西暂时保密,不希望别人可以进入目录并查看。有些文件希望别人可以
    的头像 发表于 08-18 11:13 8935次阅读

    Linux权限控制的基本原理

    ,我们将讲述 Linux 系统中的 DAC 安全模型。DAC 安全模型DAC 的核心内容是:在 Linux 中,进程理论上所拥有的权限与执行它的用户
    发表于 04-02 14:40 327次阅读

    Linux进程权限的分析说明

     在linux下,关于文件权限,大部分人接触比较多,也比较熟悉了解。但是对进程权限一般知之甚少。本文总结一下linux系统下
    发表于 07-17 10:55 861次阅读

    Linux基础的用户权限

    sudo是一种权限管理机制,其权限管理记录在/etc/sudoers文件中,约定普通用户可以以管理员的身份执行命令。
    的头像 发表于 02-15 11:08 707次阅读

    linux文件访问权限怎么设置

    Linux 文件访问权限是操作系统中一个非常重要的概念。正确地设置文件访问权限可以保护系统的安全性,防止未经授权的人员对文件进行修改、删除或执行。本文将详细介绍 Linux 文件访问
    的头像 发表于 11-23 10:20 1445次阅读

    Linux把目录权限给指定用户

    Linux是一个开放源代码的操作系统,它基于Unix的设计原则,提供了丰富的权限管理功能,允许用户对系统中的文件和目录进行精确的控制。在Linux中,每个文件和目录都有相应的
    的头像 发表于 11-23 10:30 8048次阅读

    详解Linux中的权限控制

    本章将和大家分享Linux中的权限控制。废话不多说,下面我们直接进入主题。
    的头像 发表于 08-05 15:32 469次阅读
    <b class='flag-5'>详解</b><b class='flag-5'>Linux</b>中的<b class='flag-5'>权限</b>控制

    Linux文件权限详解

    权限的意义在于允许某一个用户或某个用户组以规定的方式去访问某个文件。
    的头像 发表于 11-01 09:45 95次阅读