Linux系统中的实际用户、有效用户、设置用户

在 Linux 系统中,用户的概念比较复杂,尤其是在涉及到进程、权限和安全性等方面时。为了解决这些复杂的场景,Linux 系统设计了三种用户身份:实际用户(Real User)有效用户(Effective User)设置用户(Saved User)。下面将逐一介绍这些概念。

1. 实际用户(Real User)

实际用户(Real User)是指启动进程的用户,也就是发起某个进程的用户身份。在 Linux 中,每个进程都有一个实际用户 ID(UID),它是表示启动进程的用户的标识符。

  • 实际用户的作用: 它标识了执行当前进程的用户,通常是启动该进程的用户身份。例如,当你以普通用户身份运行一个程序时,该程序的实际用户就是你。
  • 实际用户 ID(UID): 每个用户在系统中都有一个唯一的 UID,实际用户的 UID 就是该用户的 UID。

2. 有效用户(Effective User)

有效用户(Effective User)决定了进程执行操作时使用的权限。例如,在访问文件时,操作系统会查看进程的有效用户,以决定是否允许操作。

  • 有效用户的作用: 它决定了进程的权限,尤其是在进行文件访问、网络通信等操作时,操作系统会检查进程的有效用户是否有足够的权限。例如,进程可能以一个用户身份运行,但实际上它的有效用户是另一个具有更高权限的用户(如 root)。
  • 有效用户 ID(EUID): 进程的有效用户 ID 是用于权限检查的 UID。通常情况下,实际用户和有效用户是相同的,但在一些特殊情况下(如 su 或 sudo 提升权限时),它们是不同的。

3. 设置用户(Saved User)

设置用户(Saved User)是用于保存进程原始有效用户 ID 的标识符。它允许进程在改变有效用户(EUID)后,能够恢复原始的有效用户 ID。

  • 设置用户的作用: 当一个进程临时改变其有效用户身份时,系统会将原始的有效用户身份保存为设置用户。进程可以在后续的操作中恢复到原来的有效用户身份。一个常见的例子是在使用 sudosetuid 系统调用时,进程会暂时提高权限,然后可以通过恢复设置用户来恢复到原来的用户身份。
  • 设置用户 ID(SUID): 它是进程执行 setuid() 系统调用时的原始 EUID。通过 setuid() 可以让进程从一个用户切换到另一个用户,同时保存原来的身份。

实际用户、有效用户和设置用户的关系

这三种用户的关系可以通过以下场景来理解:

  • 实际用户(Real UID): 启动进程的用户身份。
  • 有效用户(Effective UID): 进程的权限依据,决定了进程访问文件、网络资源等操作时的权限。
  • 设置用户(Saved UID): 存储进程在权限切换前的有效用户 ID,可以恢复进程的原始身份。

举例说明:

  1. 普通用户运行程序:假设用户 user1 启动一个程序,那么: 实际用户 UID:user1 的 UID。 有效用户 UID:user1 的 UID。 设置用户 UID:user1 的 UID。
  2. 使用 sudo 切换为 root 用户: 假设 user1 使用 sudo 执行命令以 root 用户权限运行程序。那么: 实际用户 UID:user1 的 UID。 有效用户 UID:root 的 UID(因为 sudo 提升了权限)。 设置用户 UID:user1 的 UID(sudo 执行时会保存原始用户为设置用户)。
  3. 恢复到原用户: 假设程序在以 root 权限执行完某些操作后,通过 setuid() 恢复到原始用户身份: 实际用户 UID:root 的 UID(进程始终是以 root 用户启动的)。 有效用户 UID:user1 的 UID(通过 setuid() 恢复到原来的有效用户)。 设置用户 UID:user1 的 UID(setuid() 调用时保存的原始有效用户)。

总结

  • 实际用户(Real UID):启动进程的用户标识,决定了进程的所有者。
  • 有效用户(Effective UID):决定进程的权限,决定它能访问哪些资源和进行哪些操作。
  • 设置用户(Saved UID):保存进程原始有效用户的 UID,允许在权限切换后恢复。

在 Linux 中,通过这些机制,系统能够灵活地管理不同用户的权限,尤其是在执行需要提升权限的操作时(如 sudo),能够在执行完特权操作后恢复到原来的权限状态,从而保证系统的安全性。

文章标签:

评论(0)