AuthZ& AuthN - Docker Access Authorization Plugin
Το προεπιλεγμένο μοντέλο εξουσιοδότησης του Docker είναι όλα ή τίποτα. Οποιοσδήποτε χρήστης με άδεια πρόσβασης στον Docker daemon μπορεί να εκτελέσει οποιαδήποτε εντολή πελάτη Docker. Το ίδιο ισχύει για τους καλούντες που χρησιμοποιούν το Engine API του Docker για να επικοινωνήσουν με τον daemon. Εάν χρειάζεστε μεγαλύτερο έλεγχο πρόσβασης, μπορείτε να δημιουργήσετε πρόσθετα εξουσιοδότησης και να τα προσθέσετε στη διαμόρφωση του Docker daemon. Χρησιμοποιώντας ένα πρόσθετο εξουσιοδότησης, ένας διαχειριστής Docker μπορεί να διαμορφώσει λεπτομερείς πολιτικές πρόσβασης για τη διαχείριση της πρόσβασης στον Docker daemon.
Βασική αρχιτεκτονική
Τα πρόσθετα εξουσιοδότησης του Docker είναι εξωτερικά πρόσθετα που μπορείτε να χρησιμοποιήσετε για να επιτρέψετε/απαγορεύσετε ενέργειες που ζητούνται από τον Docker Daemon ανάλογα με τον χρήστη που το ζήτησε και την ενέργεια που ζητήθηκε.
Οι παρακάτω πληροφορίες προέρχονται από τα έγγραφα
Όταν γίνεται μια HTTP αίτηση στον Docker daemon μέσω του CLI ή μέσω του Engine API, το υποσύστημα πιστοποίησης περνά την αίτηση στο εγκατεστημένο πρόσθετο πιστοποίησης. Η αίτηση περιέχει τον χρήστη (καλούντα) και το πλαίσιο εντολών. Το πρόσθετο είναι υπεύθυνο για τον καθορισμό εάν θα επιτρέψει ή θα απορρίψει την αίτηση.
Τα παρακάτω διαγράμματα ακολουθούν τη ροή εξουσιοδότησης για την επιτρεπτή και την απορριπτική ροή:
Κάθε αίτηση που στέλνεται στο πρόσθετο περιλαμβάνει τον εξουσιοδοτημένο χρήστη, τις κεφαλίδες HTTP και το σώμα της αίτησης/απόκρισης. Μόνο το όνομα χρήστη και η μέθοδος πιστοποίησης που χρησιμοποιήθηκε περνιούνται στο πρόσθετο. Το πιο σημαντικό, δεν περνιούνται διαπιστευτήρια χρήστη ή διακριτικά. Τέλος, δεν όλα τα σώματα αιτήσεων/αποκρίσεων αποστέλλονται στο πρόσθετο εξουσιοδότησης. Αποστέλλονται μόνο εκείνα τα σώματα αιτήσεων/αποκρίσεων όπου το Content-Type
είναι είτε text/*
είτε application/json
.
Για εντολές που μπορούν πιθανώς να καταλάβουν τη σύνδεση HTTP (HTTP Upgrade
), όπως η exec
, το πρόσθετο εξουσιοδότησης καλείται μόνο για τις αρχικές αιτήσεις HTTP. Αφού το πρόσθετο εγκρίνει την εντολή, η εξουσιοδότηση δεν εφαρμόζεται στο υπόλοιπο της ροής. Ειδικότερα, τα δεδομένα ροής δεν περνι
Εκτέλεση ενός container και στη συνέχεια απόκτηση προνομιούχου συνεδρίας
Σε αυτήν την περίπτωση, ο συστημικός διαχειριστής απαγόρευσε στους χρήστες να τοποθετούν όγκους και να εκτελούν containers με την παράμετρο --privileged
ή να παρέχουν οποιαδήποτε επιπλέον δυνατότητα στο container:
Ωστόσο, ένας χρήστης μπορεί να δημιουργήσει ένα κέλυφος μέσα στο εκτελούμενο container και να του δώσει επιπλέον προνόμια:
Τώρα, ο χρήστης μπορεί να δραπετεύσει από το container χρησιμοποιώντας οποιαδήποτε από τις προηγουμένως συζητηθείσες τεχνικές και να αναβαθμίσει τα δικαιώματα μέσα στον host.
Προσάρτηση εγγράψιμου φακέλου
Σε αυτήν την περίπτωση, ο συστημικός διαχειριστής απαγόρευσε στους χρήστες να εκτελούν containers με την σημαία --privileged
ή να δίνουν οποιαδήποτε επιπλέον δυνατότητα στο container, και επέτρεψε μόνο την προσάρτηση του φακέλου /tmp
:
Σημείωση ότι ίσως δεν μπορείτε να προσαρτήσετε τον φάκελο /tmp
αλλά μπορείτε να προσαρτήσετε έναν διαφορετικό εγγράψιμο φάκελο. Μπορείτε να βρείτε εγγράψιμους φακέλους χρησιμοποιώντας: find / -writable -type d 2>/dev/null
Σημειώστε ότι όχι όλοι οι φάκελοι σε ένα μηχάνημα Linux θα υποστηρίζουν το suid bit! Για να ελέγξετε ποιοι φάκελοι υποστηρίζουν το suid bit, εκτελέστε mount | grep -v "nosuid"
Για παράδειγμα, συνήθως οι φάκελοι /dev/shm
, /run
, /proc
, /sys/fs/cgroup
και /var/lib/lxcfs
δεν υποστηρίζουν το suid bit.
Σημειώστε επίσης ότι αν μπορείτε να προσαρτήσετε τον φάκελο /etc
ή οποιονδήποτε άλλο φάκελο περιέχει αρχεία ρυθμίσεων, μπορείτε να τα τροποποιήσετε από το docker container ως root για να καταχραστείτε τα δικαιώματα στον κεντρικό υπολογιστή (ίσως τροποποιώντας το /etc/shadow
)
Μη ελεγμένο API Endpoint
Η ευθύνη του συστημικού διαχειριστή που ρυθμίζει αυτό το πρόσθετο θα ήταν να ελέγξει ποιες ενέργειες και με ποια δικαιώματα μπορεί να εκτελέσει κάθε χρήστης. Επομένως, αν ο διαχειριστής ακολουθήσει μια προσέγγιση μαύρης λίστας με τα σημεία πρόσβασης και τα χαρακτηριστικά, μπορεί να ξεχάσει κάποια από αυτά που θα μπορούσαν να επιτρέψουν σε έναν επιτιθέμενο να αναβαθμίσει τα δικαιώματά του.
Μπορείτε να ελέγξετε το API του docker στο https://docs.docker.com/engine/api/v1.40/#
Μη ελεγμένη δομή JSON
Binds στον root
Είναι δυνατόν όταν ο συστημικός διαχειριστής ρύθμισε το τείχος προστασίας του docker να ξέχασε κάποιο σημαντικό παράμετρο του API όπως το "Binds". Στο παρακάτω παράδειγμα είναι δυνατόν να καταχραστείτε αυτήν την εσφαλμένη ρύθμιση για να δημιουργήσετε και να εκτελέσετε ένα container που προσαρτά τον root (/) φάκελο του κεντρικού υπολογιστή:
Σημείωση: Παρατηρήστε ότι σε αυτό το παράδειγμα χρησιμοποιούμε την παράμετρο Binds
ως ένα κλειδί στο επίπεδο ρίζας στο JSON, αλλά στο API εμφανίζεται υπό το κλειδί HostConfig
.
Binds στο HostConfig
Ακολουθήστε τις ίδιες οδηγίες με το Binds στο root, εκτελώντας αυτό το αίτημα στο Docker API:
Συνδέσεις στον ριζικό φάκελο
Ακολουθήστε τις ίδιες οδηγίες με τις Συνδέσεις στον ριζικό φάκελο εκτελώντας αυτό το αίτημα στο Docker API:
Συναρμολογήσεις στο HostConfig
Ακολουθήστε τις ίδιες οδηγίες με τις Συνδέσεις στη ρίζα εκτελώντας αυτό το αίτημα στο Docker API:
Μη ελεγμένο JSON Χαρακτηριστικό
Είναι δυνατόν όταν ο συστημικός διαχειριστής ρύθμισε το τείχος ασφαλείας του Docker να ξέχασε κάποιο σημαντικό χαρακτηριστικό ενός παραμέτρου του API όπως το "Capabilities" μέσα στο "HostConfig". Στο παρακάτω παράδειγμα είναι δυνατόν να εκμεταλλευτείτε αυτήν την εσφαλμένη ρύθμιση για να δημιουργήσετε και να εκτελέσετε έναν container με τη δυνατότητα SYS_MODULE:
Το HostConfig
είναι το κλειδί που συνήθως περιέχει τα ενδιαφέροντα προνόμια για να δραπετεύσετε από τον container. Ωστόσο, όπως έχουμε συζητήσει προηγουμένως, παρατηρήστε πώς η χρήση των Binds έξω από αυτό επίσης λειτουργεί και μπορεί να σας επιτρέψει να παρακάμψετε περιορισμούς.
Απενεργοποίηση του Plugin
Αν ο sysadmin ξέχασε να απαγορεύσει τη δυνατότητα απενεργοποίησης του plugin, μπορείτε να εκμεταλλευτείτε αυτό για να το απενεργοποιήσετε εντελώς!
Θυμηθείτε να επανενεργοποιήσετε το πρόσθετο μετά την ανόδο στα δικαιώματα, διαφορετικά η επανεκκίνηση της υπηρεσίας docker δεν θα λειτουργήσει!
Αναφορές για την παράκαμψη του πρόσθετου εξουσιοδότησης
Αναφορές
Last updated