Hinweis:

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.

Lösungsarchitektur

Beschreibung der Abbildung SolutionArchitecture.png

Ziele

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.

  1. Erstellen Sie die OCI-Queue für eingehende Anforderungen. Weitere Informationen finden Sie unter Erstellen einer Queue.

  2. Erstellen Sie die OCI-Funktion zur Autorisierung von Benutzern. Weitere Informationen finden Sie unter Funktionen erstellen.

  3. 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.

  1. 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>'
    
  2. 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.

  3. Oracle Identity Cloud Service-Rolle für dynamische Gruppen konfigurieren.

    IDCS-Domainrolle

    Beschreibung der Abbildung DomainRole.png

  4. 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.

  1. 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"
    
  2. 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)
    
  3. 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
    
  4. 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)
    
  5. 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.

Send Message

Beschreibung der Abbildung send-message.png

Prüfen

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.

  1. 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, die image-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.

  2. 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.

  3. 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"}
    

Danksagungen

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.