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 Kontrol Grupları, veya cgroups, sistem kaynaklarının (CPU, bellek ve disk I/O gibi) süreç grupları arasında tahsis edilmesini, sınırlanmasını ve önceliklendirilmesini sağlayan Linux çekirdeğinin bir özelliğidir. Süreç koleksiyonlarının kaynak kullanımını yönetme ve izole etme mekanizması sunarak, kaynak sınırlaması, iş yükü izolasyonu ve farklı süreç grupları arasında kaynak önceliklendirmesi gibi amaçlar için faydalıdır.
Cgroups'ın iki versiyonu vardır: versiyon 1 ve versiyon 2. Her ikisi de bir sistemde eşzamanlı olarak kullanılabilir. Ana ayrım, cgroups versiyon 2'nin daha ayrıntılı ve ince kaynak dağıtımını sağlayan hiyerarşik, ağaç benzeri bir yapı sunmasıdır. Ayrıca, versiyon 2 çeşitli iyileştirmeler de getirir, bunlar arasında:
Yeni hiyerarşik organizasyona ek olarak, cgroups versiyon 2 ayrıca birçok başka değişiklik ve iyileştirme tanıtmıştır; bunlar arasında yeni kaynak denetleyicileri için destek, eski uygulamalar için daha iyi destek ve geliştirilmiş performans bulunmaktadır.
Genel olarak, cgroups versiyon 2, versiyon 1'den daha fazla özellik ve daha iyi performans sunar, ancak eski sistemlerle uyumluluğun önemli olduğu belirli senaryolarda hala kullanılabilir.
Herhangi bir sürecin v1 ve v2 cgroups'ını, /proc/<pid> içindeki cgroup dosyasına bakarak listeleyebilirsiniz. Bu komutla shell'inizin cgroups'ına bakarak başlayabilirsiniz:
The output structure is as follows:
Numbers 2–12: cgroups v1, her bir satır farklı bir cgroup'u temsil eder. Bunların denetleyicileri numaranın yanında belirtilmiştir.
Number 1: Ayrıca cgroups v1, ancak yalnızca yönetim amaçları için (örneğin, systemd tarafından ayarlanmış) ve bir denetleyiciye sahip değildir.
Number 0: cgroups v2'yi temsil eder. Denetleyiciler listelenmez ve bu satır yalnızca cgroups v2 çalışan sistemlerde özeldir.
İsimler hiyerarşiktir, dosya yollarına benzer, farklı cgroup'lar arasındaki yapı ve ilişkiyi gösterir.
/user.slice veya /system.slice gibi isimler, cgroup'ların kategorisini belirtir; user.slice genellikle systemd tarafından yönetilen oturumlar için ve system.slice sistem hizmetleri içindir.
Dosya sistemi genellikle cgroup'lara erişim için kullanılır, bu da geleneksel olarak çekirdek etkileşimleri için kullanılan Unix sistem çağrısı arayüzünden farklıdır. Bir shell'in cgroup yapılandırmasını incelemek için, shell'in cgroup'unu gösteren /proc/self/cgroup dosyasına bakılmalıdır. Ardından, /sys/fs/cgroup (veya /sys/fs/cgroup/unified
) dizinine giderek cgroup'un adıyla aynı isme sahip bir dizin bulduğunuzda, cgroup ile ilgili çeşitli ayarları ve kaynak kullanım bilgilerini gözlemleyebilirsiniz.
Cgroup'lar için ana arayüz dosyaları cgroup ile başlar. cgroup.procs dosyası, cat gibi standart komutlarla görüntülenebilir ve cgroup içindeki süreçleri listeler. Diğer bir dosya, cgroup.threads, thread bilgilerini içerir.
Shell'leri yöneten cgroup'lar genellikle bellek kullanımını ve süreç sayısını düzenleyen iki denetleyici içerir. Bir denetleyici ile etkileşimde bulunmak için, denetleyicinin ön eki ile başlayan dosyalar incelenmelidir. Örneğin, pids.current cgroup'taki thread sayısını belirlemek için referans alınır.
Bir değerde max ifadesinin bulunması, cgroup için belirli bir sınırın olmadığını gösterir. Ancak, cgroup'ların hiyerarşik doğası nedeniyle, sınırlamalar dizin hiyerarşisinde daha alt seviyedeki bir cgroup tarafından uygulanabilir.
Süreçler, Process ID (PID) değerini cgroup.procs
dosyasına yazarak cgroup'lara atanır. Bu, root ayrıcalıkları gerektirir. Örneğin, bir süreci eklemek için:
Benzer şekilde, cgroup özelliklerini değiştirmek, örneğin bir PID sınırı ayarlamak, istenen değeri ilgili dosyaya yazarak yapılır. Bir cgroup için maksimum 3,000 PID ayarlamak için:
Yeni cgroup'lar oluşturmak, cgroup hiyerarşisinde yeni bir alt dizin oluşturmayı içerir; bu, çekirdeğin gerekli arayüz dosyalarını otomatik olarak oluşturmasını sağlar. Aktif süreçleri olmayan cgroup'lar rmdir
ile kaldırılabilir, ancak belirli kısıtlamaların farkında olun:
Süreçler yalnızca yaprak cgroup'lara yerleştirilebilir (yani, bir hiyerarşide en çok iç içe geçmiş olanlar).
Bir cgroup, ebeveyninde bulunmayan bir kontrolöre sahip olamaz.
Çocuk cgroup'lar için kontrolörler, cgroup.subtree_control
dosyasında açıkça belirtilmelidir. Örneğin, bir çocuk cgroup'ta CPU ve PID kontrolörlerini etkinleştirmek için:
root cgroup, bu kuralların bir istisnasıdır ve doğrudan işlem yerleştirmeye izin verir. Bu, sistemd yönetiminden işlemleri kaldırmak için kullanılabilir.
Bir cgroup içindeki CPU kullanımını izlemek, toplam tüketilen CPU zamanını gösteren cpu.stat
dosyası aracılığıyla mümkündür; bu, bir hizmetin alt süreçleri arasındaki kullanımı takip etmek için faydalıdır:
Kitap: 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)