登录和 su 内部结构

登录和 su 内部结构

我想了解 Linux 中的用户权限是如何工作的。内核init以 root 身份引导和启动,对吗?然后 Init 运行启动脚本并再次以 root 身份运行getty( agetty)。login我认为Agetty 只是读取用户名并运行,仍然以 root 身份运行。还没有什么有趣的事情。但有什么作用登录做?我找不到比“它尝试登录”更好的东西了。假设登录发现密码匹配(并且我们尝试以普通用户身份登录),它如何更改用户 ID?我认为应该有系统调用,但我找不到它(也许我只是盲目的?)


另外,关于su.su设置了“setuid”位,因此当我们运行它时,它始终以 root 身份运行。但是当我们告诉它以普通用户身份登录时,它再次需要更改用户 ID。我是否正确理解相同的“魔法”发生在他们需要更改用户的时候sulogin如果是这样,为什么有两个不同的程序?运行登录时是否会发生其他类型的严重业务?

答案1

登录程序的作用分为几个部分。登录程序与尝试登录的用户交互的方式有所不同。以下是一些示例:

  • login:读取文本终端上的输入
  • su:由已登录的用户调用,从其命令行参数获取大部分数据,以及来自终端的身份验证数据(密码)
  • gksu:与 类似su,但读取 X 中的身份验证数据
  • rlogind:通过 TCP 连接获取输入登录协议
  • sshd:通过 TCP 连接获取输入SSH协议
  • X 显示管理器(xdm、gdm、kdm,...):类似于login,但读取 X 显示器上的输入

这些程序以类似的方式运行。

  1. 第一部分是验证:程序读取用户的一些输入,并决定该用户是否有权登录。传统的方法是读取用户名和密码,并检查系统的用户数据库中是否提到该用户以及该用户的密码是否正确。用户输入的内容是数据库中的内容。但还有许多其他可能性(一次性密码、生物识别身份验证、授权转移……)。

  2. 一旦确定用户有权登录以及使用什么帐户登录,登录程序就会建立用户的授权,例如用户在此会话中属于哪些组。

  3. 登录程序还可以检查帐户限制。例如,它可以强制规定登录时间或登录用户的最大数量,或者拒绝某些用户进行某些连接。

  4. 最后,登录程序设置用户会话。有几个子步骤:

    1. 将进程权限设置为授权中决定的内容:用户、组、限制……您可以在此处查看此子步骤的简单示例(它只处理用户和组)。基本思想是登录程序此时仍然以 root 身份运行,因此它具有最大权限;它首先删除除 root 用户之外的所有权限,最后调用setuid删除最后但并非最不重要的权限。
    2. 可能会挂载用户的主目录,显示“您有邮件”消息等。
    3. 以用户身份调用某个程序,通常是用户的 shell(对于loginsu,或者sshd如果未指定命令;X 显示管理器调用 X 会话管理器或窗口管理器)。

现在大多数unice都使用PAM(可插拔身份验证模块)提供管理登录服务的统一方法。 PAM 将其功能分为4 部分:“auth”包含身份验证(上述 1)和授权(上述 2); “account”和“session”如上面的3和4;还有“密码”,它不用于登录,而是用于更新身份验证令牌(例如密码)。

答案2

您正在寻找的系统调用称为诸如setuid和 之类的东西,seteuid尽管实际上有一个完整的下摆系列,具体取决于您尝试更改的用户身份的哪些变体。

还有一些并行调用,例如setgid更改进程运行的组。

答案3

login必要时会放弃 root 权限。许多最初只需要root权限的程序将以root身份启动,执行它们需要执行的操作,然后下降到普通用户帐户,这样它们就不必担心有人使用二进制文件中的错误来访问根外壳。login自然持有特权的时间更长,但原理是一样的。

实际上放弃 root 权限是相当简单的。 POSIX 定义setuid()setgid()函数,分别更改您的用户 ID 和组 ID(如果您以 root 身份启动,则真实且有效)。login调用这两个组,以及initgroups()设置您可能拥有的任何补充组(因为setgid仅用于设置您的主要组 ID)

当然,实际处理进程 UID/GID 更改的是内核。如何找到Linux内核系统调用的实现?解释了很多有关系统调用的内容;在我的内核源代码中我有:

#define __NR_setgid 144
__SYSCALL(__NR_setgid, sys_setgid)
#define __NR_setuid 146
__SYSCALL(__NR_setuid, sys_setuid)

所以 144 和 146 是我的机器上这些函数的系统调用号


我没有检查su源代码来了解它的作用,但我怀疑它也会exec()使用相同的方法在 ing shell之前删除 root 权限

相关内容