1. 序章

Linuxオペレーティングシステムの主要なセキュリティ機能の1つは、識別子です。 識別子は、ユーザー、プロセス、またはグループに割り当てられる整数です。 サービスへのアクセスを制限または許可できます。 この記事では、さまざまな識別子とその機能について説明します。

2. UIDとは何ですか?

ユーザー識別子またはUIDは、システムがユーザーアカウントを互いに区別するために使用する値です。 さらに、UIDは、ユーザーがアクセスできるファイルやディレクトリなど、ユーザーの特権を指定します。 UIDは、ユーザーがプロセスの所有者であるかどうかを判別できます。 プロセスの所有者のみがプロセス信号を送信できるため、これは重要です。 UIDの値が0の場合、それはrootユーザーであることを意味します。

UIDは、 /etcフォルダーにあるpasswdファイルで確認できます。

$ 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
...

最初のフィールドはユーザーの名前であり、3番目のフィールドはユーザーのそれぞれのUIDです。 UIDには、次の4つのタイプがあります。

  • 実ユーザーIDまたはRUID
  • 有効なユーザーIDまたはEUID
  • 保存されたユーザーIDまたは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と同じです。 T 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:
...

最初のフィールドはグループの名前であり、3番目のフィールドはグループのそれぞれのGIDです。 さらに、プロセスには、実(RGID)、有効(EGID)、保存(SGID)、およびファイルシステム(FSGID)の識別子があります。 これらはさまざまなUIDと同じですが、この場合、識別子はユーザーではなくグループに適用されます。

4. PIDとは何ですか?

プロセス識別子(PID)は、Linuxシステム上のプロセスに自動的に割り当てられる一意の値です。 PIDは0から始まります。 IDが0のプロセスはカーネルの一部であり、通常のユーザーモードプロセスとは見なされません。

値1のIDを持つプロセスは、初期化プロセスです。 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のプロセスには、多くの子プロセスがあることがわかります。 親プロセスとその子はすべて、2414の同じPGIDを持っています。 さらに調査すると、PID2414のプロセスはGNOMEDisplay Manager(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と同じ値を持ちます。

7. 結論

要約すると、ユーザー、グループ、およびプロセスを区別するために識別子を使用します。 さらに、プロセスはプロセスグループ内に存在し、プロセスグループはセッション内に存在します。 さらに、プロセスにはスレッドと呼ばれるサブプロセスがあり、タスクを同時に完了するのに役立ちます。 これらはすべて、対応する独自のIDを持っている必要があります。 識別子は、システムがユーザー、プロセス、およびグループを効率的に管理することを保証します。