Docker Security
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Use Trickest to easily build and automate workflows powered by the world's most advanced community tools. Get Access Today:
Η μηχανή Docker χρησιμοποιεί τα Namespaces και Cgroups του πυρήνα Linux για να απομονώσει τα κοντέινερ, προσφέροντας ένα βασικό επίπεδο ασφάλειας. Επιπλέον προστασία παρέχεται μέσω της αφαίρεσης δικαιωμάτων, Seccomp και SELinux/AppArmor, ενισχύοντας την απομόνωση των κοντέινερ. Ένα auth plugin μπορεί να περιορίσει περαιτέρω τις ενέργειες των χρηστών.
Η μηχανή Docker μπορεί να προσπελαστεί είτε τοπικά μέσω ενός Unix socket είτε απομακρυσμένα χρησιμοποιώντας HTTP. Για απομακρυσμένη πρόσβαση, είναι απαραίτητο να χρησιμοποιούνται HTTPS και TLS για να διασφαλιστούν η εμπιστευτικότητα, η ακεραιότητα και η αυθεντικοποίηση.
Η μηχανή Docker, από προεπιλογή, ακούει στο Unix socket στο unix:///var/run/docker.sock
. Στα συστήματα Ubuntu, οι επιλογές εκκίνησης του Docker ορίζονται στο /etc/default/docker
. Για να επιτρέψετε την απομακρυσμένη πρόσβαση στο Docker API και τον πελάτη, εκθέστε τον Docker daemon μέσω ενός HTTP socket προσθέτοντας τις παρακάτω ρυθμίσεις:
Ωστόσο, η έκθεση του Docker daemon μέσω HTTP δεν συνιστάται λόγω ανησυχιών σχετικά με την ασφάλεια. Είναι σκόπιμο να ασφαλίζετε τις συνδέσεις χρησιμοποιώντας HTTPS. Υπάρχουν δύο κύριες προσεγγίσεις για την ασφάλιση της σύνδεσης:
Ο πελάτης επαληθεύει την ταυτότητα του διακομιστή.
Και ο πελάτης και ο διακομιστής αμοιβαία πιστοποιούν την ταυτότητα ο ένας του άλλου.
Τα πιστοποιητικά χρησιμοποιούνται για να επιβεβαιώσουν την ταυτότητα ενός διακομιστή. Για λεπτομερείς παραδείγματα και των δύο μεθόδων, ανατρέξτε σε αυτήν την οδηγία.
Οι εικόνες κοντέινερ μπορούν να αποθηκευτούν είτε σε ιδιωτικά είτε σε δημόσια αποθετήρια. Το Docker προσφέρει πολλές επιλογές αποθήκευσης για εικόνες κοντέινερ:
Docker Hub: Μια δημόσια υπηρεσία μητρώου από το Docker.
Docker Registry: Ένα έργο ανοιχτού κώδικα που επιτρέπει στους χρήστες να φιλοξενούν το δικό τους μητρώο.
Docker Trusted Registry: Η εμπορική προσφορά μητρώου του Docker, που διαθέτει αυθεντικοποίηση χρηστών με βάση ρόλους και ενσωμάτωση με υπηρεσίες καταλόγου LDAP.
Τα κοντέινερ μπορεί να έχουν ευπάθειες ασφαλείας είτε λόγω της βασικής εικόνας είτε λόγω του λογισμικού που είναι εγκατεστημένο πάνω από τη βασική εικόνα. Το Docker εργάζεται σε ένα έργο που ονομάζεται Nautilus που εκτελεί σάρωση ασφαλείας των Κοντέινερ και καταγράφει τις ευπάθειες. Το Nautilus λειτουργεί συγκρίνοντας κάθε επίπεδο εικόνας Κοντέινερ με το μητρώο ευπαθειών για να εντοπίσει τα κενά ασφαλείας.
Για περισσότερες πληροφορίες διαβάστε αυτό.
docker scan
Η εντολή docker scan
σας επιτρέπει να σαρώσετε υπάρχουσες εικόνες Docker χρησιμοποιώντας το όνομα ή το ID της εικόνας. Για παράδειγμα, εκτελέστε την παρακάτω εντολή για να σαρώσετε την εικόνα hello-world:
Η υπογραφή εικόνας Docker διασφαλίζει την ασφάλεια και την ακεραιότητα των εικόνων που χρησιμοποιούνται σε κοντέινερ. Ακολουθεί μια συνοπτική εξήγηση:
Για να ενεργοποιήσετε την εμπιστοσύνη περιεχομένου Docker, ρυθμίστε export DOCKER_CONTENT_TRUST=1
. Αυτή η δυνατότητα είναι απενεργοποιημένη από προεπιλογή στην έκδοση Docker 1.10 και μεταγενέστερες.
Με αυτή τη δυνατότητα ενεργοποιημένη, μόνο υπογεγραμμένες εικόνες μπορούν να ληφθούν. Η αρχική μεταφόρτωση εικόνας απαιτεί τη ρύθμιση κωδικών πρόσβασης για τα κλειδιά root και tagging, με το Docker να υποστηρίζει επίσης Yubikey για αυξημένη ασφάλεια. Περισσότερες λεπτομέρειες μπορείτε να βρείτε εδώ.
Η προσπάθεια λήψης μιας μη υπογεγραμμένης εικόνας με ενεργοποιημένη την εμπιστοσύνη περιεχομένου έχει ως αποτέλεσμα ένα σφάλμα "No trust data for latest".
Για τις μεταφορτώσεις εικόνας μετά την πρώτη, το Docker ζητά τον κωδικό πρόσβασης του κλειδιού αποθετηρίου για να υπογράψει την εικόνα.
Για να δημιουργήσετε αντίγραφα ασφαλείας των ιδιωτικών σας κλειδιών, χρησιμοποιήστε την εντολή:
Όταν αλλάζετε Docker hosts, είναι απαραίτητο να μεταφέρετε τα κλειδιά root και repository για να διατηρήσετε τις λειτουργίες.
Χρησιμοποιήστε Trickest για να δημιουργήσετε και να αυτοματοποιήσετε ροές εργασίας με τη βοήθεια των πιο προηγμένων εργαλείων της κοινότητας. Αποκτήστε πρόσβαση σήμερα:
Namespaces είναι μια δυνατότητα του πυρήνα Linux που διαχωρίζει τους πόρους του πυρήνα έτσι ώστε ένα σύνολο διαδικασιών να βλέπει ένα σύνολο πόρων ενώ ένα άλλο σύνολο διαδικασιών βλέπει ένα διαφορετικό σύνολο πόρων. Η δυνατότητα λειτουργεί με το να έχει τον ίδιο namespace για ένα σύνολο πόρων και διαδικασιών, αλλά αυτοί οι namespaces αναφέρονται σε διακριτούς πόρους. Οι πόροι μπορεί να υπάρχουν σε πολλαπλούς χώρους.
Το Docker χρησιμοποιεί τους παρακάτω Namespaces του πυρήνα Linux για να επιτύχει την απομόνωση των Container:
pid namespace
mount namespace
network namespace
ipc namespace
UTS namespace
Για περισσότερες πληροφορίες σχετικά με τους namespaces ελέγξτε την παρακάτω σελίδα:
NamespacesΗ δυνατότητα του πυρήνα Linux cgroups παρέχει τη δυνατότητα να περιορίσει τους πόρους όπως cpu, μνήμη, io, εύρος ζώνης δικτύου μεταξύ ενός συνόλου διαδικασιών. Το Docker επιτρέπει τη δημιουργία Containers χρησιμοποιώντας τη δυνατότητα cgroup που επιτρέπει τον έλεγχο των πόρων για το συγκεκριμένο Container. Ακολουθεί ένα Container που δημιουργήθηκε με περιορισμένη μνήμη χώρου χρήστη στα 500m, περιορισμένη μνήμη πυρήνα στα 50m, μερίδιο cpu στα 512, blkio-weight στα 400. Το μερίδιο CPU είναι μια αναλογία που ελέγχει τη χρήση CPU του Container. Έχει προεπιλεγμένη τιμή 1024 και εύρος μεταξύ 0 και 1024. Εάν τρία Containers έχουν το ίδιο μερίδιο CPU 1024, κάθε Container μπορεί να καταναλώσει έως και 33% της CPU σε περίπτωση διαμάχης πόρων CPU. Το blkio-weight είναι μια αναλογία που ελέγχει το IO του Container. Έχει προεπιλεγμένη τιμή 500 και εύρος μεταξύ 10 και 1000.
Για να αποκτήσετε το cgroup ενός κοντέινερ, μπορείτε να κάνετε:
Για περισσότερες πληροφορίες ελέγξτε:
CGroupsΟι δυνατότητες επιτρέπουν πιο λεπτομερή έλεγχο για τις δυνατότητες που μπορούν να επιτραπούν για τον χρήστη root. Το Docker χρησιμοποιεί τη δυνατότητα του πυρήνα Linux για να περιορίσει τις λειτουργίες που μπορούν να γίνουν μέσα σε ένα Container ανεξαρτήτως του τύπου χρήστη.
Όταν εκτελείται ένα docker container, η διαδικασία απορρίπτει ευαίσθητες δυνατότητες που θα μπορούσε να χρησιμοποιήσει για να ξεφύγει από την απομόνωση. Αυτό προσπαθεί να διασφαλίσει ότι η διαδικασία δεν θα είναι σε θέση να εκτελέσει ευαίσθητες ενέργειες και να ξεφύγει:
Linux CapabilitiesΑυτή είναι μια λειτουργία ασφαλείας που επιτρέπει στο Docker να περιορίσει τις syscalls που μπορούν να χρησιμοποιηθούν μέσα στο container:
SeccompAppArmor είναι μια βελτίωση του πυρήνα για να περιορίσει containers σε ένα περιορισμένο σύνολο πόρων με προφίλ ανά πρόγραμμα.:
AppArmorΣύστημα Ετικετών: Το SELinux αναθέτει μια μοναδική ετικέτα σε κάθε διαδικασία και αντικείμενο συστήματος αρχείων.
Επιβολή Πολιτικής: Επιβάλλει πολιτικές ασφαλείας που καθορίζουν ποιες ενέργειες μπορεί να εκτελέσει μια ετικέτα διαδικασίας σε άλλες ετικέτες εντός του συστήματος.
Ετικέτες Διαδικασίας Container: Όταν οι μηχανές container ξεκινούν διαδικασίες container, συνήθως τους ανατίθεται μια περιορισμένη ετικέτα SELinux, συνήθως container_t
.
Ετικετοποίηση Αρχείων μέσα σε Containers: Τα αρχεία μέσα στο container συνήθως ετικετοποιούνται ως container_file_t
.
Κανόνες Πολιτικής: Η πολιτική SELinux διασφαλίζει κυρίως ότι οι διαδικασίες με την ετικέτα container_t
μπορούν να αλληλεπιδρούν μόνο (ανάγνωση, εγγραφή, εκτέλεση) με αρχεία που ετικετοποιούνται ως container_file_t
.
Αυτός ο μηχανισμός διασφαλίζει ότι ακόμη και αν μια διαδικασία μέσα σε ένα container παραβιαστεί, περιορίζεται να αλληλεπιδρά μόνο με αντικείμενα που έχουν τις αντίστοιχες ετικέτες, περιορίζοντας σημαντικά τη δυνητική ζημιά από τέτοιες παραβιάσεις.
SELinuxΣτο Docker, ένα πρόσθετο εξουσιοδότησης παίζει κρίσιμο ρόλο στην ασφάλεια αποφασίζοντας αν θα επιτρέψει ή θα αποκλείσει αιτήματα προς τον Docker daemon. Αυτή η απόφαση λαμβάνεται εξετάζοντας δύο βασικά συμφραζόμενα:
Συμφραζόμενα Αυθεντικοποίησης: Αυτό περιλαμβάνει λεπτομερείς πληροφορίες σχετικά με τον χρήστη, όπως ποιος είναι και πώς έχει αυθεντικοποιηθεί.
Συμφραζόμενα Εντολής: Αυτό περιλαμβάνει όλα τα σχετικά δεδομένα που σχετίζονται με το αίτημα που υποβάλλεται.
Αυτά τα συμφραζόμενα βοηθούν να διασφαλιστεί ότι μόνο νόμιμα αιτήματα από αυθεντικοποιημένους χρήστες επεξεργάζονται, ενισχύοντας την ασφάλεια των λειτουργιών του Docker.
AuthZ& AuthN - Docker Access Authorization PluginΕάν δεν περιορίζετε σωστά τους πόρους που μπορεί να χρησιμοποιήσει ένα container, ένα παραβιασμένο container θα μπορούσε να προκαλέσει DoS στον κεντρικό υπολογιστή όπου εκτελείται.
CPU DoS
Επιθέσεις DoS μέσω εύρους ζώνης
Στην παρακάτω σελίδα μπορείτε να μάθετε τι υποδηλώνει το flag --privileged
:
Εάν εκτελείτε ένα κοντέινερ όπου ένας επιτιθέμενος καταφέρνει να αποκτήσει πρόσβαση ως χρήστης χαμηλών δικαιωμάτων. Εάν έχετε μια κακώς ρυθμισμένη δυαδική suid, ο επιτιθέμενος μπορεί να την εκμεταλλευτεί και να κλιμακώσει τα δικαιώματα μέσα στο κοντέινερ. Αυτό μπορεί να του επιτρέψει να διαφύγει από αυτό.
Η εκτέλεση του κοντέινερ με την επιλογή no-new-privileges
ενεργοποιημένη θα αποτρέψει αυτόν τον τύπο κλιμάκωσης δικαιωμάτων.
Για περισσότερες επιλογές --security-opt
ελέγξτε: https://docs.docker.com/engine/reference/run/#security-configuration
Είναι κρίσιμο να αποφεύγεται η ενσωμάτωση μυστικών απευθείας σε εικόνες Docker ή η χρήση μεταβλητών περιβάλλοντος, καθώς αυτές οι μέθοδοι εκθέτουν τις ευαίσθητες πληροφορίες σας σε οποιονδήποτε έχει πρόσβαση στο κοντέινερ μέσω εντολών όπως docker inspect
ή exec
.
Docker volumes είναι μια πιο ασφαλής εναλλακτική, που συνιστάται για την πρόσβαση σε ευαίσθητες πληροφορίες. Μπορούν να χρησιμοποιηθούν ως προσωρινό σύστημα αρχείων στη μνήμη, μειώνοντας τους κινδύνους που σχετίζονται με το docker inspect
και την καταγραφή. Ωστόσο, οι χρήστες root και αυτοί με πρόσβαση exec
στο κοντέινερ μπορεί να έχουν ακόμα πρόσβαση στα μυστικά.
Docker secrets προσφέρουν μια ακόμη πιο ασφαλή μέθοδο για τη διαχείριση ευαίσθητων πληροφοριών. Για περιπτώσεις που απαιτούν μυστικά κατά τη διάρκεια της φάσης κατασκευής της εικόνας, το BuildKit προσφέρει μια αποδοτική λύση με υποστήριξη για μυστικά κατά την κατασκευή, βελτιώνοντας την ταχύτητα κατασκευής και παρέχοντας επιπλέον δυνατότητες.
Για να αξιοποιήσετε το BuildKit, μπορεί να ενεργοποιηθεί με τρεις τρόπους:
Μέσω μιας μεταβλητής περιβάλλοντος: export DOCKER_BUILDKIT=1
Προσθέτοντας πρόθεμα στις εντολές: DOCKER_BUILDKIT=1 docker build .
Ενεργοποιώντας το από προεπιλογή στη ρύθμιση Docker: { "features": { "buildkit": true } }
, ακολουθούμενο από μια επανεκκίνηση του Docker.
Το BuildKit επιτρέπει τη χρήση μυστικών κατά την κατασκευή με την επιλογή --secret
, διασφαλίζοντας ότι αυτά τα μυστικά δεν περιλαμβάνονται στην κρυφή μνήμη κατασκευής της εικόνας ή στην τελική εικόνα, χρησιμοποιώντας μια εντολή όπως:
Για τα μυστικά που απαιτούνται σε ένα τρέχον κοντέινερ, Docker Compose και Kubernetes προσφέρουν ισχυρές λύσεις. Το Docker Compose χρησιμοποιεί ένα κλειδί secrets
στην ορισμό υπηρεσίας για να καθορίσει αρχεία μυστικών, όπως φαίνεται σε ένα παράδειγμα docker-compose.yml
:
Αυτή η ρύθμιση επιτρέπει τη χρήση μυστικών κατά την εκκίνηση υπηρεσιών με το Docker Compose.
Σε περιβάλλοντα Kubernetes, τα μυστικά υποστηρίζονται εγγενώς και μπορούν να διαχειριστούν περαιτέρω με εργαλεία όπως το Helm-Secrets. Οι Ρόλοι Βασισμένοι σε Έλεγχο Πρόσβασης (RBAC) του Kubernetes ενισχύουν την ασφάλεια διαχείρισης μυστικών, παρόμοια με το Docker Enterprise.
gVisor είναι ένας πυρήνας εφαρμογής, γραμμένος σε Go, που υλοποιεί ένα σημαντικό μέρος της επιφάνειας συστήματος Linux. Περιλαμβάνει ένα Open Container Initiative (OCI) runtime που ονομάζεται runsc
που παρέχει ένα όριο απομόνωσης μεταξύ της εφαρμογής και του πυρήνα του host. Το runtime runsc
ενσωματώνεται με το Docker και το Kubernetes, καθιστώντας απλό το τρέξιμο sandboxed containers.
Kata Containers είναι μια κοινότητα ανοιχτού κώδικα που εργάζεται για την κατασκευή ενός ασφαλούς runtime container με ελαφριές εικονικές μηχανές που αισθάνονται και αποδίδουν όπως containers, αλλά παρέχουν ισχυρότερη απομόνωση φόρτου εργασίας χρησιμοποιώντας τεχνολογία εικονικοποίησης υλικού ως δεύτερη γραμμή άμυνας.
Μην χρησιμοποιείτε τη σημαία --privileged
ή να τοποθετείτε ένα Docker socket μέσα στο container. Το docker socket επιτρέπει την εκκίνηση containers, οπότε είναι ένας εύκολος τρόπος να αποκτήσετε πλήρη έλεγχο του host, για παράδειγμα, εκτελώντας ένα άλλο container με τη σημαία --privileged
.
Μην τρέχετε ως root μέσα στο container. Χρησιμοποιήστε έναν διαφορετικό χρήστη και user namespaces. Ο root στο container είναι ο ίδιος με τον host εκτός αν ανακατανεμηθεί με user namespaces. Είναι μόνο ελαφρώς περιορισμένος από, κυρίως, Linux namespaces, δυνατότητες και cgroups.
Αφαιρέστε όλες τις δυνατότητες (--cap-drop=all
) και ενεργοποιήστε μόνο αυτές που απαιτούνται (--cap-add=...
). Πολλές από τις φόρτους εργασίας δεν χρειάζονται καμία δυνατότητα και η προσθήκη τους αυξάνει την έκταση μιας πιθανής επίθεσης.
Χρησιμοποιήστε την επιλογή ασφαλείας “no-new-privileges” για να αποτρέψετε τις διαδικασίες από το να αποκτούν περισσότερες δυνατότητες, για παράδειγμα μέσω suid binaries.
Περιορίστε τους πόρους που είναι διαθέσιμοι στο container. Οι περιορισμοί πόρων μπορούν να προστατεύσουν τη μηχανή από επιθέσεις άρνησης υπηρεσίας.
Χρησιμοποιήστε επίσημες εικόνες docker και απαιτήστε υπογραφές ή κατασκευάστε τις δικές σας βασισμένες σε αυτές. Μην κληρονομείτε ή χρησιμοποιείτε backdoored εικόνες. Αποθηκεύστε επίσης τα κλειδιά root, τη φράση πρόσβασης σε ασφαλές μέρος. Το Docker έχει σχέδια να διαχειρίζεται τα κλειδιά με το UCP.
Ανακατασκευάστε τακτικά τις εικόνες σας για να εφαρμόσετε διορθώσεις ασφαλείας στον host και στις εικόνες.
Διαχειριστείτε τα μυστικά σας σοφά ώστε να είναι δύσκολο για τον επιτιθέμενο να τα αποκτήσει.
Εάν εκθέτετε τον docker daemon χρησιμοποιήστε HTTPS με πιστοποίηση πελάτη και διακομιστή.
Στο Dockerfile σας, προτιμήστε το COPY αντί για το ADD. Το ADD εξάγει αυτόματα αρχεία zip και μπορεί να αντιγράψει αρχεία από URLs. Το COPY δεν έχει αυτές τις δυνατότητες. Όποτε είναι δυνατόν, αποφύγετε τη χρήση του ADD ώστε να μην είστε ευάλωτοι σε επιθέσεις μέσω απομακρυσμένων URLs και Zip αρχείων.
Έχετε χωριστά containers για κάθε μικρο-υπηρεσία
Μην βάζετε ssh μέσα στο container, το “docker exec” μπορεί να χρησιμοποιηθεί για ssh στο Container.
Έχετε μικρότερες εικόνες containers
Εάν είστε μέσα σε ένα docker container ή έχετε πρόσβαση σε έναν χρήστη στην ομάδα docker, μπορείτε να προσπαθήσετε να διαφύγετε και να κλιμακώσετε τα προνόμια:
Docker Breakout / Privilege EscalationΕάν έχετε πρόσβαση στο docker socket ή έχετε πρόσβαση σε έναν χρήστη στην ομάδα docker αλλά οι ενέργειές σας περιορίζονται από ένα plugin αυθεντικοποίησης docker, ελέγξτε αν μπορείτε να παρακάμψετε το:
AuthZ& AuthN - Docker Access Authorization PluginΤο εργαλείο docker-bench-security είναι ένα σενάριο που ελέγχει δεκάδες κοινές βέλτιστες πρακτικές γύρω από την ανάπτυξη Docker containers σε παραγωγή. Οι δοκιμές είναι όλες αυτοματοποιημένες και βασίζονται στο CIS Docker Benchmark v1.3.1. Πρέπει να εκτελέσετε το εργαλείο από τον host που τρέχει το docker ή από ένα container με αρκετά προνόμια. Ανακαλύψτε πώς να το εκτελέσετε στο README: https://github.com/docker/docker-bench-security.
Χρησιμοποιήστε Trickest για να κατασκευάσετε και να αυτοματοποιήσετε ροές εργασίας που υποστηρίζονται από τα πιο προηγμένα εργαλεία της κοινότητας. Αποκτήστε Πρόσβαση Σήμερα:
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)