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, είναι μια δυνατότητα του πυρήνα Linux που επιτρέπει την κατανομή, τον περιορισμό και την προτεραιοποίηση των πόρων του συστήματος όπως CPU, μνήμη και δίσκος I/O μεταξύ ομάδων διεργασιών. Προσφέρουν έναν μηχανισμό για τη διαχείριση και την απομόνωση της χρήσης πόρων συλλογών διεργασιών, ωφέλιμο για σκοπούς όπως ο περιορισμός πόρων, η απομόνωση φορτίου και η προτεραιοποίηση πόρων μεταξύ διαφορετικών ομάδων διεργασιών.
Υπάρχουν δύο εκδόσεις cgroups: η έκδοση 1 και η έκδοση 2. Και οι δύο μπορούν να χρησιμοποιηθούν ταυτόχρονα σε ένα σύστημα. Η κύρια διάκριση είναι ότι η έκδοση cgroups 2 εισάγει μια ιεραρχική, δένδρινη δομή, επιτρέποντας πιο λεπτομερή και λεπτομερή κατανομή πόρων μεταξύ ομάδων διεργασιών. Επιπλέον, η έκδοση 2 φέρνει διάφορες βελτιώσεις, συμπεριλαμβανομένων:
Εκτός από τη νέα ιεραρχική οργάνωση, η έκδοση cgroups 2 εισήγαγε επίσης πολλές άλλες αλλαγές και βελτιώσεις, όπως υποστήριξη για νέους ελεγκτές πόρων, καλύτερη υποστήριξη για κληρονομημένες εφαρμογές και βελτιωμένη απόδοση.
Συνολικά, η έκδοση 2 cgroups προσφέρει περισσότερες δυνατότητες και καλύτερη απόδοση από την έκδοση 1, αλλά η τελευταία μπορεί να χρησιμοποιηθεί σε ορισμένα σενάρια όπου η συμβατότητα με παλαιότερα συστήματα είναι ανησυχία.
Μπορείτε να καταγράψετε τις ομάδες cgroups v1 και v2 για οποιαδήποτε διεργασία κοιτάζοντας το αρχείο cgroup της στο /proc/<pid>. Μπορείτε να ξεκινήσετε κοιτάζοντας τις ομάδες cgroups του shell σας με αυτή την εντολή:
The output structure is as follows:
Αριθμοί 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, αποκλίνων από τη διεπαφή κλήσεων συστήματος 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 γράφοντας το Αναγνωριστικό Διαδικασίας (PID) τους στο αρχείο cgroup.procs
. Αυτό απαιτεί δικαιώματα root. Για παράδειγμα, για να προσθέσετε μια διαδικασία:
Ομοίως, η τροποποίηση των χαρακτηριστικών cgroup, όπως η ρύθμιση ενός ορίου PID, γίνεται γράφοντας την επιθυμητή τιμή στο σχετικό αρχείο. Για να ορίσετε ένα μέγιστο 3.000 PIDs για ένα cgroup:
Η δημιουργία νέων cgroups περιλαμβάνει τη δημιουργία ενός νέου υποκαταλόγου μέσα στην ιεραρχία cgroup, που προκαλεί την αυτόματη δημιουργία των απαραίτητων αρχείων διεπαφής από τον πυρήνα. Αν και τα cgroups χωρίς ενεργές διεργασίες μπορούν να αφαιρεθούν με το rmdir
, να είστε προσεκτικοί με ορισμένους περιορισμούς:
Οι διεργασίες μπορούν να τοποθετηθούν μόνο σε φύλλα cgroups (δηλαδή, τα πιο εσωτερικά στην ιεραρχία).
Ένα cgroup δεν μπορεί να έχει έναν ελεγκτή που να απουσιάζει από τον γονέα του.
Οι ελεγκτές για τα παιδικά cgroups πρέπει να δηλώνονται ρητά στο αρχείο cgroup.subtree_control
. Για παράδειγμα, για να ενεργοποιήσετε τους ελεγκτές CPU και PID σε ένα παιδικό cgroup:
Ο root cgroup είναι μια εξαίρεση στους κανόνες αυτούς, επιτρέποντας την άμεση τοποθέτηση διαδικασιών. Αυτό μπορεί να χρησιμοποιηθεί για την αφαίρεση διαδικασιών από τη διαχείριση του systemd.
Η παρακολούθηση της χρήσης CPU εντός ενός cgroup είναι δυνατή μέσω του αρχείου cpu.stat
, το οποίο εμφανίζει τον συνολικό χρόνο CPU που καταναλώθηκε, χρήσιμο για την παρακολούθηση της χρήσης σε υποδιαδικασίες μιας υπηρεσίας:
Βιβλίο: Πώς λειτουργεί το Linux, 3η Έκδοση: Τι πρέπει να γνωρίζει κάθε Superuser από τον Brian Ward
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)