Comment créer une règle AWS Config pour les types de ressources non pris en charge ?

Lecture de 7 minute(s)
0

Je souhaite créer une règle pour un type de ressource non pris en charge par AWS Config.

Brève description

AWS Config vous permet de créer des règles pour vérifier si les ressources AWS sont conformes à une configuration spécifiée. Par défaut, AWS Config prend en charge un nombre limité de types de ressources AWS. Vous pouvez toutefois créer une règle AWS Config personnalisée pour les types de ressources non pris en charge.

Lorsque vous déployez une règle personnalisée, AWS Lambda crée une fonction pour évaluer les ressources. Utilisez cette fonction pour évaluer un type de ressource non pris en charge et renvoyer le résultat de conformité à la règle personnalisée.

Remarque : Par défaut, AWS Config ne capture pas l'historique des modifications de configuration ou de conformité des types de ressources non pris en charge. Pour ce faire, suivez les étapes de la section Enregistrement des configurations pour les ressources, et créez une règle qui évalue ce type de ressource personnalisé. Pour plus d'informations sur l'enregistrement et l'évaluation des ressources personnalisées, consultez Utiliser les ressources personnalisées AWS Config pour suivre n'importe quelle ressource sur AWS.

Résolution

Remarque : Les étapes et l'exemple de code suivants créent un rôle AWS Config personnalisé pour évaluer Amazon Cognito. Il s'agit d'une ressource non prise en charge.

Prérequis

Créez un rôle AWS Identity and Access Management (IAM) pour la fonction Lambda qui permet à celle-ci d'effectuer les appels d'API nécessaires.

  1. Ouvrez la console IAM, puis sélectionnez Rôles dans le volet de navigation.

  2. Choisissez Create role (Créer un rôle).

  3. Pour Choisir un cas d'utilisation, sous Cas d'utilisation courants, sélectionnez Lambda.

  4. Cliquez sur Next: Permissions (Suivant : Autorisations).

  5. Choisissez Créer une politique.
    Remarque : La page Créer une politique s'ouvre dans un nouvel onglet. Vous revenez à l'onglet d'origine ultérieurement au cours de ce processus.

  6. Choisissez l'onglet JSON, puis entrez cette politique :

    {  "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "VisualEditor0",
          "Effect": "Allow",
          "Action": [
            "config:PutEvaluations",
            "cognito-idp:ListUserPools"
            "`cognito-idp:DescribeUserPool"`
          ],
          "Resource": "*"
        }
      ]
    }
  7. Cliquez sur Next: Tags (Suivant : Balises), puis choisissez Next: Review (Suivant : Vérification).

  8. Dans le champ Nom, saisissez un nom de politique.

  9. Choisissez Créer une politique.

  10. Revenez à l'onglet Créer un rôle à partir de l'étape 5, puis cliquez sur l'icône d'actualisation sur le côté droit de la liste des politiques.

  11. Recherchez et sélectionnez le nouveau nom de la politique, puis cliquez sur Next: Tags (Suivant : Balises).

  12. Cliquez sur Next: Review (Suivant : Vérification).

  13. Dans Role name (Nom du rôle), entrez lambda-role.

  14. Choisissez Create role (Créer un rôle).

Création d'une fonction Lambda pour la règle AWS Config personnalisée

  1. Ouvrez la Lambda console (console Lambda).
  2. Sélectionnez Create function (Créer une fonction).
  3. Sélectionnez Author from scratch (Créer à partir de zéro).
    Dans Function name (Nom de la fonction), entrez un nom.
    Pour Runtime (Exécution), sélectionnez Python 3.8.
  4. Pour Permissions (Autorisations), déroulez Modifier le rôle d'exécution par défaut.
    Pour Execution role (Rôle d'exécution), sélectionnez Utiliser un rôle existant.
    Pour Rôle existant, choisissez le rôle que vous avez créé pour permettre à Lambda d'effectuer les appels d'API nécessaires dans la section Prérequis de cet article.
  5. Sélectionnez Create function (Créer une fonction).
  6. Pour Code source, ouvrez le fichier lambda_function.py dans la console Lambda, remplacez le code par défaut par le code suivant, puis choisissez Déployer.
    Remarque : L'exemple de code suivant trouve tous les groupes d'utilisateurs Amazon Cognito dotés du MFA : OFF, et marque les résultats comme NON_COMPLIANT. Pour obtenir des informations et des ressources permettant de personnaliser ces instructions pour d'autres services et objectifs non pris en charge, consultez la section de l'article API PutEvaluations et valeur du type de ressource AWS::::Account..
    ## Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.// SPDX-License-Identifier: MIT-0
    
    import json
    import boto3
    
    def lambda_handler(event,context):
      cognito = boto3.client('cognito-idp')
      userpools = cognito.list_user_pools(
        MaxResults=5
        )
      userpool_list = userpools['UserPools']
      userpool_ids = []
    
      for i in userpool_list:
        userpool_ids.append(i['Id'])
    
      evaluations = []
      orderingtime = json.loads(event['invokingEvent'])['notificationCreationTime']
    
      for j in userpool_ids:
         userpool_describe = cognito.describe_user_pool(
            UserPoolId = j
          )
         userpool_MFA = userpool_describe['UserPool']['MfaConfiguration']
         if userpool_MFA == 'OFF':
           evaluations.append(
              {
              'ComplianceResourceType': 'AWS::::Account',
              'ComplianceResourceId': j,
              'ComplianceType': 'NON_COMPLIANT',
              'Annotation': 'Test',
              'OrderingTimestamp': orderingtime
              }
            )
         else:
           evaluations.append(
              {
              'ComplianceResourceType': 'AWS::::Account',
              'ComplianceResourceId': j,
              'ComplianceType': 'COMPLIANT',
              'Annotation': 'Test',
              'OrderingTimestamp': orderingtime
              }
            )
    
      result_token = event['resultToken']
      config = boto3.client('config')
      response = config.put_evaluations(
                  Evaluations = evaluations,
                  ResultToken = result_token,
                  TestMode = False
                )

Ce code effectue trois étapes principales :

  • Répertorie toutes les ressources pour créer un inventaire
  • Évalue chaque ressource de l'inventaire par rapport à la configuration spécifiée
  • Utilise l'appel d'API PutEvaluations à AWS Config pour renvoyer l'état de conformité

Création d'une règle AWS Config périodique personnalisée

Créez une règle périodique personnalisée dans AWS Config. Associez ensuite la règle personnalisée à la fonction Lambda que vous avez créée dans la section précédente. Pour obtenir des instructions, consultez Création d'une règle Lambda personnalisée pour évaluer les instances Amazon EC2.

Important : Notez le nom de ressource Amazon (ARN) de la nouvelle règle personnalisée pour une étape ultérieure.

Autoriser le service AWS Config à appeler la fonction Lambda

  1. Ouvrez la console Lambda, puis choisissez Functions (Fonctions) dans le volet de navigation.
  2. Choisissez le nom de la fonction avec hyperlien de votre fonction Lambda pour ouvrir les détails de la fonction.
  3. Dans l'onglet Configuration, sélectionnez Permissions (Autorisations).
  4. Pour une Resource-based policy (Politique basée sur les ressources), choisissez Add permissions (Ajouter des autorisations).
    Pour Policy statement (Déclaration de politique), choisissez le service AWS.
    Pour Service, sélectionnez Other (Autre).
    Pour Principal, entrez config.amazonaws.com.
    Pour Source ARN (ARN source), entrez l'ARN de la règle personnalisée que vous avez créée dans la section précédente.
    Remarque : Pour trouver l'ARN de règle de configuration personnalisée, ouvrez la console AWS Config, puis choisissez Rules (Règles) dans le volet de navigation. Choisissez le Name (Nom) de la règle avec hyperlien, puis copiez l’ARN de la règle de configuration.
    Pour Action, choisissez lambda:InvokeFunction.
    Pour Statement ID (ID de déclaration), entrez un identifiant unique.
  5. Choisissez Save (Enregistrer).

API PutEvaluations et valeur de type de ressource AWS::::Account

Les étapes et les exemples présentés dans cette résolution permettent de trouver tous les groupes d'utilisateurs Amazon Cognito avec une authentification MFA: OFF puis marquez les résultats comme NON_COMPLIANT. Cependant, vous pouvez modifier le processus pour répondre à vos besoins spécifiques avec tout type de ressource non pris en charge. Pour d'autres exemples de code utilisant le type de ressource AWS::::Account, consultez la page GitHub aws-config-rules.

L’appel d'API PutEvaluations inclut les paramètres suivants :

{   "Evaluations": [
    {
     "Annotation": "string",
     "ComplianceResourceId": "string",
     "ComplianceResourceType": "string",
     "ComplianceType": "string",
     "OrderingTimestamp": number
    }
   ],
   "ResultToken": "string",
   "TestMode": boolean
}

Pour les types de ressources non pris en charge, entrez AWS::::Account comme valeur pour ComplianceResourceType. Le type de ressource AWS::::Account rend compte de l'ensemble du compte plutôt que d'une ressource spécifique :

{  'ComplianceResourceType': 'AWS::::Account',
  'ComplianceResourceId': 'Resource Id',
  'ComplianceType': 'COMPLIANT'|'NON_COMPLIANT',
  'Annotation': 'string',
  'OrderingTimestamp': number
}

Si une ressource non prise en charge est saisie en tant que valeur ComplianceResourceType au lieu de AWS::::Account, les erreurs suivantes s'affichent :

  • Sur la console AWS Config : « No results available » (Aucun résultat disponible)
  • Lambda CloudWatch logs : « Error: ClientError: An error occurred (InternalFailure) when calling the PutEvaluations operation (reached max retries: 4) » (Erreur : Erreur Client : une erreur s'est produite (échec interne) lors de l'appel de l'opération PutEvaluations (tentatives maximales atteintes : 4))
  • Cloudtrail (API PutEvaluations) : « Error: ClientError: An error occurred (InternalFailure) when calling the PutEvaluations operation (reached max retries: 4) (Erreur : ClientError : Une erreur s'est produite (échec interne) lors de l'appel de l'opération PutEvaluations (tentatives maximales atteintes : 4))

Lorsque vous utilisez la valeur du type de ressource AWS::::Account, gardez les points suivants à l'esprit :

  • Aucun élément de configuration n'est enregistré pour ce type de ressource.
  • Aucun élément de configuration de conformité sous AWS::Config::ResourceCompliance n'est enregistré pour ce type de ressource.
  • Aucune chronologie des ressources n'est disponible pour ce type de ressource.
  • Dans l'AWS Management Console, le bouton Gérer les ressources n'est pas disponible pour ce type de ressource.

Informations connexes

Création d'une fonction AWS Lambda pour une règle AWS Config personnalisée

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a 8 mois