CGroups
Reading time: 6 minutes
tip
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Basic Information
Linux Control Groups, ή cgroups, είναι μια δυνατότητα του πυρήνα Linux που επιτρέπει την κατανομή, τον περιορισμό και την προτεραιοποίηση των πόρων του συστήματος όπως CPU, μνήμη και δίσκος I/O μεταξύ ομάδων διεργασιών. Προσφέρουν έναν μηχανισμό για τη διαχείριση και την απομόνωση της χρήσης πόρων των συλλογών διεργασιών, ωφέλιμο για σκοπούς όπως ο περιορισμός πόρων, η απομόνωση φορτίου εργασίας και η προτεραιοποίηση πόρων μεταξύ διαφορετικών ομάδων διεργασιών.
Υπάρχουν δύο εκδόσεις cgroups: η έκδοση 1 και η έκδοση 2. Και οι δύο μπορούν να χρησιμοποιηθούν ταυτόχρονα σε ένα σύστημα. Η κύρια διάκριση είναι ότι η έκδοση cgroups 2 εισάγει μια ιεραρχική, δένδρο-όπως δομή, επιτρέποντας πιο λεπτομερή και λεπτομερή κατανομή πόρων μεταξύ ομάδων διεργασιών. Επιπλέον, η έκδοση 2 φέρνει διάφορες βελτιώσεις, συμπεριλαμβανομένων:
Εκτός από τη νέα ιεραρχική οργάνωση, η έκδοση cgroups 2 εισήγαγε επίσης πολλές άλλες αλλαγές και βελτιώσεις, όπως υποστήριξη για νέους ελεγκτές πόρων, καλύτερη υποστήριξη για κληρονομημένες εφαρμογές και βελτιωμένη απόδοση.
Συνολικά, η έκδοση cgroups 2 προσφέρει περισσότερες δυνατότητες και καλύτερη απόδοση από την έκδοση 1, αλλά η τελευταία μπορεί να χρησιμοποιηθεί σε ορισμένα σενάρια όπου η συμβατότητα με παλαιότερα συστήματα είναι ανησυχία.
Μπορείτε να καταγράψετε τις cgroups v1 και v2 για οποιαδήποτε διεργασία κοιτάζοντας το αρχείο cgroup της στο /proc/<pid>. Μπορείτε να ξεκινήσετε κοιτάζοντας τις cgroups του shell σας με αυτή την εντολή:
$ 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.
- Οι ονομασίες είναι ιεραρχικές, μοιάζοντας με διαδρομές αρχείων, υποδεικνύοντας τη δομή και τη σχέση μεταξύ διαφορετικών cgroups.
- Ονομασίες όπως /user.slice ή /system.slice καθορίζουν την κατηγοριοποίηση των cgroups, με το user.slice συνήθως για συνεδρίες σύνδεσης που διαχειρίζεται το systemd και το system.slice για υπηρεσίες συστήματος.
Προβολή cgroups
Το σύστημα αρχείων χρησιμοποιείται συνήθως για την πρόσβαση σε cgroups, αποκλίνων από τη διεπαφή κλήσεων συστήματος Unix που χρησιμοποιείται παραδοσιακά για αλληλεπιδράσεις με τον πυρήνα. Για να εξετάσετε τη διαμόρφωση cgroup ενός shell, θα πρέπει να ελέγξετε το αρχείο /proc/self/cgroup, το οποίο αποκαλύπτει το cgroup του shell. Στη συνέχεια, πλοηγούμενοι στον κατάλογο /sys/fs/cgroup (ή /sys/fs/cgroup/unified
) και εντοπίζοντας έναν κατάλογο που μοιράζεται το όνομα του cgroup, μπορεί κανείς να παρατηρήσει διάφορες ρυθμίσεις και πληροφορίες χρήσης πόρων σχετικές με το cgroup.
Τα κύρια αρχεία διεπαφής για τα cgroups έχουν πρόθεμα cgroup. Το αρχείο cgroup.procs, το οποίο μπορεί να προβληθεί με τυπικές εντολές όπως cat, απαριθμεί τις διαδικασίες εντός του cgroup. Ένα άλλο αρχείο, cgroup.threads, περιλαμβάνει πληροφορίες για τα νήματα.
Τα cgroups που διαχειρίζονται shells συνήθως περιλαμβάνουν δύο ελεγκτές που ρυθμίζουν τη χρήση μνήμης και τον αριθμό διαδικασιών. Για να αλληλεπιδράσετε με έναν ελεγκτή, θα πρέπει να συμβουλευτείτε αρχεία που φέρουν το πρόθεμα του ελεγκτή. Για παράδειγμα, το pids.current θα αναφερόταν για να προσδιορίσει τον αριθμό των νημάτων στο cgroup.
Η ένδειξη max σε μια τιμή υποδηλώνει την απουσία συγκεκριμένου ορίου για το cgroup. Ωστόσο, λόγω της ιεραρχικής φύσης των cgroups, όρια μπορεί να επιβληθούν από ένα cgroup σε χαμηλότερο επίπεδο στην ιεραρχία καταλόγων.
Χειρισμός και Δημιουργία cgroups
Οι διαδικασίες ανατίθενται σε cgroups γράφοντας το Αναγνωριστικό Διαδικασίας (PID) τους στο αρχείο cgroup.procs
. Αυτό απαιτεί δικαιώματα root. Για παράδειγμα, για να προσθέσετε μια διαδικασία:
echo [pid] > cgroup.procs
Ομοίως, η τροποποίηση των χαρακτηριστικών cgroup, όπως η ρύθμιση ενός ορίου PID, γίνεται γράφοντας την επιθυμητή τιμή στο σχετικό αρχείο. Για να ορίσετε ένα μέγιστο των 3.000 PIDs για ένα cgroup:
echo 3000 > pids.max
Η δημιουργία νέων cgroups περιλαμβάνει τη δημιουργία ενός νέου υποκαταλόγου μέσα στην ιεραρχία cgroup, που προκαλεί τον πυρήνα να δημιουργήσει αυτόματα τα απαραίτητα αρχεία διεπαφής. Αν και τα cgroups χωρίς ενεργές διεργασίες μπορούν να αφαιρεθούν με το rmdir
, να είστε προσεκτικοί με ορισμένους περιορισμούς:
- Οι διεργασίες μπορούν να τοποθετηθούν μόνο σε leaf cgroups (δηλαδή, τα πιο εσωτερικά στην ιεραρχία).
- Ένα cgroup δεν μπορεί να έχει έναν ελεγκτή που να απουσιάζει από τον γονέα του.
- Οι ελεγκτές για τα child cgroups πρέπει να δηλώνονται ρητά στο αρχείο
cgroup.subtree_control
. Για παράδειγμα, για να ενεργοποιήσετε τους ελεγκτές CPU και PID σε ένα child cgroup:
echo "+cpu +pids" > cgroup.subtree_control
Ο root cgroup είναι μια εξαίρεση στους κανόνες αυτούς, επιτρέποντας την άμεση τοποθέτηση διαδικασιών. Αυτό μπορεί να χρησιμοποιηθεί για την αφαίρεση διαδικασιών από τη διαχείριση του systemd.
Η παρακολούθηση της χρήσης CPU εντός ενός cgroup είναι δυνατή μέσω του αρχείου cpu.stat
, το οποίο εμφανίζει τον συνολικό χρόνο CPU που καταναλώθηκε, χρήσιμο για την παρακολούθηση της χρήσης σε υποδιαδικασίες μιας υπηρεσίας:
.png)
Στατιστικά χρήσης CPU όπως εμφανίζονται στο αρχείο cpu.stat
Αναφορές
- Βιβλίο: How Linux Works, 3rd Edition: What Every Superuser Should Know By Brian Ward
tip
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.