Hinweis:

Automatisieren Sie das Update des Instance Metadata Service auf Version 2 nur für OCI Compute-Instanzen mit Ereignisregeln und Python-Funktionen

Einführung

Die Gewährleistung von Sicherheit und Konsistenz über Cloud-Umgebungen hinweg ist für moderne Unternehmen eine Priorität. In Oracle Cloud Infrastructure (OCI) stellt der Instance Metadata Service (IMDS) wichtige instanzspezifische Informationen bereit. Durch die Durchsetzung der Verwendung von Version 2 (IMDSv2) wird die Sicherheit erhöht, da eine sessionbasierte Authentifizierung erforderlich ist. Die Automatisierung des Upgrades auf IMDSv2 über alle OCI Compute-Instanzen hinweg ist eine effektive Möglichkeit, diesen Sicherheitsstandard aufrechtzuerhalten und gleichzeitig den manuellen Aufwand zu reduzieren.

Dieses Tutorial zeigt, wie Sie einen automatisierten, ereignisgesteuerten Workflow mit OCI Events Service-Regeln und OCI Functions erstellen, um das Update IMDSv2 durchzusetzen. Durch die Nutzung der Python-basierten Automatisierung erstellen und konfigurieren Sie die erforderlichen OCI-Ressourcen wie dynamische Gruppen, Ereignisregeln und serverlose Funktionen, um die Einhaltung dieses erweiterten Sicherheitsprotokolls nahtlos sicherzustellen.

Ziele

Instanz-IMDS-Update

Voraussetzungen

Aufgabe 1: Dynamische Gruppe erstellen

Definieren Sie eine dynamische Gruppe, damit die Funktion auf die Zielinstanzen zugreifen kann. Um andere OCI-Services verwenden zu können, muss Ihre Funktion Teil einer dynamischen Gruppe sein.

ALL {resource.type = 'fnfunc'}

Wenn Sie die Übereinstimmungsregeln angeben, wird empfohlen, alle Funktionen in einem Compartment mit Folgendem abzugleichen:

ALL {resource.type = 'fnfunc', resource.compartment.id = 'ocid1.compartment.oc1..aaaaaxxxxx'}

Dynamische Gruppe

Aufgabe 2: OCI-IAM-Policys definieren

Erstellen Sie eine neue Policy, mit der die dynamische Gruppe Compute-Instanzen verwalten kann. Wir erteilen Verwaltungszugriff auf Instanzen im spezifischen Compartment.

Allow dynamic-group dmg-for-functions to manage instance-family in compartment Compartment-Name
Allow dynamic-group dmg-for-functions to manage functions-family in compartment Compartment-Name
Allow dynamic-group dmg-for-functions to use virtual-network-family in compartment Compartment-Name
Allow dynamic-group dmg-for-functions to manage instances in compartment Compartment-Name
Allow dynamic-group dmg-for-functions to read repos in compartment Compartment-Name

Policys

Aufgabe 3: OCI Functions erstellen und bereitstellen

Erstellen, implementieren und rufen Sie die Funktion für das IMDS-Update auf.

  1. Erstellen Sie eine Anwendung in der OCI-Konsole.

    Melden Sie sich bei der OCI-Konsole an, navigieren Sie zu Entwicklerservices, Funktionen, und klicken Sie auf Anwendungen. Wählen Sie die entsprechende Region für OCI Functions aus, und klicken Sie auf Anwendung erstellen.

    OCI Functions

  2. Richten Sie die Umgebung für das Funktions-Deployment ein, und führen Sie das folgende Setup in Ihrer OCI Cloud Shell- oder OCI Compute-Instanz (mit Oracle Linux 8) oder in jedem System aus, in dem Sie die Funktion erstellen und bereitstellen möchten.

  3. Melden Sie sich bei der OCI Cloud Shell- oder OCI Compute-Instanz an, und greifen Sie auf die OCI Cloud Shell oder Ihre OCI Compute-Instanz zu, in der Sie die Funktion erstellen. Legen Sie den Kontext für die OCI Functions-CLI fest, um die Region anzugeben, in der die Funktion bereitgestellt wird.

    fn use context <region-name>
    Replace <region-name> with the appropriate region (e.g., ap-hyderabad-1).
    
  4. Aktualisieren Sie den Kontext mit der Compartment-ID. Führen Sie den folgenden Befehl aus, um das Compartment festzulegen, in dem sich die Anwendung befindet.

    fn update context oracle.compartment-id <compartment-ocid>
    
  5. OCI Registry einrichten Geben Sie ein eindeutiges Präfix für den Repository-Namen ein, um Ihre Funktionsimages zu unterscheiden. Führen Sie den folgenden Befehl aus, um die Registrierung zu aktualisieren.

    fn update context registry <region-key>.ocir.io/<tenancy-namespace>/<repo-name-prefix>
    Example: ap-hyderabad-1.ocir.io/namespace/prefix.
    
  6. Generieren Sie in der OCI-Konsole unter Ihrem Benutzerprofil ein Authentifizierungstoken, und führen Sie den folgenden Befehl aus, um sich mit dem Authentifizierungstoken bei der Container-Registry anzumelden.

    docker login -u '<tenancy-namespace>/<user-id>' <region-key>.ocir.io
    
  7. Prüfen Sie, ob die Anwendung korrekt eingerichtet wurde, indem Sie die Anwendungen auflisten. Führen Sie den folgenden Befehl aus, um die Anwendung aufzulisten.

    fn list apps
    
  8. Erstellen Sie mit der Python-Laufzeit eine neue Funktion namens imdsupdate, und initialisieren Sie die Funktion.

    fn init --runtime python imdsupdate
    
  9. Führen Sie den folgenden Befehl aus, um zum erstellten Verzeichnis zu navigieren.

    cd imdsupdate
    
  10. Führen Sie den Befehl ls aus, um die generierten Dateien aufzulisten.

    ls
    

Aufgabe 4: Python-Funktionscode aktualisieren

  1. Öffnen und bearbeiten Sie die generierte Python-Datei (z.B. func.py) im Verzeichnis, und fügen Sie den folgenden python-Code zur Funktionsdatei für die Logik hinzu.

    import io
    import json
    import logging
    from fdk import response
    import oci
    
    
    def handler(ctx, data: io.BytesIO = None):
        try:
            # Authenticate using Instance Principals
            signer = oci.auth.signers.get_resource_principals_signer()
            body = json.loads(data.getvalue())
            logging.getLogger().info("Event body: " + str(body))
    
            # Extract Required Details From Event Rule
            instance_id = body["data"]["resourceId"]  # Instance OCID
            action_type = body["eventType"]
    
            logging.getLogger().info("Action type: " + action_type)
    
            # Proceed only if instance creation event
            if action_type == "com.oraclecloud.computeapi.launchinstance.end":
                compute_client = oci.core.ComputeClient(config={}, signer=signer)
                update_instance_imds(compute_client, instance_id)
    
        except (Exception, ValueError) as ex:
            logging.getLogger().error("Error: " + str(ex))
            return response.Response(
                ctx,
                response_data=json.dumps({"message": "Error: " + str(ex)}),
                headers={"Content-Type": "application/json"},
            )
    
        return response.Response(
            ctx,
            response_data=json.dumps({"message": "Function executed successfully"}),
            headers={"Content-Type": "application/json"},
        )
    
    
    def update_instance_imds(compute_client, instance_id):
        """
        Updates the instance metadata service (IMDS) configuration to disable legacy endpoints.
        """
        try:
            # Fetch instance details
            instance_details = compute_client.get_instance(instance_id).data
    
            # Update instance configuration
            update_details = oci.core.models.UpdateInstanceDetails(
                instance_options=oci.core.models.InstanceOptions(
                    are_legacy_imds_endpoints_disabled=True  # Disable legacy endpoints
                )
            )
            response = compute_client.update_instance(instance_id, update_details)
    
            logging.getLogger().info(
                f"Successfully updated IMDS for instance {instance_id}: {response.data}"
            )
    
        except Exception as ex:
            logging.getLogger().error("Failed to update IMDS: " + str(ex))
            raise
    
  2. Aktualisieren Sie die Datei requirements.txt.

    fdk>=0.1.86
    oci==2.138.0
    
  3. Führen Sie den folgenden Befehl aus, um die Funktion in der erstellten Anwendung bereitzustellen.

    fn -v deploy --app <application-name>
    Example: fn -v deploy --app functionpyth.
    

Mit diesen Schritten wird sichergestellt, dass die Funktion zur Automatisierung von IMDS-Versionsupdates in OCI erstellt, bereitgestellt und aufgerufen werden kann.

Funktionscodeaktualisierung

Aufgabe 5: Ereignisregel definieren

Mit dem OCI Events-Service können Sie erkennen, wann eine neue OCI Compute-Instanz erstellt wird.

Geben Sie die folgenden Informationen ein, um die Ereignisregel zu konfigurieren.

Ereignisregel

Aufgabe 6: Instanz-IMDS-Wert validieren

Starten Sie eine neue Instanz, um die Ereignisregel auszulösen und die Konfiguration des Instance Metadata Service zu prüfen. Sobald die Erstellung der virtuellen Maschine (VM) abgeschlossen ist, wird der IMDS-Wert automatisch nur auf Version 2 gesetzt.

Diese Konfigurationen sind regional und Compartment-spezifisch. Wenn Sie dieselbe Funktion in einem anderen Compartment aufrufen möchten, erstellen Sie eine Ereignisregel in diesem Compartment, und legen Sie eine Regel fest, um diese Funktion auszulösen.

Durch Ausführung dieser Aufgaben automatisieren Sie den Prozess zum Aktualisieren der IMDS-Version für OCI Compute-Instanzen in einem bestimmten Compartment auf v2.

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.