Note :

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

Présentation

Assurer la sécurité et la cohérence dans tous les environnements en nuage est une priorité pour les entreprises modernes. 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 sa 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 dans toutes les instances de calcul d'OCI 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 flux de travail automatisé basé sur les événements à l'aide des règles du service d'événements pour OCI et du service des fonctions pour OCI pour appliquer la mise à jour IMDSv2. En tirant parti de l'automatisation basée sur Python, vous allez créer et configurer les ressources OCI nécessaires, telles que les groupes dynamiques, les règles d'événement et les fonctions sans serveur, pour assurer de façon transparente la conformité à ce protocole de sécurité amélioré.

Objectifs

Mise à jour IMDS de l'instance

Préalables

Tâche 1 : Créer un groupe dynamique

Définissez un groupe dynamique pour permettre à la fonction d'accéder aux instances cibles. Pour 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 correspondance, nous 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éfinir des politiques IAM pour OCI

Créez une politique qui permet au groupe dynamique de gérer les instances de calcul. Nous accorderons l'accès en gestion aux instances du 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

Politiques

Tâche 3 : Créer et déployer le service des fonctions pour 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, naviguez jusqu'à Services de développement, Fonctions et cliquez sur Applications. Sélectionnez la région appropriée pour le service des fonctions pour OCI et cliquez sur Créer une application.

    Service des fonctions pour OCI

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

  3. Connectez-vous à l'instance de calcul OCI Cloud Shell ou OCI et accédez à Cloud Shell ou à votre instance de calcul OCI dans laquelle vous allez créer la fonction. Définissez le contexte pour l'interface de ligne de commande du service des fonctions pour OCI afin de spécifier la région où 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 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. Configurez le registre OCI. Entrez un préfixe de nom de référentiel unique pour distinguer vos 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 dans votre profil d'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 listant les applications. Exécutez la commande suivante pour lister l'application.

    fn list apps
    
  8. Créez une nouvelle 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 lister les fichiers générés.

    ls
    

Tâche 4 : Mettre à jour le 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 dans 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 de fonction

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

Utilisez le service d'événements OCI pour détecter lorsqu'une nouvelle instance de calcul OCI est créée.

Pour configurer une règle d'événement, entrez 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 règle automatiquement la valeur IMDS à 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 de calcul OCI dans un compartiment spécifique.

Confirmation

Autres ressources d'apprentissage

Explorez d'autres laboratoires sur la page docs.oracle.com/learn ou accédez à plus de contenu d'apprentissage gratuit sur le canal YouTube d'Oracle Learning. De plus, visitez education.oracle.com/learning-explorer pour devenir un explorateur Oracle Learning.

Pour obtenir de la documentation sur le produit, visitez Oracle Help Center.