CGroups
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Podstawowe informacje
Linux Control Groups, czyli cgroups, to funkcja jądra Linux, która umożliwia alokację, ograniczenie i priorytetyzację zasobów systemowych, takich jak CPU, pamięć i I/O dysku, wśród grup procesów. Oferują mechanizm do zarządzania i izolowania wykorzystania zasobów przez zbiory procesów, co jest korzystne w takich celach jak ograniczenie zasobów, izolacja obciążenia i priorytetyzacja zasobów wśród różnych grup procesów.
Istnieją dwie wersje cgroups: wersja 1 i wersja 2. Obie mogą być używane jednocześnie w systemie. Główna różnica polega na tym, że cgroups wersja 2 wprowadza hierarchiczną, drzewiastą strukturę, umożliwiając bardziej zniuansowaną i szczegółową dystrybucję zasobów wśród grup procesów. Dodatkowo, wersja 2 wprowadza różne ulepszenia, w tym:
Oprócz nowej hierarchicznej organizacji, cgroups wersja 2 wprowadziła również kilka innych zmian i ulepszeń, takich jak wsparcie dla nowych kontrolerów zasobów, lepsze wsparcie dla aplikacji starszej generacji oraz poprawioną wydajność.
Ogólnie rzecz biorąc, cgroups wersja 2 oferuje więcej funkcji i lepszą wydajność niż wersja 1, ale ta ostatnia może być nadal używana w niektórych scenariuszach, gdzie zgodność ze starszymi systemami jest istotna.
Możesz wylistować cgroups v1 i v2 dla dowolnego procesu, przeglądając jego plik cgroup w /proc/<pid>. Możesz zacząć od sprawdzenia cgroups swojego powłoki za pomocą tego polecenia:
The output structure is as follows:
Liczby 2–12: cgroups v1, gdzie każda linia reprezentuje inny cgroup. Kontrolery dla nich są określone obok numeru.
Liczba 1: Również cgroups v1, ale wyłącznie do celów zarządzania (ustawiane przez np. systemd) i nie ma kontrolera.
Liczba 0: Reprezentuje cgroups v2. Żadne kontrolery nie są wymienione, a ta linia jest wyłączna dla systemów działających tylko na cgroups v2.
Nazwy są hierarchiczne, przypominające ścieżki plików, wskazujące na strukturę i relacje między różnymi cgroups.
Nazwy takie jak /user.slice lub /system.slice określają kategoryzację cgroups, przy czym user.slice zazwyczaj dotyczy sesji logowania zarządzanych przez systemd, a system.slice dotyczy usług systemowych.
Viewing cgroups
System plików jest zazwyczaj wykorzystywany do uzyskiwania dostępu do cgroups, różniąc się od interfejsu wywołań systemowych Unix tradycyjnie używanego do interakcji z jądrem. Aby zbadać konfigurację cgroup powłoki, należy sprawdzić plik /proc/self/cgroup, który ujawnia cgroup powłoki. Następnie, przechodząc do katalogu /sys/fs/cgroup (lub /sys/fs/cgroup/unified
) i znajdując katalog, który dzieli nazwę cgroup, można zaobserwować różne ustawienia i informacje o wykorzystaniu zasobów związane z cgroup.
Kluczowe pliki interfejsu dla cgroups są poprzedzone prefiksem cgroup. Plik cgroup.procs, który można przeglądać za pomocą standardowych poleceń, takich jak cat, wymienia procesy w cgroup. Inny plik, cgroup.threads, zawiera informacje o wątkach.
Cgroups zarządzające powłokami zazwyczaj obejmują dwa kontrolery, które regulują wykorzystanie pamięci i liczbę procesów. Aby interagować z kontrolerem, należy skonsultować się z plikami noszącymi prefiks kontrolera. Na przykład, pids.current byłby odniesiony, aby ustalić liczbę wątków w cgroup.
Wskazanie max w wartości sugeruje brak konkretnego limitu dla cgroup. Jednak z powodu hierarchicznej natury cgroups, limity mogą być narzucane przez cgroup na niższym poziomie w hierarchii katalogów.
Manipulating and Creating cgroups
Procesy są przypisywane do cgroups przez zapisanie ich identyfikatora procesu (PID) do pliku cgroup.procs
. Wymaga to uprawnień roota. Na przykład, aby dodać proces:
Podobnie, modyfikacja atrybutów cgroup, takich jak ustawienie limitu PID, odbywa się poprzez zapisanie żądanej wartości do odpowiedniego pliku. Aby ustawić maksymalnie 3,000 PID dla cgroup:
Tworzenie nowych cgroups polega na utworzeniu nowego podkatalogu w hierarchii cgroup, co powoduje, że jądro automatycznie generuje niezbędne pliki interfejsu. Chociaż cgroups bez aktywnych procesów można usunąć za pomocą rmdir
, należy być świadomym pewnych ograniczeń:
Procesy mogą być umieszczane tylko w liściastych cgroups (tj. w najbardziej zagnieżdżonych w hierarchii).
Cgroup nie może posiadać kontrolera, który nie występuje w jej rodzicu.
Kontrolery dla cgroups podrzędnych muszą być wyraźnie zadeklarowane w pliku
cgroup.subtree_control
. Na przykład, aby włączyć kontrolery CPU i PID w cgroup podrzędnej:
root cgroup jest wyjątkiem od tych zasad, pozwalającym na bezpośrednie umieszczanie procesów. Może to być użyte do usunięcia procesów z zarządzania systemd.
Monitorowanie użycia CPU w cgroup jest możliwe poprzez plik cpu.stat
, który wyświetla całkowity czas CPU zużyty, co jest pomocne w śledzeniu użycia w podprocesach usługi:
References
Książka: Jak działa Linux, 3. wydanie: Co każdy superużytkownik powinien wiedzieć autorstwa Briana Warda
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Last updated