Hinweis:
- Dieses Tutorial erfordert Zugriff auf Oracle Cloud. Informationen zur Registrierung für einen kostenlosen Account finden Sie unter Erste Schritte mit Oracle Cloud Infrastructure Free Tier.
- Es verwendet Beispielwerte für Oracle Cloud Infrastructure-Zugangsdaten, -Mandanten und -Compartments. Ersetzen Sie diese Werte nach Abschluss der Übung durch Werte, die für Ihre Cloud-Umgebung spezifisch sind.
Benutzerfunktionen mit OCI Functions und OCI Queue autorisieren, ohne Genehmigern die Admin-Berechtigung bereitzustellen
Einführung
Die Aktualisierung von Benutzerfunktionen ist für viele Unternehmen von entscheidender Bedeutung, insbesondere wenn die für Benutzer autorisierte Berechtigung wie die Konsolenfunktion oder der API-Schlüssel sensibel ist. Wie wir jedoch in der Oracle Cloud Infrastructure-(OCI-)Dokumentation festgestellt haben, können nur Benutzer in der Administratorengruppe die Benutzerfunktion autorisieren, selbst wenn es Oracle Cloud Infrastructure Identity and Access Management-(OCI IAM-)Policys gibt, die dies explizit zulassen. Weitere Informationen finden Sie unter Benutzer verwalten.
In diesem Tutorial wird eine Lösung für das Szenario demonstriert, in dem Benutzer nicht zur Administratorengruppe einer OCI-IAM-Domain gehören, aber dennoch die Möglichkeit haben müssen, die Benutzerfunktionen zu autorisieren, indem sie das neu veröffentlichte Feature von OCI Connector Hub verwenden, um OCI Queue und OCI Functions zu integrieren.
Beschreibung der Abbildung SolutionArchitecture.png
Ziele
-
Autorisieren Sie Benutzerfunktionen, indem Sie das Integrationsfeature von OCI Connector Hub zwischen OCI Queue und OCI Functions nutzen.
-
Lernen Sie einen Cloud-nativen Ansatz kennen, um Lösungen zu entwickeln, mit denen die Berechtigungen zur Genehmigung entkoppelt und die Benutzeranforderungen als fein granulierte IAM-Implementierung auf OCI ausgeführt werden können.
-
Erfahren Sie, wie Sie Benutzer mit der python-API in OCI Functions verwalten.
-
Lernen Sie die Verwendung dynamischer Gruppen zur Verwendung der Autorisierung von Ressourcengrundsätzen auf OCI kennen.
Aufgabe 1: Messaging-Kanal von OCI Queue zu OCI Functions erstellen
Der wesentliche Teil der Lösung besteht darin, die erforderliche Berechtigung zu entkoppeln, indem Benutzerfunktionen von der Berechtigung geändert werden, die der Genehmiger zur Genehmigung einer Anforderung benötigt.
-
Erstellen Sie die OCI-Queue für eingehende Anforderungen. Weitere Informationen finden Sie unter Erstellen einer Queue.
-
Erstellen Sie die OCI-Funktion zur Autorisierung von Benutzern. Weitere Informationen finden Sie unter Funktionen erstellen.
-
Konfigurieren Sie die OCI Queue- und OCI Functions-Integration über OCI Connector Hub. Stellen Sie sicher, dass die Quelle mit der erstellten OCI-Queue angegeben ist und dass das Ziel OCI Functions sein muss. Die optionale Aufgabe bleibt in diesem Tutorial leer. Weitere Informationen finden Sie unter Verfügbarkeit von OCI Queue als Quelle in OCI Connector Hub anzeigen.
Aufgabe 2: OCI-IAM-Policys und dynamische Gruppe konfigurieren
Nachdem wir die Rollen des Genehmigers in die OCI-Queue aufgeteilt haben, um die Anforderungen zu übernehmen, und die OCI Functions, um die Anforderung auszuführen, müssen wir strenge OCI-IAM-Policys konfigurieren, um sicherzustellen, dass die Berechtigung nicht missbraucht wird. Da wir diese Lösung entwickelt haben, um einen Kunden zu unterstützen, der darauf besteht, das Root Compartment für die Implementierung zu verwenden, werden wir alle Konfigurationen aus dem Root Compartment für den OCI IAM-Teil demonstrieren.
-
Nur der Genehmiger darf Queue-Nachrichten in die OCI-Zielqueue pushen.
Allow group 'testApprover' to use queues in tenancy
Durch Hinzufügen dieser Policy können die Benutzer in der Gruppe testApprover die Queue verwenden, um die Konsolenzugriffsanforderungen zu empfangen. Wir können mehr Einschränkungen für die Gruppe setzen, indem wir nur die Berechtigung für den Ressourcentyp queue-push angeben, wie im folgenden Beispiel dargestellt.
use queue-push in compartment <compartment> where target.queue.id = '<queue_ocid>'
-
Konfigurieren Sie die dynamische Gruppe so, dass sie OCI Functions einbezieht, indem Sie die folgende Übereinstimmungsregel angeben.
ALL{resource.type='fnfunc',resource.id='ocid.fnfunc.oc1.....'}
Diese dynamische Gruppe wird dann mit einer Oracle Identity Cloud Service-Rolle autorisiert, um die Benutzer in der Domain zu verwalten.
-
Oracle Identity Cloud Service-Rolle für dynamische Gruppen konfigurieren.
-
Konfigurieren Sie die OCI Functions so, dass sie nur von der OCI-Queue aufgerufen werden können. Im folgenden Beispiel wird die Quelle des Aufrufs nur auf Queues beschränkt. Es kann sogar strenger werden, wenn Tags für die Ressourcen verwendet werden. Weitere Informationen finden Sie unter Tags zum Verwalten des Zugriffs verwenden.
Allow service faas to use functions-family in tenancy where request.principal.type='queues'
Aufgabe 3: OCI Functions-Code erstellen
Wir müssen einen Python-Code für die OCI Functions erstellen, um die Anforderung aus der OCI-Queue auszuführen.
-
Die OCI Queue-Nachricht wird an die Funktion im Objekt data übergeben.
def handler(ctx, data: bytes = None) -> response.Response: try: # Parse the message from the OCI Queue if data: message = json.loads(data.getvalue().decode('utf-8')) else: message = "no useremail received"
-
Authentifizieren Sie sich mit dem Resource Principal.
Hinweis: Die folgende Codezeile funktioniert möglicherweise nicht in einer IDE.
identity = IdentityClient({}, signer=oci.auth.signers.get_resource_principals_signer(), region=region)
-
Konvertieren Sie die an die Oracle Cloud-ID (OCID) des Benutzers übergebene Benutzer-E-Mail.
def get_user_ocid_by_email(identity_client,email,tenancy_id): # List all users in the tenancy users = oci.pagination.list_call_get_all_results(identity_client.list_users,tenancy_id).data # Find the user with the matching email address for user in users: if user.email.lower() == email.lower(): return user.id return None
-
Aktualisieren Sie die Benutzerfunktion mit dem Resource Principal mit der Funktion IdentityClient.
# Get the user by email address user_ocid = get_user_ocid_by_email(identity,user_email,tenancy) # Update user capabilities (example: enable API keys) update_details = oci.identity.models.UpdateUserCapabilitiesDetails( can_use_api_keys=True, can_use_auth_tokens=True, can_use_console_password=True, can_use_customer_secret_keys=True, can_use_db_credentials=True, can_use_o_auth2_client_credentials=True, can_use_smtp_credentials=True ) # Update the user identity.update_user_capabilities(user_ocid, update_details)
-
Stellen Sie den Funktionscode in der gerade erstellten OCI-Funktion bereit. Ausführliche Schritte zum Deployment einer OCI-Funktion finden Sie unter Konfigurationshinweise für OCI Functions
Aufgabe 4: Änderungen testen
Testen Sie die Änderungen, indem Sie eine Nachricht an die Ziel-Queue senden. Wir können die OCI-Konsole verwenden oder ein beliebiges SDK verwenden, einschließlich OCI Cloud Shell.
Beschreibung der Abbildung send-message.png
Beschreibung der Abbildung examine.png
Problembehandlung
OCI-Funktion zur Verwendung von OCIR konfigurieren
Wenn Sie OCIR als Repository der OCI-Funktion verwenden, blockieren Sie möglicherweise einige Probleme, und es ist nicht so einfach, eine Lösung zu finden, da derzeit kein eindeutiger Leitfaden nachgewiesen wird, um solche Probleme zu vermeiden.
-
Spezifisches Compartment für OCIR-Repository und OCI-Funktion als Funktionskontext konfigurieren. Standardmäßig zeigt der Kontext des OCIR-Repositorys auf das Root Compartment, selbst wenn Sie der Anweisungsseite in der Konsole folgen, um unter cloud shell-Befehlen auszuführen.
fn update context oracle.compartment-id ocid1.tenancy.oc1.....
Hinweis: Dieser Teil ist ziemlich irreführend, da bei
oracle.compartment-id
die Leute denken, dass diese Eigenschaft sowohl für die Funktion als auch für OCIR gilt. Wir haben jedoch eine separate Eigenschaft für OCIR, dieimage-compartment-id
lautet. Wenn Sie also ein benanntes Compartment zum Ausführen der Funktion und zum Speichern des Images verwenden, stellen Sie sicher, dass beide Compartment-IDs explizit mit den folgenden OCI Cloud Shell-Befehlen festgelegt sind. Die entsprechende OCI-IAM-Policy muss auch so konfiguriert sein, dass die Aktionen zwischen OCIR und der Funktion auch zulässig sind, wenn sie aus verschiedenen benannten Compartments stammen.fn update context oracle.image-compartment-id <compartment-ocid> fn update context oracle.compartment-id <compartment-ocid>
Wenn dies nicht richtig gemacht wird, werden Sie auf verdrahtete 403 Fehler stoßen und da Sie möglicherweise nicht einmal die
image-compartment-id
kennen, ist es schwer, einen Hinweis zu finden. -
Konfigurieren Sie die Funktion für die Verwendung von OCIR, während OCI Cloud Shell aus einer Netzwerkumgebung gestartet wird, die für docker.io zugänglich ist, da für die Verarbeitung des Images Docker-APIs angewendet werden müssen. In der Regel ermöglicht Ihnen ein OCI-Servicenetzwerk keinen Zugriff. Wir empfehlen Ihnen, das öffentliche Netzwerk für das Container-Deployment zu verwenden, wenn Sie die OCI Cloud Shell verwenden.
Weitere Informationen finden Sie unter Functions: Erste Schritte mit Cloud Shell.
-
Ein weiterer potenzieller Blocker ist hier, wenn Sie versuchen, die Warteschlangennachricht an die Funktionseingaben zu übergeben. In anderen Artikeln zur Übergabe in der Variablen finden Sie mehrere Referenzen. Tatsächlich ist es jedoch so einfach, den json einzugeben und im data-Objekt im Python-Code zu empfangen.
Hinweis: Vermeiden Sie die Verwendung des Javascript-Typs "json" mit einfachen Anführungszeichen oder ohne Anführungszeichen, da derzeit nur die strenge Syntax von der OCI-Queue erkannt werden konnte.
{"name":"John"}
Verwandte Links
Danksagungen
- Autor - Henry Deng (Principal Solution Engineer)
Weitere Lernressourcen
Sehen Sie sich andere Übungen zu docs.oracle.com/learn an, oder greifen Sie im Oracle Learning YouTube-Channel auf weitere kostenlose Lerninhalte zu. Besuchen Sie außerdem education.oracle.com/learning-explorer, um Oracle Learning Explorer zu werden.
Die Produktdokumentation finden Sie im Oracle Help Center.
Use OCI Functions and OCI Queue to Authorize User Capabilities without Exposing Admin Privilege to Approvers
G16872-03
October 2024