Note:

Automatice la actualización del servicio de metadatos de instancia a la versión 2 solo para instancias de OCI Compute mediante reglas de eventos y funciones de Python

Introducción

Garantizar la seguridad y la coherencia en los entornos de nube es una prioridad para las empresas modernas. En Oracle Cloud Infrastructure (OCI), el servicio de metadatos de instancia (IMDS) proporciona información crítica específica de la instancia y la aplicación de su uso de la versión 2 (IMDSv2) mejora la seguridad al requerir autenticación basada en sesión. Automatizar el cambio de versión a IMDSv2 en todas las instancias de OCI Compute es una forma eficaz de mantener este estándar de seguridad y, al mismo tiempo, reducir la sobrecarga manual.

En este tutorial se muestra cómo crear un flujo de trabajo automatizado basado en eventos mediante las reglas del servicio OCI Events y OCI Functions para aplicar la actualización IMDSv2. Al aprovechar la automatización basada en Python, creará y configurará los recursos de OCI necesarios, como grupos dinámicos, reglas de eventos y funciones sin servidor para garantizar sin problemas el cumplimiento de este protocolo de seguridad mejorado.

Objetivos

Actualización de IMDS de instancia

Requisitos

Tarea 1: Creación de un grupo dinámico

Defina un grupo dinámico para permitir que la función acceda a las instancias de destino. Para utilizar otros servicios de OCI, la función debe formar parte de un grupo dinámico.

ALL {resource.type = 'fnfunc'}

Al especificar las reglas de coincidencia, sugerimos que todas las funciones de un compartimento coincidan con:

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

Grupo Dinámico

Tarea 2: Definición de políticas de OCI IAM

Cree una nueva política que permita al grupo dinámico gestionar instancias informáticas. Otorgaremos acceso de gestión a instancias en el compartimento específico.

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

Políticas

Tarea 3: Creación y despliegue de OCI Functions

Cree, despliegue y llame a la función para la actualización de IMDS.

  1. Cree una aplicación en la consola de OCI.

    Conéctese a la consola de OCI, vaya a Developer Services, Functions y haga clic en Aplicaciones. Seleccione la región adecuada para OCI Functions y haga clic en Crear aplicación.

    OCI Functions

  2. Configure el entorno para el despliegue de funciones, realice la siguiente configuración en la instancia de OCI Cloud Shell o OCI Compute (que ejecuta Oracle Linux 8) o en cualquier sistema en el que tenga previsto crear y desplegar la función.

  3. Conéctese a la instancia de OCI Cloud Shell o OCI Compute y acceda a OCI Cloud Shell o a la instancia de OCI Compute en la que creará la función. Defina el contexto para la CLI de OCI Functions para especificar la región en la que se desplegará la función.

    fn use context <region-name>
    Replace <region-name> with the appropriate region (e.g., ap-hyderabad-1).
    
  4. Actualice el contexto con el ID de compartimento. Ejecute el siguiente comando para definir el compartimento en el que residirá la aplicación.

    fn update context oracle.compartment-id <compartment-ocid>
    
  5. Configurar OCI Registry. Introduzca un prefijo de nombre de repositorio único para distinguir las imágenes de función. Ejecute el siguiente comando para actualizar el registro.

    fn update context registry <region-key>.ocir.io/<tenancy-namespace>/<repo-name-prefix>
    Example: ap-hyderabad-1.ocir.io/namespace/prefix.
    
  6. Genere un token de autenticación desde la consola de OCI en su perfil de usuario y ejecute el siguiente comando para conectarse al registro de contenedor mediante el token de autenticación.

    docker login -u '<tenancy-namespace>/<user-id>' <region-key>.ocir.io
    
  7. Confirme que la aplicación se ha configurado correctamente enumerando las aplicaciones. Ejecute el siguiente comando para mostrar la aplicación.

    fn list apps
    
  8. Cree una nueva función denominada imdsupdate mediante el tiempo de ejecución de Python e inicialice la función.

    fn init --runtime python imdsupdate
    
  9. Ejecute el siguiente comando para navegar hasta el directorio creado.

    cd imdsupdate
    
  10. Ejecute el comando ls para mostrar los archivos generados.

    ls
    

Tarea 4: Actualización del código de función de Python

  1. Abra y edite el archivo Python generado (por ejemplo, func.py) en el directorio y agregue el siguiente código python al archivo de función para la lógica.

    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. Actualice el archivo requirements.txt.

    fdk>=0.1.86
    oci==2.138.0
    
  3. Ejecute el siguiente comando para desplegar la función en la aplicación creada.

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

Estos pasos garantizan que la función se cree, despliegue y esté lista para ser invocada para automatizar las actualizaciones de versión de IMDS en OCI.

Actualización de código de función

Tarea 5: Definición de la regla de evento

Utilice el servicio OCI Events para detectar cuándo se crea una nueva instancia de OCI Compute.

Para configurar la regla de evento, escriba la siguiente información.

Regla de Evento

Tarea 6: Validación del valor IMDS de la instancia

Inicie una nueva instancia para disparar la regla de evento y verificar la configuración del servicio de metadatos de instancia. Una vez que se haya completado la creación de la máquina virtual (VM), definirá automáticamente el valor IMDS solo en la versión 2.

Estas configuraciones son específicas de la región y el compartimento. Si desea llamar a la misma función en un compartimento diferente, cree una regla de evento en ese compartimento y defina una regla para disparar esta función.

Al completar estas tareas, automatizará el proceso de actualización de la versión de IMDS a v2 para instancias de OCI Compute en un compartimento específico.

Confirmaciones

Más recursos de aprendizaje

Explore otros laboratorios en docs.oracle.com/learn o acceda a más contenido de formación gratuita en el canal YouTube de Oracle Learning. Además, visita education.oracle.com/learning-explorer para convertirte en un Oracle Learning Explorer.

Para obtener documentación sobre el producto, visite Oracle Help Center.