Πώς μπορείτε να καλέσετε ασφαλή μια λειτουργία σύννεφου από το Google Kubernetes Engine που εκτελείται σε άλλο έργο GCP

Σε σύνθετα περιβάλλοντα όπου διαφορετικές ομάδες διαχειρίζονται τα δικά τους έργα του Google Cloud, είναι δύσκολο να βεβαιωθείτε ότι μια υπηρεσία σε ένα έργο μπορεί να προσεγγιστεί μόνο από συγκεκριμένες εφαρμογές που εκτελούνται σε άλλα έργα Google Cloud. Συμπληρωματικά προγράμματα VPC peering και εσωτερικά συστήματα εξισορρόπησης φορτίου είναι συχνά αναπόφευκτα και μερικές φορές είναι ακόμη αδύνατο να επιτευχθεί επικοινωνία μεταξύ έργων χωρίς να εκτίθενται υπηρεσίες στο δημόσιο διαδίκτυο όπου εμπλέκονται πολλές περιοχές.

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

Πιστωτικό: Neil Kolban

Η ομάδα δεν θέλησε μόνο τη δυνατότητα να εκτελεί αυτό το εσωτερικό API σε περιβάλλον χωρίς διακομιστές, ο μεγαλύτερος στόχος τους ήταν να αποφευχθεί μια περίπλοκη εσωτερική ρύθμιση ισορροπίας φορτίου και να εκφορτωθεί όλο το service-to-service έλεγχο ταυτότητας στην Google. Με αυτόν τον τρόπο, δεν θα έπρεπε να διαχειρίζονται περίπλοκους κανόνες τείχους προστασίας, να επικοινωνούν με τους πελάτες όταν οι κανόνες αυτοί απαιτούν αλλαγές, να διαχειρίζονται μια λύση ταυτότητας και να αναλαμβάνουν τον κίνδυνο διαχείρισης διαπιστευτηρίων σε διάφορες ομάδες.

Είναι απολύτως εφικτό να καλέσετε μια λειτουργία σύννεφου χρησιμοποιώντας έναν λογαριασμό υπηρεσίας από άλλο έργο GCP. Όταν συνδυάζεται με τεχνολογίες όπως η Ταυτότητα φόρτου εργασίας στο GKE, είναι δυνατόν να επιτρέπεται η επίκληση μιας λειτουργίας Cloud μόνο από μια συγκεκριμένη εφαρμογή που εκτελείται σε οποιοδήποτε σύμπλεγμα GKE σε οποιοδήποτε έργο και να διαχειριστείτε όλα αυτά χωρίς να διαχειρίζεστε εσείς τα κλειδιά και απαιτώντας μεγάλες αλλαγές στην πλευρά του πελάτη.

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

Σε αυτό το σεμινάριο θα δημιουργήσουμε μια ιδιωτική συνάρτηση Cloud σε ένα έργο GCP. Στη συνέχεια, θα εγκρίνουμε έναν λογαριασμό υπηρεσίας από άλλο έργο GCP και θα δούμε πώς μπορούμε να επικαλεστεί τη λειτουργία χρησιμοποιώντας αυτόν τον λογαριασμό υπηρεσίας. Θα δούμε πώς να το κάνουμε αυτό με προγραμματισμό και τελικά να βάλουμε τα κομμάτια μαζί για να επιτύχουμε πλήρη ρύθμιση της αυθεντικότητας.

Παρασκευή

Για να ολοκληρώσετε αυτό το σεμινάριο, χρειάζεστε δύο έργα του Google Cloud. Θα καλέσουμε ένα από αυτά ως Project Host και το άλλο ως Project Client. Το πρώτο είναι όπου πρόκειται να δημιουργήσετε ένα έργο και το άλλο είναι εκεί όπου η αίτησή σας και ο λογαριασμός υπηρεσίας είναι.

Θα χρειαστείτε ρόλο ρόλου του Cloud Functions Admin (cloudfunctions.admin) στο Project Host για να μπορέσετε να ορίσετε την πολιτική IAM της λειτουργίας. Χρειάζεστε ρόλους διαχειριστή λογαριασμού υπηρεσίας (iam.serviceAccountAdmin) και χρήστη λογαριασμού υπηρεσίας (iam.serviceAccountUser), προκειμένου να δημιουργήσετε λογαριασμούς υπηρεσιών και τα κλειδιά τους στο Project Client.

Δημιουργία της λειτουργίας

Πλοηγηθείτε στο έργο υποδοχής και δημιουργήστε μια νέα λειτουργία σύννεφου στην κονσόλα GCP. Επιλέξτε HTTP ως ενεργοποιητή. Βεβαιωθείτε ότι έχετε αφήσει μη επιλεγμένο Να επιτρέπεται μη επαληθευμένες επικλήσεις για να επιτρέπεται η κλήση μόνο με ένα έγκυρο διακριτικό πρόσβασης GCP. Εάν δεν μπορείτε να καταργήσετε την επιλογή του πλαισίου, αυτό σημαίνει ότι δεν έχετε αναθέσει τον ρόλο διαχειριστή λειτουργιών Cloud στο λογαριασμό σας.

Σε μερικά δευτερόλεπτα, θα εμφανιστεί η διεύθυνση URL για να αποκτήσετε πρόσβαση στην λειτουργία αυτή στην κονσόλα. Αυτή η διεύθυνση URL έχει την ακόλουθη μορφή:

https://REGION-HOST_PROJECT_ID.cloudfunctions.net/FUNCTION_NAME

Τρέξιμο

curl https://REGION-HOST_PROJECT_ID.cloudfunctions.net/FUNCTION_NAME

για να βεβαιωθείτε ότι δεν σας επιτρέπεται να επικαλεστεί τη λειτουργία.

Δημιουργία λογαριασμού υπηρεσίας σε άλλο έργο

Χρησιμοποιήστε την ακόλουθη εντολή για να δημιουργήσετε έναν λογαριασμό υπηρεσίας στο πρόγραμμα-πελάτη:

gcloud iam υπηρεσία-λογαριασμοί δημιουργούν cloud-invoke-test \ --project CLIENT_PROJECT_ID

Δημιουργήστε ένα κλειδί JSON για το λογαριασμό υπηρεσίας:

gcloud iam κλειδιά υπηρεσίας-λογαριασμών δημιουργία credentials.json --iam-account \ [email protected]_PROJECT_ID.iam.gserviceaccount.com

Εκτέλεση της λειτουργίας με διαπιστευτήρια λογαριασμού υπηρεσίας

Ενεργοποιήστε τον λογαριασμό υπηρεσίας για το gcloud σας:

gcloud auth ενεργοποιήστε-service-account --key-file = credentials.json

Τώρα, η εντολή gcloud σας ενεργεί ως λογαριασμός υπηρεσίας. Το κουπόνι του κομιστή που πρέπει να καλέσετε τη λειτουργία λαμβάνεται μέσω της ακόλουθης εντολής:

gcloud auth εκτύπωση-ταυτότητα-διακριτικό

Βεβαιωθείτε ότι έχετε λάβει ένα διακριτικό μετά την εκτέλεση της εντολής.

Τώρα, μπορείτε να προσθέσετε αυτό το διακριτικό στο αίτημα και να προσπαθήσετε να καλέσετε τη λειτουργία:

curl https://REGION-HOST_PROJECT_ID.cloudfunctions.net/FUNCTION_NAME -H "Εξουσιοδότηση: Φορέας $ (gcloud auth print-identity-token)"

Αυτή η αίτηση θα αποτύχει, καθώς η λειτουργία Cloud δεν έχει ρυθμιστεί ώστε να δέχεται αιτήματα από αυτόν τον λογαριασμό υπηρεσίας.

Παροχή δικαιωμάτων στη λειτουργία

Δεδομένου ότι είστε Διαχειριστής λειτουργιών Cloud, μπορείτε να ορίσετε πολιτικές IAM για κάθε λειτουργία Cloud. Τώρα μπορείτε να εκχωρήσετε δικαιώματα ρόλων / cloudfunctions.invoker στον λογαριασμό υπηρεσίας από το πρόγραμμα πελάτη μέσω της ακόλουθης εντολής:

gcloud άλφα λειτουργίες add-iam-πολιτική-δεσμευτική FUNCTION_NAME \ - περιοχή REGION - σχέδιο HOST_PROJECT_ID - μέλος υπηρεσίαAccount: [email protected]_PROJECT_ID.iam.gserviceaccount.com \ - roles ρόλους / cloudfunctions.invoker - λογαριασμός ΤΟ ΗΛΕΚΤΡΟΝΙΚΟ ΣΟΥ ΤΑΧΥΔΡΟΜΕΙΟ

Λάβετε υπόψη ότι έπρεπε να προσθέσουμε την παράμετρο - λογαριασμός επειδή στο προηγούμενο βήμα ενεργοποιήσατε τον λογαριασμό υπηρεσίας ως την προεπιλεγμένη ταυτότητά σας. Ωστόσο, ο λογαριασμός υπηρεσίας δεν έχει δικαιώματα για να ορίσετε την πολιτική του IAM στη συνάρτηση Cloud, επομένως πρέπει να ενεργήσουμε ως λογαριασμός χρήστη.

Μετά από μερικά λεπτά, όταν διευθετούνται τα δικαιώματα, εκτελέστε ξανά την εντολή curl με το αναγνωριστικό πρόσβασης:

curl https://REGION-HOST_PROJECT_ID.cloudfunctions.net/FUNCTION_NAME -H "Εξουσιοδότηση: Φορέας $ (gcloud auth print-identity-token)"

Θα δείτε την έξοδο της λειτουργίας Cloud.

Προγραμματική κλήση της Λειτουργίας με ένα διακριτικό (on-premise)

Για εφαρμογές που εκτελούνται σε περιβάλλον επί τόπου, είναι δυνατή η διανομή του κλειδιού λογαριασμού υπηρεσίας μαζί με την εφαρμογή και η χρήση της βιβλιοθήκης auth της Google για τη δημιουργία του διακριτικού. Παρακάτω μπορείτε να βρείτε ένα παράδειγμα στο Node.js:

Σημειώστε ότι το κοινό είναι ίσο με το URL επικλήσεως κατά την εξαγωγή ενός διακριτικού πρόσβασης μέσω του κλειδιού του λογαριασμού υπηρεσίας.

Ανατρέξτε στην Τεκμηρίωση του Google Cloud IAP για περισσότερα παραδείγματα σε άλλες γλώσσες προγραμματισμού.

Προγραμματικά επικαλούμενη τη λειτουργία από φορτία εργασίας του GKE χρησιμοποιώντας την ταυτότητα φόρτου εργασίας

Αν η εφαρμογή σας εργάζεται στο GKE (ή στο GCE με υπολογιστικά μεταδεδομένα), είναι δυνατή η εξαγωγή του διακριτικού πρόσβασης απευθείας από το API Metadata. Σε αυτήν την περίπτωση, δεν χρειάζεται να χρησιμοποιείτε τις βιβλιοθήκες Auth της Google, αλλά μπορείτε να αποκτήσετε το διακριτικό πρόσβασης μέσω απλής HTTP και να το προσθέσετε στο αίτημά σας στη λειτουργία Cloud.

Όταν η εφαρμογή σας εκτελείται στο GKE, μπορείτε να χρησιμοποιήσετε την ταυτότητα φόρτου εργασίας για να αποφασίσετε ποιο Kubernetes Pod (που στην πραγματικότητα λειτουργεί ο λογαριασμός υπηρεσίας Kubernetes με το οποίο λειτουργεί το Pod) μπορεί να αναλάβει τον ρόλο του GCP.

Δεδομένου ότι η τεκμηρίωση είναι αρκετά λεπτομερής, παρακάμπτουμε εδώ, εξηγώντας πώς να ρυθμίσετε την Ταυτότητα φόρτου εργασίας για ένα Pod. Μόλις ολοκληρώσετε τη ρύθμιση και εκτελέσετε ένα Pod με το λογαριασμό υπηρεσίας GCP που δημιουργήσατε πριν, η παρακάτω διεύθυνση URL θα επιστρέψει το κλειδί πρόσβασης από το εσωτερικό του Pod:

http: // metadata / computeMetadata / v1 / instance / service-accounts / προεπιλογή / ταυτότητα; κοινότοπος = https: //REGION-HOST_PROJECT_ID.cloudfunctions.net/FUNCTION_NAME

Η εφαρμογή σας μπορεί να έχει πρόσβαση σε αυτήν τη διεύθυνση URL και να ανακτά το διακριτικό πρόσβασης και στη συνέχεια να προσθέσει αυτό το διακριτικό στο αίτημα λειτουργίας Cloud για να πιστοποιήσει τον εαυτό του.

Σημειώστε ότι αυτή η μέθοδος δεν χρησιμοποιεί το κλειδί του λογαριασμού υπηρεσίας που δημιουργήσατε προηγουμένως. Μπορείτε πραγματικά και πρέπει να διαγράψετε όλα τα κλειδιά του λογαριασμού υπηρεσίας που δημιουργήσατε, αφού όλη η ιδέα πίσω από αυτή τη ρύθμιση δεν χρειάζεται να διαχειριστεί τα διαπιστευτήρια.

Ανατρέξτε στο έγγραφο της Google για λεπτομερή παραδείγματα.

συμπέρασμα

Εάν είστε κάτοχος υπηρεσίας εκθέτοντας ένα API ως Cloud Function, μπορείτε να ζητήσετε από τους πελάτες σας να δημιουργήσουν λογαριασμούς υπηρεσίας GCP και να τους αντιστοιχίσουν στο φόρτο εργασίας GKE από τον οποίο θα αποκτήσουν πρόσβαση στη λειτουργία σας. Μόλις μάθετε ποιο είναι το ηλεκτρονικό ταχυδρομείο του λογαριασμού υπηρεσίας GCP που θα χρησιμοποιήσει αυτή η εφαρμογή, μπορείτε να προχωρήσετε και να προσθέσετε αυτό το μήνυμα ηλεκτρονικού ταχυδρομείου στην πολιτική IAM της λειτουργίας σας. Με αυτόν τον τρόπο, δεν θα πρέπει να διαχειριστείτε (ακόμη και να δημιουργήσετε) κλειδιά, την ασφάλειά τους και την εναλλαγή. Θα βεβαιωθείτε πάντοτε ότι η λειτουργία σας μπορεί να καλείται μόνο από αυτόν τον λογαριασμό υπηρεσίας και ο πελάτης σας μπορεί να μετακινήσει αυτόν τον λογαριασμό γύρω για να επιτρέψει σε περισσότερες εφαρμογές να έχουν πρόσβαση στη λειτουργία σας. Δεν θα χρειαστεί να επικοινωνήσετε για να διαχειριστείτε μπλοκ IP, να διαπραγματευτείτε τα διαπιστευτήρια και να εργαστείτε σε όλη την κουραστική δουλειά της ετοιμότητας παραγωγής, να πάρει όλο αυτό το διάστημα πίσω για να επικεντρωθεί στην επιχείρησή σας αντ 'αυτού. Επιπλέον, δεν απαιτείται περισσότερη από μία κλήση HTTP για την προσαρμογή της εφαρμογής πελάτη.