CGroups
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Linuxコントロールグループ、またはcgroupsは、CPU、メモリ、ディスクI/Oなどのシステムリソースをプロセスグループ間で割り当て、制限し、優先順位を付けることを可能にするLinuxカーネルの機能です。これは、リソース制限、ワークロードの分離、異なるプロセスグループ間のリソース優先順位付けなどの目的に役立つ、プロセスコレクションのリソース使用を管理および隔離するためのメカニズムを提供します。
cgroupsには2つのバージョンがあります:バージョン1とバージョン2。両方はシステム上で同時に使用できます。主な違いは、cgroupsバージョン2が階層的なツリー構造を導入し、プロセスグループ間でのリソース配分をより微妙かつ詳細に行えるようにすることです。さらに、バージョン2は、以下のようなさまざまな改善をもたらします:
新しい階層的な組織に加えて、cgroupsバージョン2は新しいリソースコントローラーのサポート、レガシーアプリケーションへのより良いサポート、パフォーマンスの向上など、いくつかの他の変更と改善も導入しました。
全体として、cgroups バージョン2はバージョン1よりも多くの機能と優れたパフォーマンスを提供しますが、後者は古いシステムとの互換性が懸念される特定のシナリオではまだ使用される可能性があります。
任意のプロセスのv1およびv2 cgroupsをリストするには、そのcgroupファイルを/proc/<pid>で確認します。次のコマンドを使用して、シェルのcgroupsを確認することから始めることができます:
The output structure is as follows:
Numbers 2–12: cgroups v1, 各行は異なるcgroupを表します。これらのコントローラーは、番号の隣に指定されています。
Number 1: これもcgroups v1ですが、管理目的のみに使用され(例えば、systemdによって設定され)、コントローラーがありません。
Number 0: cgroups v2を表します。コントローラーはリストされておらず、この行はcgroups v2のみを実行しているシステムで独占的です。
名前は階層的で、ファイルパスに似ており、異なるcgroups間の構造と関係を示しています。
/user.sliceや/system.sliceのような名前はcgroupsの分類を指定し、user.sliceは通常systemdによって管理されるログインセッション用、system.sliceはシステムサービス用です。
ファイルシステムは通常、cgroupsにアクセスするために利用され、カーネルとのインタラクションに伝統的に使用されるUnixシステムコールインターフェースとは異なります。シェルのcgroup設定を調査するには、/proc/self/cgroupファイルを確認し、シェルのcgroupを明らかにします。その後、/sys/fs/cgroup(または**/sys/fs/cgroup/unified
**)ディレクトリに移動し、cgroupの名前を共有するディレクトリを見つけることで、cgroupに関連するさまざまな設定やリソース使用情報を観察できます。
cgroupsの主要なインターフェースファイルはcgroupで始まります。cgroup.procsファイルは、標準コマンド(catなど)で表示でき、cgroup内のプロセスをリストします。別のファイル、cgroup.threadsにはスレッド情報が含まれています。
シェルを管理するcgroupsは通常、メモリ使用量とプロセス数を制御する2つのコントローラーを含みます。コントローラーと対話するには、コントローラーのプレフィックスを持つファイルを参照する必要があります。例えば、pids.currentを参照してcgroup内のスレッド数を確認します。
値にmaxが示されている場合、cgroupに特定の制限がないことを示唆しています。ただし、cgroupsの階層的な性質により、ディレクトリ階層の下位レベルのcgroupによって制限が課される可能性があります。
プロセスは**cgroup.procs
ファイルにそのプロセスID(PID)を書き込むことによって**cgroupsに割り当てられます。これにはroot権限が必要です。例えば、プロセスを追加するには:
同様に、cgroup属性を変更すること、例えばPID制限を設定することは、関連するファイルに希望の値を書き込むことで行われます。cgroupの最大3,000 PIDを設定するには:
新しいcgroupsの作成は、cgroup階層内に新しいサブディレクトリを作成することを含み、これによりカーネルは必要なインターフェースファイルを自動的に生成します。アクティブなプロセスのないcgroupsはrmdir
で削除できますが、いくつかの制約に注意してください:
プロセスはリーフcgroupsにのみ配置できます(つまり、階層内で最もネストされたもの)。
cgroupは親に存在しないコントローラーを持つことはできません。
子cgroupsのコントローラーはcgroup.subtree_control
ファイルで明示的に宣言する必要があります。たとえば、子cgroupでCPUとPIDコントローラーを有効にするには:
The root cgroupはこれらのルールの例外であり、プロセスを直接配置することを許可します。これを使用して、systemd管理からプロセスを削除することができます。
cgroup内のCPU使用量の監視は、cpu.stat
ファイルを通じて可能で、消費された総CPU時間を表示し、サービスのサブプロセス全体の使用状況を追跡するのに役立ちます:
書籍: How Linux Works, 3rd Edition: What Every Superuser Should Know By Brian Ward
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)