CGroups

Reading time: 9 minutes

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

基本情報

Linux Control Groups、またはcgroupsは、CPU、メモリ、ディスクI/Oなどのシステムリソースをプロセスグループ間で割り当て、制限し、優先順位を付けることを可能にするLinuxカーネルの機能です。これは、リソース制限、ワークロードの分離、異なるプロセスグループ間のリソース優先順位付けなどの目的に役立つ、プロセスコレクションのリソース使用を管理および分離するためのメカニズムを提供します。

cgroupsには2つのバージョンがあります:バージョン1とバージョン2。両方はシステム上で同時に使用できます。主な違いは、cgroupsバージョン2階層的なツリー状の構造を導入し、プロセスグループ間でのリソース配分をより微妙かつ詳細に行えるようにしていることです。さらに、バージョン2は、以下のようなさまざまな強化をもたらします。

新しい階層的な組織に加えて、cgroupsバージョン2は新しいリソースコントローラーのサポート、レガシーアプリケーションへのより良いサポート、パフォーマンスの向上など、いくつかの他の変更と改善も導入しました。

全体として、cgroups バージョン2はバージョン1よりも多くの機能と優れたパフォーマンスを提供しますが、後者は古いシステムとの互換性が懸念される特定のシナリオではまだ使用される可能性があります。

任意のプロセスのv1およびv2 cgroupsをリストするには、そのcgroupファイルを/proc/<pid>で確認します。次のコマンドを使用して、シェルのcgroupsを確認することから始めることができます:

shell-session
$ cat /proc/self/cgroup
12:rdma:/
11:net_cls,net_prio:/
10:perf_event:/
9:cpuset:/
8:cpu,cpuacct:/user.slice
7:blkio:/user.slice
6:memory:/user.slice 5:pids:/user.slice/user-1000.slice/session-2.scope 4:devices:/user.slice
3:freezer:/
2:hugetlb:/testcgroup
1:name=systemd:/user.slice/user-1000.slice/session-2.scope
0::/user.slice/user-1000.slice/session-2.scope
  • 数字 2–12: cgroups v1、各行は異なる cgroup を表します。これらのコントローラーは、数字の隣に指定されています。
  • 数字 1: これも cgroups v1 ですが、管理目的のみに使用され(例: systemd によって設定)、コントローラーはありません。
  • 数字 0: cgroups v2 を表します。コントローラーはリストされておらず、この行は cgroups v2 のみを実行しているシステムで独占的です。
  • 名前は階層的で、ファイルパスに似ており、異なる cgroup 間の構造と関係を示しています。
  • /user.slice や /system.slice のような名前は cgroup の分類を指定し、user.slice は通常 systemd によって管理されるログインセッション用、system.slice はシステムサービス用です。

cgroups の表示

ファイルシステムは通常、cgroups へのアクセスに利用され、カーネルとのインタラクションに伝統的に使用される Unix システムコールインターフェースとは異なります。シェルの cgroup 構成を調査するには、/proc/self/cgroup ファイルを確認し、シェルの cgroup を明らかにします。その後、/sys/fs/cgroup(または /sys/fs/cgroup/unified)ディレクトリに移動し、cgroup の名前を共有するディレクトリを見つけることで、cgroup に関連するさまざまな設定やリソース使用情報を観察できます。

Cgroup Filesystem

cgroups の主要なインターフェースファイルは cgroup で始まります。cgroup.procs ファイルは、cat などの標準コマンドで表示でき、cgroup 内のプロセスをリストします。別のファイル cgroup.threads にはスレッド情報が含まれています。

Cgroup Procs

シェルを管理する cgroups は通常、メモリ使用量とプロセス数を制御する 2 つのコントローラーを含みます。コントローラーと対話するには、コントローラーのプレフィックスを持つファイルを参照する必要があります。たとえば、pids.current を参照して cgroup 内のスレッド数を確認します。

Cgroup Memory

値に max が示されている場合、cgroup に特定の制限がないことを示唆しています。ただし、cgroups の階層的な性質により、ディレクトリ階層の下位レベルの cgroup によって制限が課される可能性があります。

cgroups の操作と作成

プロセスは cgroup.procs ファイルにそのプロセス ID (PID) を書き込むことによって cgroups に割り当てられます。これには root 権限が必要です。たとえば、プロセスを追加するには:

bash
echo [pid] > cgroup.procs

同様に、cgroup属性を変更すること、例えばPID制限を設定することは、関連するファイルに希望の値を書き込むことで行われます。cgroupの最大3,000 PIDを設定するには:

bash
echo 3000 > pids.max

新しいcgroupsの作成は、cgroup階層内に新しいサブディレクトリを作成することを含み、これによりカーネルは必要なインターフェースファイルを自動的に生成します。アクティブなプロセスのないcgroupsはrmdirで削除できますが、いくつかの制約に注意してください:

  • プロセスはリーフcgroupsにのみ配置できます(つまり、階層内で最もネストされたもの)。
  • cgroupは親に存在しないコントローラーを持つことはできません
  • 子cgroupsのコントローラーはcgroup.subtree_controlファイルで明示的に宣言する必要があります。たとえば、子cgroupでCPUとPIDコントローラーを有効にするには:
bash
echo "+cpu +pids" > cgroup.subtree_control

ルートcgroupはこれらのルールの例外であり、プロセスを直接配置することを許可します。これを使用して、systemd管理からプロセスを削除することができます。

cgroup内のCPU使用量の監視は、cpu.statファイルを通じて可能で、消費された総CPU時間を表示し、サービスのサブプロセス全体の使用状況を追跡するのに役立ちます:

cpu.statファイルに表示されるCPU使用統計

参考文献

  • 書籍: How Linux Works, 3rd Edition: What Every Superuser Should Know By Brian Ward

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする