Kubernetes Pivoting to Clouds
GCP
Εάν εκτελείτε έναν cluster k8s μέσα στο GCP, πιθανώς θέλετε να δώσετε κάποια πρόσβαση στο GCP σε μια εφαρμογή που εκτελείται μέσα στο cluster. Υπάρχουν 2 κοινοί τρόποι για να το κάνετε αυτό:
Τοποθέτηση των κλειδιών GCP-SA ως μυστικό
Ένας κοινός τρόπος να δώσετε πρόσβαση σε μια εφαρμογή Kubernetes στο GCP είναι να:
Δημιουργήσετε έναν λογαριασμό υπηρεσίας GCP
Συσχετίστε τα επιθυμητά δικαιώματα με αυτόν
Κατεβάστε ένα κλειδί json για τον δημιουργημένο λογαριασμό υπηρεσίας
Τοποθετήστε το ως μυστικό μέσα στο pod
Ορίστε τη μεταβλητή περιβάλλοντος GOOGLE_APPLICATION_CREDENTIALS που δείχνει στη διαδρομή όπου βρίσκεται το json.
Συνεπώς, ως επιτιθέμενος, αν εξαπολύσετε μια επίθεση σε έναν container μέσα σε ένα pod, θα πρέπει να ελέγξετε αν υπάρχει αυτή η μεταβλητή περιβάλλοντος και αρχεία json με διαπιστευτήρια GCP.
Συσχέτιση του json GSA με το μυστικό KSA
Ένας τρόπος να δώσετε πρόσβαση σε έναν GSA σε ένα GKE cluster είναι να τους συσχετίσετε με τον εξής τρόπο:
Δημιουργήστε έναν λογαριασμό υπηρεσίας Kubernetes στον ίδιο χώρο ονομάτων με τον GKE cluster σας χρησιμοποιώντας την παρακάτω εντολή:
Δημιουργήστε ένα Kubernetes Secret που περιέχει τα διαπιστευτήρια του λογαριασμού υπηρεσίας GCP στον οποίο θέλετε να παραχωρήσετε πρόσβαση στο GKE cluster. Μπορείτε να το κάνετε αυτό χρησιμοποιώντας το εργαλείο γραμμής εντολών
gcloud
, όπως φαίνεται στο παρακάτω παράδειγμα:
Δέστε το Kubernetes Secret στον λογαριασμό υπηρεσίας του Kubernetes χρησιμοποιώντας την παρακάτω εντολή:
Στο δεύτερο βήμα έχουν οριστεί οι πιστοποιήσεις του GSA ως μυστικό του KSA. Στη συνέχεια, αν μπορείτε να διαβάσετε αυτό το μυστικό από μέσα στο GKE cluster, μπορείτε να αναβαθμιστείτε σε αυτόν τον λογαριασμό υπηρεσίας GCP.
Ταυτοποίηση Φορτίου Εργασίας GKE
Με την Ταυτοποίηση Φορτίου Εργασίας, μπορούμε να διαμορφώσουμε έναν λογαριασμό υπηρεσίας Kubernetes για να λειτουργεί ως ένας λογαριασμός υπηρεσίας Google. Τα pods που εκτελούνται με τον λογαριασμό υπηρεσίας Kubernetes θα πιστοποιούνται αυτόματα ως ο λογαριασμός υπηρεσίας Google κατά την πρόσβαση στις υπηρεσίες Google Cloud.
Τα πρώτα βήματα για να ενεργοποιήσετε αυτήν τη συμπεριφορά είναι να ενεργοποιήσετε την Ταυτοποίηση Φορτίου Εργασίας στο GCP (βήματα) και να δημιουργήσετε τον GCP SA που θέλετε το k8s να προσωποποιήσει.
Ενεργοποίηση της Ταυτοποίησης Φορτίου Εργασίας σε ένα νέο cluster
Δημιουργία/Ενημέρωση νέου nodepool (Τα Autopilot clusters δεν χρειάζονται αυτό)
Δημιουργήστε τον λογαριασμό υπηρεσίας GCP για εκπροσώπηση από το K8s με δικαιώματα GCP:
Συνδεθείτε στο cluster και δημιουργήστε τον λογαριασμό υπηρεσίας που θα χρησιμοποιήσετε
Συνδέστε το GSA με το KSA
Εκτελέστε ένα pod με το KSA και ελέγξτε την πρόσβαση στο GSA:
Ελέγξτε την παρακάτω εντολή για να πιστοποιηθείτε σε περίπτωση που χρειαστεί:
Ως επιτιθέμενος μέσα στο K8s θα πρέπει να αναζητήσετε τα SAs με την iam.gke.io/gcp-service-account
σημείωση καθώς αυτό υποδηλώνει ότι το SA μπορεί να έχει πρόσβαση σε κάτι στο GCP. Μια άλλη επιλογή θα ήταν να προσπαθήσετε να καταχραστείτε κάθε KSA στο cluster και να ελέγξετε αν έχει πρόσβαση.
Από το GCP είναι πάντα ενδιαφέρον να απαριθμήσετε τις συνδέσεις και να γνωρίζετε ποια πρόσβαση δίνετε στα SAs μέσα στο Kubernetes.
Αυτό είναι ένα σενάριο για να επαναλάβετε εύκολα όλες τις ορισμένες pods αναζητώντας αυτήν τη σημείωση:
AWS
Kiam & Kube2IAM (IAM ρόλος για Pods)
Ένας (απαρχαιωμένος) τρόπος να δίνετε IAM ρόλους σε Pods είναι να χρησιμοποιήσετε έναν Kiam ή έναν Kube2IAM server. Βασικά, θα πρέπει να εκτελέσετε ένα daemonset στο cluster σας με έναν είδος προνομιούχου IAM ρόλου. Αυτό το daemonset θα είναι αυτό που θα δίνει πρόσβαση σε IAM ρόλους στα pods που το χρειάζονται.
Καταρχήν, πρέπει να διαμορφώσετε ποιοι ρόλοι μπορούν να προσπελαστούν μέσα στο namespace, και το κάνετε με μια σημείωση μέσα στο αντικείμενο namespace:
Μόλις ο χώρος ονομάτων έχει διαμορφωθεί με τους ρόλους IAM που μπορεί να έχουν τα Pods, μπορείτε να υποδείξετε τον ρόλο που θέλετε σε κάθε ορισμό περιγραφής του pod με κάτι όπως:
Ως επιτιθέμενος, αν βρείτε αυτές τις επισημάνσεις σε pods ή namespaces ή έναν τρέχοντα διακομιστή kiam/kube2iam (πιθανώς στο kube-system), μπορείτε να υποκριθείτε σε κάθε ρόλο που χρησιμοποιείται ήδη από τα pods και περισσότερους (αν έχετε πρόσβαση στον λογαριασμό AWS, απαριθμήστε τους ρόλους).
Δημιουργία Pod με ρόλο IAM
Ο ρόλος IAM που πρέπει να δηλωθεί πρέπει να βρίσκεται στον ίδιο λογαριασμό AWS με τον ρόλο kiam/kube2iam και αυτός ο ρόλος πρέπει να έχει πρόσβαση σε αυτόν.
IAM Ρόλος για Λογαριασμούς Υπηρεσίας K8s μέσω OIDC
Αυτός είναι ο συνιστώμενος τρόπος από την AWS.
Καταρχήν, χρειάζεται να δημιουργήσετε έναν πάροχο OIDC για το cluster.
Στη συνέχεια, δημιουργείτε έναν IAM ρόλο με τα απαιτούμενα δικαιώματα για τον ΛΥ.
Δημιουργήστε μια σχέση εμπιστοσύνης μεταξύ του IAM ρόλου και του ΛΥ με το όνομα (ή τα namespaces που παρέχουν πρόσβαση στον ρόλο για όλους τους ΛΥ του namespace). Η σχέση εμπιστοσύνης θα ελέγχει κυρίως το όνομα του πάροχου OIDC, το όνομα του namespace και το όνομα του ΛΥ.
Τέλος, δημιουργήστε έναν ΛΥ με ένα σχόλιο που υποδηλώνει το ARN του ρόλου, και οι pods που τρέχουν με αυτόν τον ΛΥ θα έχουν πρόσβαση στο token του ρόλου. Το token είναι γραμμένο μέσα σε ένα αρχείο και η διαδρομή καθορίζεται στο
AWS_WEB_IDENTITY_TOKEN_FILE
(προεπιλογή:/var/run/secrets/eks.amazonaws.com/serviceaccount/token
)
Για να πάρετε το aws χρησιμοποιώντας το token από το /var/run/secrets/eks.amazonaws.com/serviceaccount/token
, εκτελέστε:
Ως επιτιθέμενος, αν μπορείτε να απαριθμήσετε ένα cluster K8s, ελέγξτε για λογαριασμούς υπηρεσίας με αυτήν την αναφορά για να εξελιχθείτε σε AWS. Για να το κάνετε αυτό, απλά εκτελέστε/δημιουργήστε ένα pod χρησιμοποιώντας έναν από τους προνομιούχους λογαριασμούς υπηρεσίας IAM και κλέψτε το διακριτικό.
Επιπλέον, αν βρίσκεστε μέσα σε ένα pod, ελέγξτε τις μεταβλητές περιβάλλοντος όπως AWS_ROLE_ARN και AWS_WEB_IDENTITY_TOKEN.
Μερικές φορές η Πολιτική Εμπιστοσύνης ενός ρόλου μπορεί να είναι κακά διαμορφωμένη και αντί να δίνει πρόσβαση AssumeRole στον αναμενόμενο λογαριασμό υπηρεσίας, τη δίνει σε όλους τους λογαριασμούς υπηρεσίας. Επομένως, αν μπορείτε να γράψετε μια αναφορά σε έναν ελεγχόμενο λογαριασμό υπηρεσίας, μπορείτε να αποκτήσετε πρόσβαση στον ρόλο.
Ελέγξτε τη σελίδα που ακολουθεί για περισσότερες πληροφορίες:
Εύρεση Pods και SAs με IAM Roles στο Cluster
Αυτό είναι ένα σενάριο για να επαναλάβετε εύκολα όλα τα pods και τις ορισμένες sas ψάχνοντας για αυτήν την αναφορά:
Ρόλος IAM του κόμβου
Η προηγούμενη ενότητα αφορούσε το πώς να κλέψετε τους ρόλους IAM με τις pods, αλλά σημειώστε ότι ένας κόμβος του K8s cluster θα είναι ένα παράδειγμα μέσα στο cloud. Αυτό σημαίνει ότι είναι πολύ πιθανό ο κόμβος να έχει έναν νέο ρόλο IAM που μπορείτε να κλέψετε (σημειώστε ότι συνήθως όλοι οι κόμβοι ενός K8s cluster θα έχουν τον ίδιο ρόλο IAM, οπότε μπορεί να μην αξίζει να προσπαθήσετε να ελέγξετε κάθε κόμβο).
Ωστόσο, υπάρχει ένα σημαντικό απαιτούμενο για να έχετε πρόσβαση στο metadata endpoint από τον κόμβο, πρέπει να είστε στον κόμβο (ssh session;) ή τουλάχιστον να έχετε το ίδιο δίκτυο:
Κλέψτε το IAM Role Token
Προηγουμένως έχουμε συζητήσει πώς να συνδέσουμε IAM Roles σε Pods ή ακόμα και πώς να δραπετεύσουμε στον Node για να κλέψουμε το IAM Role που έχει συνδεθεί με το στιγμιότυπο.
Μπορείτε να χρησιμοποιήσετε τον παρακάτω κώδικα για να κλέψετε τα νέα σας διαπιστευτήρια IAM role:
Αναφορές
Last updated