Docker Security
Last updated
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Χρησιμοποιήστε το Trickest για να δημιουργήσετε εύκολα και να αυτοματοποιήσετε ροές εργασίας με τα πιο προηγμένα εργαλεία της κοινότητας. Αποκτήστε πρόσβαση σήμερα:
Το Docker engine χρησιμοποιεί τα Namespaces και Cgroups του πυρήνα του Linux για να απομονώσει τα containers, προσφέροντας ένα βασικό επίπεδο ασφάλειας. Επιπλέον προστασία παρέχεται μέσω της πτώσης των Δυνατοτήτων (Capabilities), του Seccomp, και του SELinux/AppArmor, ενισχύοντας την απομόνωση των containers. Ένα πρόσθετο πιστοποίησης (auth plugin) μπορεί να περιορίσει περαιτέρω τις ενέργειες του χρήστη.
Το Docker engine μπορεί να προσπελαστεί είτε τοπικά μέσω ενός Unix socket είτε απομακρυσμένα χρησιμοποιώντας HTTP. Για την απομακρυσμένη πρόσβαση, είναι απαραίτητο να χρησιμοποιηθεί το HTTPS και το TLS για να διασφαλιστεί η εμπιστευτικότητα, η ακεραιότητα και η ταυτοποίηση.
Το Docker engine, από προεπιλογή, ακούει στο Unix socket στη διεύθυνση unix:///var/run/docker.sock
. Στα συστήματα Ubuntu, οι επιλογές εκκίνησης του Docker ορίζονται στο /etc/default/docker
. Για να επιτρέψετε την απομακρυσμένη πρόσβαση στο API και στον πελάτη του Docker, εκθέστε τον δαίμονα του Docker μέσω ενός socket HTTP προσθέτοντας τις παρακάτω ρυθμίσεις:
Ωστόσο, δεν συνιστάται η εκθεση του 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 εξασφαλίζει την ασφάλεια και ακεραιότητα των εικόνων που χρησιμοποιούνται σε containers. Εδώ υπάρχει μια συνοπτική εξήγηση:
Για να ενεργοποιήσετε την εμπιστοσύνη περιεχομένου Docker, ορίστε export DOCKER_CONTENT_TRUST=1
. Αυτή η λειτουργία είναι απενεργοποιημένη από προεπιλογή στην έκδοση Docker 1.10 και μετά.
Με αυτήν τη λειτουργία ενεργοποιημένη, μόνο υπογεγραμμένες εικόνες μπορούν να ληφθούν. Η πρώτη αποστολή εικόνας απαιτεί την ορισμό κωδικών πρόσβασης για τα κλειδιά ρίζας και ετικέτας, με την Docker να υποστηρίζει επίσης το Yubikey για ενισχυμένη ασφάλεια. Περισσότερες λεπτομέρειες μποροϋν να βρεθούν εδώ.
Η προσπάθεια να γίνει λήψη μιας μη υπογεγραμμένης εικόνας με την εμπιστοσύνη περιεχομένου ενεργοποιημένη οδηγεί σε σφάλμα "Δεν υπάρχουν δεδομένα εμπιστοσύνης για το τελευταίο".
Για αποστολές εικόνων μετά την πρώτη, η Docker ζητά τον κωδικό πρόσβασης του κλειδιού αποθήκης για να υπογράψει την εικόνα.
Για να δημιουργήσετε αντίγραφο ασφαλείας των ιδιωτικών κλειδιών σας, χρησιμοποιήστε την εντολή:
Όταν γίνεται μετάβαση σε νέους hosts του Docker, είναι απαραίτητο να μεταφερθούν τα root και repository keys για τη διατήρηση της λειτουργικότητας.
Χρησιμοποιήστε το Trickest για εύκολη δημιουργία και αυτοματοποίηση workflows με την υποστήριξη των πιο προηγμένων εργαλείων της κοινότητας. Αποκτήστε πρόσβαση σήμερα:
Τα Namespaces είναι μια λειτουργία του πυρήνα του Linux που διαχωρίζει τους πόρους του πυρήνα έτσι ώστε ένα σύνολο διεργασιών να βλέπει ένα σύνολο πόρων ενώ ένα άλλο σύνολο διεργασιών βλέπει ένα διαφορετικό σύνολο πόρων. Η λειτουργία λειτουργεί με το να έχει το ίδιο namespace για ένα σύνολο πόρων και διεργασιών, αλλά αυτά τα namespaces αναφέρονται σε διακριτούς πόρους. Οι πόροι μπορεί να υπάρχουν σε πολλούς χώρους.
Το Docker χρησιμοποιεί τα ακόλουθα Namespaces του πυρήνα του Linux για να επιτύχει την απομόνωση των Containers:
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, blkioweight σε 400. Η μοίρα cpu είναι ένας λόγος που ελέγχει τη χρήση CPU του Container. Έχει προεπιλεγμένη τιμή 1024 και εύρος μεταξύ 0 και 1024. Αν τρία Containers έχουν την ίδια μοίρα cpu των 1024, κάθε Container μπορεί να πάρει μέχρι 33% της CPU σε περίπτωση ανταγωνισμού πόρων CPU. Το blkio-weight είναι ένας λόγος που ελέγχει το IO του Container. Έχει προεπιλεγμένη τιμή 500 και εύρος μεταξύ 10 και 1000.
Για να πάρετε το cgroup ενός container μπορείτε να κάνετε:
Για περισσότερες πληροφορίες ελέγξτε:
CGroupsΟι δυνατότητες επιτρέπουν πιο λεπτό έλεγχο για τις δυνατότητες που μπορούν να επιτραπούν για το χρήστη root. Το Docker χρησιμοποιεί το χαρακτηριστικό δυνατοτήτων του πυρήνα Linux για περιορισμό των λειτουργιών που μπορούν να γίνουν μέσα σε ένα Container ανεξαρτήτως του τύπου του χρήστη.
Όταν τρέχει ένας Docker container, η διαδικασία απορρίπτει ευαίσθητες δυνατότητες που θα μπορούσε να χρησιμοποιήσει η διαδικασία για να δραπετεύσει από την απομόνωση. Αυτό προσπαθεί να διασφαλίσει ότι η διαδικασία δεν θα μπορεί να εκτελέσει ευαίσθητες ενέργειες και να δραπετεύσει:
Linux CapabilitiesΑυτό είναι ένα χαρακτηριστικό ασφαλείας που επιτρέπει στο Docker να περιορίσει τις κλήσεις συστήματος που μπορούν να χρησιμοποιηθούν μέσα στο container:
SeccompAppArmor είναι μια βελτίωση πυρήνα για να περιορίσει τα containers σε ένα περιορισμένο σύνολο πόρων με προφίλ ανά πρόγραμμα.:
AppArmorΣύστημα Ετικετών: Το SELinux αναθέτει μια μοναδική ετικέτα σε κάθε διεργασία και αντικείμενο συστήματος αρχείων.
Επιβολή Πολιτικής: Επιβάλλει πολιτικές ασφαλείας που ορίζουν ποιες ενέργειες μπορεί να εκτελέσει μια ετικέτα διεργασίας σε άλλες ετικέτες εντός του συστήματος.
Ετικέτες Διεργασίας Εμποράς: Όταν οι μηχανές container εκκινούν διεργασίες container, συνήθως τους ανατίθεται μια περιορισμένη ετικέτα SELinux, συνήθως container_t
.
Ετικέτες Αρχείων εντός των Containers: Τα αρχεία μέσα στο container συνήθως επισημαίνονται ως container_file_t
.
Κανόνες Πολιτικής: Η πολιτική SELinux κυρίως εξασφαλίζει ότι οι διεργασίες με ετικέτα container_t
μπορούν να αλληλεπιδρούν μόνο (ανάγνωση, εγγραφή, εκτέλεση) με αρχεία που έχουν επισημανθεί ως container_file_t
.
Αυτός ο μηχανισμός εξασφαλίζει ότι ακόμη και αν μια διαδικασία μέσα σε ένα container είναι εκτεθειμένη, περιορίζεται στην αλληλεπίδραση μόνο με αντικείμενα που έχουν τις αντίστοιχες ετικέτες, περιορίζοντας σημαντικά την πιθανή ζημιά από τέτοιες εκθέσεις.
SELinuxΣτο Docker, ένα πρόσθετο εξουσιοδότησης παίζει έναν κρίσιμο ρόλο στην ασφάλεια αποφασίζοντας εάν θα επιτραπεί ή θα αποκλειστούν αιτήσεις προς τον δαίμονα του Docker. Αυτή η απόφαση λαμβάνεται εξετάζοντας δύο βασικά πλαίσια:
Πλαίσιο Ταυτοποίησης: Αυτό περιλαμβάνει πλήρεις πληροφορίες σχετικά με τον χρήστη, όπως ποιος είναι και πώς έχει ταυτοποιηθεί.
Πλαίσιο Εντολής: Αυτό περιλαμβάνει όλα τα σχετικά δεδομένα που σχετίζονται με το αίτημα που γίνεται.
Αυτά τα πλαίσια βοηθούν στη διασφάλιση ότι μόνο νόμιμα αιτήματα από εξουσιοδοτημένους χρήστες επεξεργάζονται, ενισχύοντας την ασφάλεια των λειτουργιών του Docker.
AuthZ& AuthN - Docker Access Authorization PluginΑν δεν περιορίζετε σωστά τους πόρους που μπορεί να χρησιμοποιήσει ένα container, ένας χαλασμένος container μπορεί να προκαλέσει DoS στον υπολογιστή όπου τρέχει.
CPU DoS
Bandwidth DoS
Στην παρακάτω σελίδα μπορείτε να μάθετε τι σημαίνει η σημαία --privileged
:
Εάν εκτελείτε ένα container όπου ένας επιτιθέμενος καταφέρνει να αποκτήσει πρόσβαση ως χρήστης με χαμηλά προνόμια. Εάν έχετε ένα μη σωστά ρυθμισμένο suid binary, ο επιτιθέμενος μπορεί να το καταχραστεί και να εξελίξει τα προνόμια μέσα στο container. Αυτό, μπορεί να του επιτρέψει να δραπετεύσει από αυτό.
Η εκτέλεση του container με την επιλογή no-new-privileges
ενεργοποιημένη θα εμποδίσει αυτήν τη μορφή εξέλιξης προνομίων.
Για περισσότερες επιλογές --security-opt
ελέγξτε: https://docs.docker.com/engine/reference/run/#security-configuration
Είναι κρίσιμο να αποφεύγετε την ενσωμάτωση μυστικών απευθείας στις εικόνες Docker ή τη χρήση μεταβλητών περιβάλλοντος, καθώς αυτές οι μέθοδοι εκθέτουν τις ευαίσθητες πληροφορίες σας σε οποιονδήποτε έχει πρόσβαση στο container μέσω εντολών όπως docker inspect
ή exec
.
Τα Docker volumes αποτελούν μια ασφαλέστερη εναλλακτική λύση, συνιστώμενη για την πρόσβαση σε ευαίσθητες πληροφορίες. Μπορούν να χρησιμοποιηθούν ως προσωρινό σύστημα αρχείων στη μνήμη, μειώνοντας τους κινδύνους που σχετίζονται με το docker inspect
και την καταγραφή. Ωστόσο, οι χρήστες ριζικού και εκείνοι με πρόσβαση exec
στο container ενδέχεται να έχουν πρόσβαση στα μυστικά.
Τα Docker secrets προσφέρουν μια ακόμη πιο ασφαλή μέθοδο για τη χειρισμό ευαίσθητων πληροφοριών. Για περιπτώσεις που απαιτούν μυστικά κατά τη φάση κατασκευής της εικόνας, το BuildKit παρουσιάζει μια αποτελεσματική λύση με υποστήριξη για μυστικά κατά την κατασκευή, βελτιώνοντας την ταχύτητα κατασκευής και παρέχοντας επιπλέον χαρακτηριστικά.
Για να εκμεταλλευτείτε το BuildKit, μπορεί να ενεργοποιηθεί με τρεις τρόπους:
Μέσω μεταβλητής περιβάλλοντος: export DOCKER_BUILDKIT=1
Με προθέματα εντολών: DOCKER_BUILDKIT=1 docker build .
Ενεργοποιώντας το από προεπιλογή στη διαμόρφωση του Docker: { "features": { "buildkit": true } }
, ακολουθούμενο από επανεκκίνηση του Docker.
Το BuildKit επιτρέπει τη χρήση μυστικών κατά την κατασκευή με την επιλογή --secret
, εξασφαλίζοντας ότι αυτά τα μυστικά δεν περιλαμβάνονται στην προσωρινή μνήμη κατασκευής της εικόνας ή στην τελική εικόνα, χρησιμοποιώντας μια εντολή όπως:
Για τα μυστικά που χρειάζονται σε ένα τρέχον container, το Docker Compose και το Kubernetes προσφέρουν αξιόπιστες λύσεις. Το Docker Compose χρησιμοποιεί ένα κλειδί secrets
στον ορισμό της υπηρεσίας για την καθορισμό μυστικών αρχείων, όπως φαίνεται σε ένα παράδειγμα docker-compose.yml
:
Αυτή η διαμόρφωση επιτρέπει τη χρήση μυστικών κατά την εκκίνηση υπηρεσιών με το Docker Compose.
Σε περιβάλλοντα Kubernetes, τα μυστικά υποστηρίζονται φυσικά και μπορούν να διαχειριστούν περαιτέρω με εργαλεία όπως το Helm-Secrets. Τα Role Based Access Controls (RBAC) του Kubernetes βελτιώνουν την ασφάλεια διαχείρισης μυστικών, παρόμοια με το Docker Enterprise.
gVisor είναι ένα πυρήνας εφαρμογής, γραμμένος σε Go, που υλοποιεί ένα σημαντικό μέρος της επιφάνειας συστήματος Linux. Περιλαμβάνει ένα Open Container Initiative (OCI) runtime με το όνομα runsc
που παρέχει μια οριοθετημένη περιοχή μεταξύ της εφαρμογής και του πυρήνα του υπολογιστή. Το runtime runsc
ενσωματώνεται με το Docker και το Kubernetes, κάνοντας εύκολη την εκτέλεση container σε αμμόλοφο.
Kata Containers είναι μια κοινότητα ανοιχτού κώδικα που εργάζεται για τη δημιουργία ενός ασφαλούς runtime container με ελαφριές εικονικές μηχανές που αισθάνονται και λειτουργούν όπως τα containers, αλλά παρέχουν ισχυρότερη απομόνωση φορτίου εργασίας χρησιμοποιώντας τεχνολογία εικονικοποίησης υλικού ως δεύτερο επίπεδο άμυνας.
Μην χρησιμοποιείτε τη σημαία --privileged
ή προσαρτήστε ένα Docker socket μέσα στο container. Το docker socket επιτρέπει τη δημιουργία container, είναι ένα εύκολος τρόπος να αναλάβετε πλήρη έλεγχο του υπολογιστή φιλοξενίας, για παράδειγμα, με την εκτέλεση ενός άλλου container με τη σημαία --privileged
.
Μην τρέχετε ως root μέσα στο container. Χρησιμοποιήστε έναν διαφορετικό χρήστη και user namespaces. Το root στο container είναι το ίδιο με αυτόν στον υπολογιστή φιλοξενίας εκτός αν γίνει αντιστοίχιση με user namespaces. Είναι ελαφρά περιορισμένο από, κυρίως, τα Linux namespaces, τις δυνατότητες και τα cgroups.
Απορρίψτε όλες τις δυνατότητες (--cap-drop=all
) και ενεργοποιήστε μόνο αυτές που απαιτούνται (--cap-add=...
). Πολλά φορτία εργασίας δεν χρειάζονται καμία δυνατότητα και η προσθήκη τους αυξάνει το πεδίο μιας πιθανής επίθεσης.
Χρησιμοποιήστε την επιλογή ασφαλείας “no-new-privileges” για να εμποδίσετε τις διεργασίες από το να αποκτήσουν περισσότερα προνόμια, για παράδειγμα μέσω suid δυαδικών.
Περιορίστε τους διαθέσιμους πόρους στο container. Οι περιορισμοί πόρων μπορούν να προστατεύσουν τον υπολογιστή από επιθέσεις αρνησης υπηρεσίας.
Χρησιμοποιήστε επίσημες εικόνες docker και απαιτήστε υπογραφές ή δημιουργήστε τις δικές σας βασισμένες σε αυτές. Μην κληρονομείτε ή χρησιμοποιείτε εικόνες με πίσω πόρτες. Αποθηκεύστε επίσης τα ριζικά κλειδιά, τον κωδικό πρόσβασης σε ασφαλές μέρος. Το Docker έχει σχέδια για τη διαχείριση των κλειδιών με το UCP.
Αναδημιουργήστε τακτικά τις εικόνες σας για να εφαρμόσετε περιορισμούς ασφαλείας στον υπολογιστή και τις εικόνες.
Διαχειριστείτε τα μυστικά σας με σύνεση ώστε να είναι δύσκολο για τον επιτιθέμενο να τα αποκτήσει.
Αν εκθέτετε τον δαίμονα του docker χρησιμοποιήστε HTTPS με πιστοποίηση πελάτη & εξυπηρετητή.
Στο Dockerfile σας, προτιμήστε το COPY αντί του ADD. Το ADD αυτόματα εξάγει συμπιεσμένα αρχεία και μπορεί να αντιγράψει αρχεία από διευθύνσεις URL. Το COPY δεν έχει αυτές τις δυνατότητες. Όποτε είναι δυνατόν, αποφύγετε τη χρήση του ADD ώστε να μην είστε ευάλωτοι σε επιθέσεις μέσω απομακρυσμένων διευθύνσεων URL και αρχείων Zip.
Έχετε ξεχωριστά containers για κάθε μικρο-υπηρεσία
Μην τοποθετείτε ssh μέσα στο container, το “docker exec” μπορεί να χρησιμοποιηθεί για ssh στο Container.
Έχετε μικρότερες εικόνες containers
Αν βρίσκεστε μέσα σε ένα container docker ή έχετε πρόσβαση σε έναν χρήστη στη ομάδα docker, μπορείτε να προσπαθήσετε να διαφύγετε και να αναβαθμίσετε προνόμια:
Docker Breakout / Privilege EscalationΑν έχετε πρόσβαση στο socket του docker ή έχετε πρόσβαση σε έναν χρήστη στη ομάδα docker αλλά οι ενέργειές σας περιορίζονται από ένα πρόσθετο πιστοποίησης docker, ελέγξτε αν μπορείτε να το παρακάμψετε:
AuthZ& AuthN - Docker Access Authorization PluginΤο εργαλείο docker-bench-security είναι ένα σενάριο που ελέγχει δεκάδες κοινές βέλτιστες πρακτικές γύρω από την ανάπτυξη container Docker σε παραγωγή. Οι δοκιμές είναι όλες αυτοματοποιημένες και βασίζονται στο CIS Docker Benchmark v1.3.1. Πρέπει να εκτελέσετε το εργαλείο από τον υπολογιστή που εκτελεί το docker ή από ένα container με αρκετά προνόμια. Βρείτε πώς να το εκτελέσετε στο README: https://github.com/docker/docker-bench-security.
[ Μάθε & εξάσκησε στο Hacking του AWS: Εκπαίδευση HackTricks AWS Red Team Expert (ARTE) Μάθε & εξάσκησε στο Hacking του GCP: Εκπαίδευση HackTricks GCP Red Team Expert (GRTE)