Nota

Automatizza l'aggiornamento del servizio metadati dell'istanza alla versione 2 solo per le istanze di OCI Compute utilizzando le regole degli eventi e le funzioni Python

Introduzione

Garantire sicurezza e coerenza tra gli ambienti cloud è una priorità per le aziende moderne. In Oracle Cloud Infrastructure (OCI), l'istanza Metadata Service (IMDS) fornisce informazioni critiche specifiche dell'istanza e l'applicazione della versione 2 (IMDSv2) migliora la sicurezza richiedendo l'autenticazione basata sulla sessione. L'automazione dell'upgrade a IMDSv2 in tutte le istanze di OCI Compute è un modo efficace per mantenere questo standard di sicurezza riducendo al contempo il carico di lavoro manuale.

Questa esercitazione descrive come creare un flusso di lavoro automatizzato e basato sugli eventi utilizzando le regole del servizio OCI Events e le funzioni OCI per applicare l'aggiornamento IMDSv2. Sfruttando l'automazione basata su Python, creerai e configurerai le risorse OCI necessarie, come gruppi dinamici, regole degli eventi e funzioni serverless per garantire la compliance con questo protocollo di sicurezza avanzato.

Obiettivi

Aggiornamento dati IMDS istanza:

Prerequisiti

Task 1: creare un gruppo dinamico

Definire un gruppo dinamico per consentire alla funzione di accedere alle istanze di destinazione. Per utilizzare altri servizi OCI, la funzione deve far parte di un gruppo dinamico.

ALL {resource.type = 'fnfunc'}

Quando si specificano le regole di corrispondenza, si consiglia di trovare la corrispondenza tra tutte le funzioni di un compartimento e:

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

Gruppo dinamico

Task 2: Definisci criteri IAM OCI

Creare un nuovo criterio che consenta al gruppo dinamico di gestire le istanze di computazione. Concederemo l'accesso in gestione alle istanze nel compartimento specifico.

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

Criteri

Task 3: Creare e distribuire le funzioni OCI

Creare, distribuire e richiamare la funzione per l'aggiornamento IMDS.

  1. Creare un'applicazione in OCI Console.

    Eseguire il login a OCI Console, passare a Servizi per sviluppatori, Funzioni e fare clic su Applicazioni. Selezionare l'area appropriata per OCI Functions e fare clic su Crea applicazione.

    Funzioni OCI

  2. Impostare l'ambiente per la distribuzione delle funzioni, eseguire l'impostazione seguente sull'istanza di OCI Cloud Shell o OCI Compute (esecuzione di Oracle Linux 8) o su qualsiasi sistema in cui si prevede di creare e distribuire la funzione.

  3. Eseguire il login all'istanza OCI Cloud Shell o OCI Compute e accedere a OCI Cloud Shell o all'istanza OCI Compute in cui si creerà la funzione. Impostare il contesto per l'interfaccia CLI di OCI Functions per specificare l'area in cui verrà distribuita la funzione.

    fn use context <region-name>
    Replace <region-name> with the appropriate region (e.g., ap-hyderabad-1).
    
  4. Aggiornare il contesto con l'ID compartimento. Eseguire il comando riportato di seguito per impostare il compartimento in cui risiederà l'applicazione.

    fn update context oracle.compartment-id <compartment-ocid>
    
  5. Impostare il registro OCI. Immettere un prefisso di nome repository univoco per distinguere le immagini delle funzioni. Eseguire il comando seguente per aggiornare il registro.

    fn update context registry <region-key>.ocir.io/<tenancy-namespace>/<repo-name-prefix>
    Example: ap-hyderabad-1.ocir.io/namespace/prefix.
    
  6. Generare un token di autenticazione dalla console OCI nel profilo utente ed eseguire il comando riportato di seguito per eseguire il login al registro contenitore utilizzando il token di autenticazione.

    docker login -u '<tenancy-namespace>/<user-id>' <region-key>.ocir.io
    
  7. Verificare che l'applicazione sia impostata correttamente elencando le applicazioni. Eseguire il comando riportato di seguito per visualizzare l'applicazione.

    fn list apps
    
  8. Creare una nuova funzione denominata imdsupdate utilizzando il runtime Python e inizializzare la funzione.

    fn init --runtime python imdsupdate
    
  9. Eseguire il comando seguente per andare alla directory creata.

    cd imdsupdate
    
  10. Eseguire il comando ls per elencare i file generati.

    ls
    

Task 4: Aggiornare il codice della funzione Python

  1. Aprire e modificare il file Python generato (ad esempio, func.py) nella directory e aggiungere il codice python seguente al file delle funzioni per la logica.

    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. Aggiornare il file requirements.txt.

    fdk>=0.1.86
    oci==2.138.0
    
  3. Eseguire il comando seguente per distribuire la funzione nell'applicazione creata.

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

Questi passi garantiscono che la funzione venga creata, distribuita e pronta per essere richiamata per automatizzare gli aggiornamenti della versione IMDS in OCI.

Aggiornamento codice funzione

Task 5: Definisci regola evento

Utilizzare il servizio OCI Events per rilevare quando viene creata una nuova istanza di OCI Compute.

Per configurare una regola evento, immettere le informazioni riportate di seguito.

Regola evento

Task 6: Convalida valore IMDS istanza

Avviare una nuova istanza per attivare la regola evento e verificare la configurazione del servizio metadati dell'istanza. Una volta completata la creazione della Virtual Machine (VM), imposterà automaticamente il valore IMDS solo sulla versione 2.

Queste configurazioni sono specifiche per area e compartimento. Se si desidera chiamare la stessa funzione in un compartimento diverso, creare una regola evento in tale compartimento e impostare una regola per attivare questa funzione.

Completando questi task, automatizzerai il processo di aggiornamento della versione IMDS in v2 per le istanze di OCI Compute in un compartimento specifico.

Conferme

Altre risorse di apprendimento

Esplora altri laboratori su docs.oracle.com/learn o accedi a più contenuti gratuiti sulla formazione su Oracle Learning YouTube channel. Inoltre, visita education.oracle.com/learning-explorer per diventare un Oracle Learning Explorer.

Per la documentazione del prodotto, visita l'Oracle Help Center.