登录和su内部


11

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


另外,约susu设置了“ setuid”位,因此当我们运行它时,它始终以root身份运行。但是,当我们告诉它以通常的用户身份登录时,它再次需要更改用户ID。我是否正确理解相同的“魔术”发生在何时su以及login何时需要更改用户?如果是这样,为什么要有两个不同的程序?运行登录时是否还会发生其他严肃的事情?

Answers:


9

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

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

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

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

  2. 一旦确定用户有权登录并以哪个帐户登录,登录程序便会建立用户的授权,例如,该会话中用户将属于哪些组。

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

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

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

如今,大多数联合国机构都使用PAM(可插入身份验证模块)来提供管理登录服务的统一方法。PAM将其功能分为四个部分:“ auth”既包含身份验证(以上1),又包含授权(以上2);“帐户”和“会话”与上面的3和4相同;还有一个“密码”,该密码不用于登录,而是用于更新身份验证令牌(例如密码)。


4

您正在寻找的系统调用被称为setuidseteuid尽管实际上有一系列的下摆取决于您要更改的用户身份的确切变​​体。

也有并行调用,例如setgid更改进程运行组。


4

login必要时将放弃root特权。许多仅需要root特权的程序最初会以root身份启动,执行他们需要做的事,然后下降到普通用户帐户,因此他们无需担心有人使用二进制文件中的bug来访问程序。根壳。login当然拥有更长的特权,但是原理是相同的。

实际上,放弃超级用户特权是微不足道的。POSIX定义setuid()setgid()函数,分别更改用户和组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()使用相同的方法在进入shell 之前就放弃了root特权。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.