Contents

Linux中的标识符是什么意思?

1. 简介

Linux 操作系统的关键安全特性之一是标识符。标识符是分配给用户、进程或组的整数。他们可以限制或允许访问服务。在本文中,我们将讨论不同的标识符及其功能。

2. 什么是 UID?

用户标识符或 UID 是系统用来区分用户帐户的值。此外,UID 指定用户的权限,例如用户可以访问的文件和目录。UID 可以确定用户是否是进程的所有者。这很重要,因为只有进程的所有者才能向它发出进程信号。当 UID 的值为 0 时,表示它是 root 用户。

我们可以在passwd文件中查看 UID,该文件位于*/etc*文件夹中:

$ cat /etc/passwd |head
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
...

第一个字段是用户的名称,而第三个字段是用户各自的 UID。有四种不同类型的 UID,即:

  • 真实用户标识符或 RUID
  • 有效用户标识符或 EUID
  • 保存的用户标识符或 SUID
  • 文件系统用户标识符或 FSUID

2.1. 什么是 RUID?

RUID 识别进程的真正所有者。此外,用户拥有的每个进程都将具有相同的 RUID。

2.2. 什么是 EUID?

当用户需要超级权限来执行任务时,内核将查看 EUID 以查看是否可行。最初,EUID 的值与 RUID 的值相同。但是,EUID 的值可以更改。某些程序(例如sudo  )被称为setuid二进制文件。这些程序临时将 EUID 更改为 0,以便用户拥有超级权限。 

2.3. 什么是 SUID?

当用户正在运行一些特权任务但需要临时执行非特权任务时,EUID 的值必须更改。但是,内核需要将之前的 EUID 值存储在某个地方。这就是 SUID 的用武之地。当用户需要再次执行特权任务时,其 EUID 将更改为存储在 SUID 中的特权值。 

2.4. 什么是 FSUID?

除非明确设置,否则此标识符通常与 EUID 相同。FSUID严格用于文件系统的访问检查。FSUID 仅用于 NFS 服务器等程序。此外,任何其他不需要文件系统权限的程序都不会更改其 FSUID。 

3. 什么是 GID?

**同样,组标识符或 GID 是系统用来区分组的数字。**就像 UID 一样,前 100 个 GID 与系统相关。我们可以使用/etc文件夹中的组文件查看 GID :

$ cat /etc/group |head
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
...

第一个字段是组的名称,而第三个字段是组各自的 GID。此外,进程具有真实 (RGID)、有效 (EGID)、已保存 (SGID) 和文件系统 (FSGID) 标识符。这些与各种 UID 相同,只是在这种情况下,标识符适用于组而不是用户。

4. 什么是 PID?

进程标识符 (PID) 是自动分配给 Linux 系统上的进程的唯一值。PIDs 从 0 开始。id 为 0 的进程是内核的一部分,不被视为普通的用户模式进程

ID值为1的进程是init进程。init 进程是系统启动时出现的第一个进程。系统可以拥有的进程数有一个最大限制。通常,这取决于系统的内存容量。

我们可以在pid_max文件上查看最大进程数:

$ cat /proc/sys/kernel/pid_max 
4194304

4.1.什么是 PPID?

一个程序可以启动各种进程来完成一项任务。创建的进程称为子进程。父进程负责创建子进程。**父进程标识符(PPID)是父进程的PID。**子进程有自己的 PID,但如果它们共享相同的父进程,它们将具有相同的PPID 。让我们查看系统上的前 5 个进程,看看哪个进程拥有它们:

$ ps -eo pid,ppid,cmd |head
    PID    PPID CMD
      1       0 /usr/lib/systemd/systemd --switched-root --system --deserialize 18
      2       0 [kthreadd]
      3       2 [rcu_gp]
      4       2 [rcu_par_gp]
      6       2 [kworker/0:0H-events_highpri]
 ...

4.2. 什么是 PGID?

进程组标识符或 PGID 是区分进程组的数字。进程组是进程的集合。我们需要进程组,因为它们允许系统跟踪哪些进程正在协同工作。让我们通过在我们的系统上打开一个浏览器来启动一个新进程:

$ ps -eo pid,ppid,pgid,cmd
...
   3127       1    2414    /usr/lib64/firefox/firefox
   3189    3127    2414   /usr/lib64/firefox/firefox -contentproc -parentB
   3308    3127    2414   /usr/lib64/firefox/firefox -contentproc -childID
   3378    3127    2414   /usr/lib64/firefox/firefox -contentproc -childID
   3492    3127    2414   /usr/lib64/firefox/firefox -contentproc -childID
...

我们看到PID为3127的进程有很多子进程。父进程及其子进程都具有相同的 PGID 2414。经过进一步调查,我们看到 PID 为 2414 的进程是 GNOME 显示管理器 (GDM)。GDM 负责我们系统上的图形显示:

$ ps -eo pid,cmd |grep 2414
2414 /usr/libexec/gdm-x-session --register-session --run-script env GNOME_SHELL_SESSION_MODE=classic gnome-session --session gnome-classic
   3802 grep --color=auto 2414

5. 什么是会话 ID?

同样,会话是进程组的集合。**会话 ID 与会话负责人具有相同的值。**会话负责人是会话的第一个成员。 在特定登录过程中启动的所有进程都将成为同一会话的成员:

$ ps -eo pid,ppid,sid,cmd
...
   4521    4203    2414 /usr/lib64/firefox/firefox -contentproc -childID 3
   4595    4203    2414 /usr/lib64/firefox/firefox -contentproc -childID 5 
   4688    4203    2414 /usr/lib64/firefox/firefox -contentproc -childID 6 
   4725    4203    2414 /usr/lib64/firefox/firefox -contentproc -parentBuildID
...

我们看到与我们的浏览器相关的各种进程的 SID 与 GDM 进程具有相同的值。因此,一旦我们注销系统,系统就可以杀死属于一个会话的所有进程。

6. 什么是 TID?

一个进程可以有多个线程 。线程是一个轻量级进程。一个进程可以通过使用线程同时完成多个工作单元。**线程 ID 或 TID 是系统分配给线程的值。**当一个进程有一个线程在做这项工作时,TID 将具有与其所属进程的 PID 相同的值。