CGroups

Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι για να υποστηρίξετε το HackTricks:

Βασικές Πληροφορίες

Τα Linux Control Groups, ή cgroups, είναι μια δυνατότητα του πυρήνα του Linux που επιτρέπει την κατανομή, περιορισμό και προτεραιοποίηση των πόρων του συστήματος, όπως η CPU, η μνήμη και η διάβαση/εγγραφή στον δίσκο, μεταξύ ομάδων διεργασιών. Προσφέρουν έναν μηχανισμό για την διαχείριση και απομόνωση της χρήσης πόρων συλλογών διεργασιών, ωφέλιμο για σκοπούς όπως ο περιορισμός πόρων, η απομόνωση φορτίου εργασίας και η προτεραιοποίηση πόρων μεταξύ διαφορετικών ομάδων διεργασιών.

Υπάρχουν δύο εκδόσεις των cgroups: έκδοση 1 και έκδοση 2. Και οι δύο μπορούν να χρησιμοποιηθούν ταυτόχρονα σε ένα σύστημα. Η κύρια διάκριση είναι ότι η έκδοση 2 των cgroups εισάγει μια ιεραρχική, δενδρική δομή, που επιτρέπει πιο λεπτομερή κατανομή πόρων μεταξύ ομάδων διεργασιών. Επιπλέον, η έκδοση 2 φέρνει διάφορες βελτιώσεις, συμπεριλαμβανομένων:

Εκτός από τη νέα ιεραρχική οργάνωση, η έκδοση 2 των cgroups εισήγαγε επίσης άλλες αλλαγές και βελτιώσεις, όπως η υποστήριξη για νέους ελεγκτές πόρων, καλύτερη υποστήριξη για παλαιότερες εφαρμογές και βελτιωμένη απόδοση.

Συνολικά, η έκδοση 2 των cgroups προσφέρει περισσότερες δυνατότητες και καλύτερη απόδοση από την έκδοση 1, αλλά η τελευταία εξακολουθεί να χρησιμοποιείται σε ορισμένα σενάρια όπου η συμβατότητα με παλαιότερα συστήματα είναι ανησυχία.

Μπορείτε να εμφανίσετε τα cgroups v1 και v2 για οποιαδήποτε διεργασία κοιτάζοντας το αρχείο cgroup της στο /proc/<pid>. Μπορείτε να ξεκινήσετε κοιτώντας τα cgroups του κελύφους σας με αυτήν την εντολή:

$ 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 ενός κελύφους, πρέπει να εξετάσετε το αρχείο /proc/self/cgroup, το οποίο αποκαλύπτει το cgroup του κελύφους. Στη συνέχεια, μεταβαίνοντας στον κατάλογο /sys/fs/cgroup/sys/fs/cgroup/unified) και εντοπίζοντας έναν κατάλογο που μοιράζεται το όνομα του cgroup, μπορείτε να παρατηρήσετε διάφορες ρυθμίσεις και πληροφορίες χρήσης πόρων που σχετίζονται με το cgroup.

Τα κύρια αρχεία διεπαφής για τα cgroups έχουν πρόθεμα cgroup. Το αρχείο cgroup.procs, το οποίο μπορεί να προβληθεί με τυπικές εντολές όπως το cat, αναφέρει τις διεργασίες εντός του cgroup. Ένα άλλο αρχείο, το cgroup.threads, περιλαμβάνει πληροφορίες νημάτων.

Τα cgroups που διαχειρίζονται τα κελύφη συνήθως περιλαμβάνουν δύο ελεγκτές που ρυθμίζουν τη χρήση μνήμης και τον αριθμό των διεργασιών. Για να αλληλεπιδράσετε με έναν ελεγκτή, πρέπει να εξετάσετε τα αρχεία που φέρουν το πρόθεμα του ελεγκτή. Για παράδειγμα, το pids.current θα αναφερθεί για να διαπιστωθεί ο αριθμός των νημάτων στο cgroup.

Η ένδειξη max σε μια τιμή υποδηλώνει την απουσία ενός συγκεκριμένου ορίου για το cgroup. Ωστόσο, λόγω της ιεραρχικής φύσης των cgroups, τα όρια μπορεί να επιβληθούν από ένα cgroup σε χαμηλότερο επίπεδο στην ιεραρχία του καταλόγου.

Αλλαγή και δημιουργία cgroups

Οι διεργασίες αντιστοιχίζονται σε cgroups γράφοντας το Process ID (PID) τους στο αρχείο cgroup.procs. Αυτό απαιτεί δικαιώματα διαχειριστή. Για παράδειγμα, για να προσθέσετε μια διεργασία:

echo [pid] > cgroup.procs

Ομοίως, η τροποποίηση των χαρακτηριστικών του cgroup, όπως η οριοθέτηση ενός ορίου PID, γίνεται με το να γράψετε την επιθυμητή τιμή στο αντίστοιχο αρχείο. Για να ορίσετε ένα μέγιστο όριο 3.000 PIDs για ένα cgroup:

echo 3000 > pids.max

Δημιουργία νέων cgroups περιλαμβάνει τη δημιουργία ενός νέου υποκαταλόγου εντός της ιεραρχίας των cgroup, η οποία προκαλεί τον πυρήνα να δημιουργήσει αυτόματα τα απαραίτητα αρχεία διεπαφής. Αν και τα cgroups χωρίς ενεργές διεργασίες μπορούν να αφαιρεθούν με την εντολή rmdir, πρέπει να λάβετε υπόψη τους ορισμένους περιορισμούς:

  • Οι διεργασίες μπορούν να τοποθετηθούν μόνο σε leaf cgroups (δηλαδή, τα πιο εμβαδοπροσανατολισμένα σε μια ιεραρχία).

  • Ένα cgroup δεν μπορεί να έχει έναν ελεγκτή που λείπει από τον γονέα του.

  • Οι ελεγκτές για τα παιδικά cgroups πρέπει να δηλωθούν ρητά στο αρχείο cgroup.subtree_control. Για παράδειγμα, για να ενεργοποιήσετε τους ελεγκτές CPU και PID σε ένα παιδικό cgroup:

echo "+cpu +pids" > cgroup.subtree_control

Το root cgroup είναι μια εξαίρεση από αυτούς τους κανόνες, επιτρέποντας την άμεση τοποθέτηση διεργασιών. Αυτό μπορεί να χρησιμοποιηθεί για να αφαιρέσει διεργασίες από τη διαχείριση του systemd.

Η παρακολούθηση της χρήσης της CPU εντός ενός cgroup είναι δυνατή μέσω του αρχείου cpu.stat, που εμφανίζει το συνολικό χρόνο CPU που καταναλώνεται, χρήσιμο για την παρακολούθηση της χρήσης σε υποδιεργασίες ενός υπηρεσίας:

Αναφορές

  • Βιβλίο: How Linux Works, 3η έκδοση: Τι πρέπει να γνωρίζει κάθε υπερχρήστης από τον Brian Ward

Μάθετε το hacking στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι για να υποστηρίξετε το HackTricks:

Last updated