Remarques :

Automatiser la mise à jour du service de métadonnées d'instance vers la version 2 uniquement pour les instances OCI Compute à l'aide de règles d'événement et de fonctions Python

Introduction

Garantir la sécurité et la cohérence entre les environnements cloud est une priorité pour les entreprises d'aujourd'hui. Dans Oracle Cloud Infrastructure (OCI), le service de métadonnées d'instance (IMDS) fournit des informations critiques propres à l'instance, et l'application de son utilisation de la version 2 (IMDSv2) améliore la sécurité en exigeant une authentification basée sur une session. L'automatisation de la mise à niveau vers IMDSv2 sur toutes les instances OCI Compute est un moyen efficace de maintenir cette norme de sécurité tout en réduisant les frais généraux manuels.

Ce tutoriel explique comment créer un workflow automatisé axé sur les événements à l'aide des règles du service OCI Events et d'OCI Functions pour appliquer la mise à jour IMDSv2. En tirant parti de l'automatisation basée sur Python, vous créerez et configurerez les ressources OCI nécessaires, telles que les groupes dynamiques, les règles d'événement et les fonctions sans serveur, afin de garantir la conformité avec ce protocole de sécurité amélioré.

Objectifs

Mise à jour IMDS de l'instance

Prérequis

Tâche 1 : créer un groupe dynamique

Définissez un groupe dynamique pour permettre à la fonction d'accéder aux instances cible. Pour pouvoir utiliser d'autres services OCI, votre fonction doit faire partie d'un groupe dynamique.

ALL {resource.type = 'fnfunc'}

Lors de la spécification des règles de mise en correspondance, nous vous suggérons de mettre en correspondance toutes les fonctions d'un compartiment avec :

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

Groupe dynamique

Tâche 2 : définition des stratégies OCI IAM

Créez une stratégie qui permet au groupe dynamique de gérer les instances de calcul. Nous accorderons un accès en gestion aux instances dans le compartiment spécifique.

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

sécurité

Tâche 3 : création et déploiement des fonctions OCI

Créez, déployez et appelez la fonction pour la mise à jour IMDS.

  1. Créez une application dans la console OCI.

    Connectez-vous à la console OCI, accédez à Services de développeur, à Fonctions et cliquez sur Applications. Sélectionnez la région appropriée pour OCI Functions et cliquez sur Créer une application.

    OCI Functions

  2. Configurez l'environnement pour le déploiement de fonction, effectuez la configuration suivante sur votre instance OCI Cloud Shell ou OCI Compute (exécution d'Oracle Linux 8) ou sur tout système sur lequel vous prévoyez de créer et de déployer la fonction.

  3. Connectez-vous à l'instance OCI Cloud Shell ou OCI Compute et accédez à OCI Cloud Shell ou à votre instance OCI Compute où vous allez créer la fonction. Définissez le contexte de l'interface de ligne de commande OCI Functions afin d'indiquer la région dans laquelle la fonction sera déployée.

    fn use context <region-name>
    Replace <region-name> with the appropriate region (e.g., ap-hyderabad-1).
    
  4. Mettre à jour le contexte avec l'ID de compartiment Exécutez la commande suivante pour définir le compartiment dans lequel l'application résidera.

    fn update context oracle.compartment-id <compartment-ocid>
    
  5. configurer OCI Registry. Entrez un préfixe de nom de référentiel unique pour distinguer les images de fonction. Exécutez la commande suivante pour mettre à jour le registre.

    fn update context registry <region-key>.ocir.io/<tenancy-namespace>/<repo-name-prefix>
    Example: ap-hyderabad-1.ocir.io/namespace/prefix.
    
  6. Générez un jeton d'authentification à partir de la console OCI sous votre profil utilisateur et exécutez la commande suivante pour vous connecter au registre de conteneurs à l'aide du jeton d'authentification.

    docker login -u '<tenancy-namespace>/<user-id>' <region-key>.ocir.io
    
  7. Vérifiez que l'application est correctement configurée en répertoriant les applications. Exécutez la commande suivante pour répertorier l'application.

    fn list apps
    
  8. Créez une fonction nommée imdsupdate à l'aide de l'exécution Python et initialisez la fonction.

    fn init --runtime python imdsupdate
    
  9. Exécutez la commande suivante pour accéder au répertoire créé.

    cd imdsupdate
    
  10. Exécutez la commande ls pour répertorier les fichiers générés.

    ls
    

Tâche 4 : mise à jour du code de fonction Python

  1. Ouvrez et modifiez le fichier Python généré (par exemple, func.py) dans le répertoire et ajoutez le code python suivant au fichier de fonction pour la logique.

    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. Mettez à jour le fichier requirements.txt.

    fdk>=0.1.86
    oci==2.138.0
    
  3. Exécutez la commande suivante pour déployer la fonction vers l'application créée.

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

Ces étapes garantissent que la fonction est créée, déployée et prête à être appelée pour automatiser les mises à jour de version IMDS dans OCI.

Mise à jour du code fonction

Tâche 5 : définir la règle d'événement

Utilisez le service OCI Events pour détecter la création d'une instance OCI Compute.

Pour configurer une règle d'événement, saisissez les informations suivantes.

Règle d'événement

Tâche 6 : valider la valeur IMDS de l'instance

Lancez une nouvelle instance pour déclencher la règle d'événement et vérifiez la configuration du service de métadonnées d'instance. Une fois la création de la machine virtuelle terminée, elle définit automatiquement la valeur IMDS sur la version 2 uniquement.

Ces configurations sont propres à la région et au compartiment. Si vous voulez appeler la même fonction dans un autre compartiment, créez une règle d'événement dans ce compartiment et définissez une règle pour déclencher cette fonction.

En effectuant ces tâches, vous automatiserez le processus de mise à jour de la version IMDS vers v2 pour les instances OCI Compute dans un compartiment spécifique.

Remerciements

Ressources de formation supplémentaires

Explorez d'autres ateliers sur docs.oracle.com/learn ou accédez à d'autres contenus de formation gratuits sur le canal Oracle Learning YouTube. De plus, visitez le site education.oracle.com/learning-explorer pour devenir un explorateur Oracle Learning.

Pour obtenir la documentation produit, consultez le site Oracle Help Center.