Comment créer une règle de configuration pour les types de ressources non pris en charge à l'aide d'AWS Config ?

Date de la dernière mise à jour : 28/07/2021

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

Brève description

AWS Config vous permet de créer des règles de configuration 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. Toutefois, vous pouvez également créer une règle de configuration personnalisée pour les types de ressources qui ne sont pas pris en charge par AWS Config.

Lorsqu'une règle de configuration personnalisée est déployée, une fonction AWS Lambda est créée pour évaluer les ressources. Vous pouvez créer une fonction Lambda qui évaluera un type de ressource non pris en charge et renvoie le résultat de la conformité à la règle de configuration personnalisée.

Résolution

Remarque : les étapes et l'exemple de code suivants créent un rôle de configuration personnalisé pour évaluer Amazon Cognito, une ressource non prise en charge.

Prérequis

Créez un rôle AWS Identity and Access Management (IAM) pour la fonction Lambda afin de permettre à Lambda d'effectuer les appels d'API nécessaires.

1.    Ouvrez la console IAM, puis choisissez Rôles dans le panneau de navigation.

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

3.    Pour Choose a use case (Choisir un cas d'utilisation), sous Common use cases (Cas d'utilisation courants), choisissez Lambda.

4.    Choisissez Suivant : Autorisations.

5.    Choisissez Create policy (Créer une politique).

Remarque : la page Create policy (Créer une politique) s'ouvre dans un nouvel onglet. Vous reviendrez à l'onglet d'origine plus tard dans ce processus.

6.    Choisissez l'onglet JSON, puis saisissez la politique suivante :

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": [
        "config:PutEvaluations",
        "cognito-idp:ListUserPools"
      ],
      "Resource": "*"
    }
  ]
}

7.    Choisissez Next: Tags (Suivant : Balises), puis Next: Review (Suivant : Vérification).

8.    Pour Name (Nom), saisissez un nom de politique.

9.    Choisissez Create policy (Créer une politique).

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

11.    Recherchez et sélectionnez le nouveau nom de politique, puis choisissezSuivant : Balises.

12.    Choisissez Étape suivante : Vérification.

13.    Pour Role name (Nom du rôle), saisissez lambda-role.

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

Créer une fonction Lambda pour la règle de configuration personnalisée

1.    Ouvrez la console Lambda.

2.    Sélectionnez Créer une fonction.

3.    Choisissez Author from scratch (Créer à partir de zéro).
Pour Function name (Nom de la fonction), saisissez un nom.
Pour Runtime (Environnement d'exécution), sélectionnez Python 3.8.

4.    Pour Permissions (Autorisations), développez Change default execution role (Modifier le rôle d'exécution par défaut).
Pour Execution role (Rôle d'exécution), choisissez Use an existing role (Utiliser un rôle existant).
Pour Existing role (Rôle existant), choisissez le rôle que vous avez créé pour autoriser Lambda à effectuer les appels d'API nécessaires dans la section Prérequis de cet article.

5.    Sélectionnez Créer une fonction.

6.    PourCode source, ouvrez le fichier lambda_function.py dans la console Lambda, remplacez le code par défaut par ce qui suit, puis choisissez Deploy (Déployer).

Remarque : l'exemple de code suivant recherche tous les pools d'utilisateurs Amazon Cognito dont l'authentification MFA est désactivée (MFA : OFF) et marque les résultats comme NON_COMPLIANT (NON CONFORMES). Pour obtenir des informations et des ressources permettant de personnaliser ces instructions pour d'autres services et objectifs non pris en charge, reportez-vous à 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
            )

Le code précédent 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.
  • Renvoie l'état de conformité basé sur l'évaluation à l'aide de l'appel d'API PutEvaluations vers AWS Config.

Créer une règle de configuration périodique personnalisée

Vous devez maintenant créer une règle de configuration périodique personnalisée dans AWS Config. Ensuite, associez 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 personnalisée.

Important : notez l'ARN de la nouvelle règle de configuration 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 panneau de navigation.

2.    Choisissez le nom de fonction avec hyperlien de votre fonction Lambda pour ouvrir les détails de la fonction.

3.    Dans l'onglet Configuration, choisissez Permissions (Autorisations).

4.    Pour 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, choisissez Other (Autre).
PourPrincipal, saisissez config.amazonaws.com.
Pour Source ARN, entrez l'ARN de la règle de configuration 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 panneau de navigation. Choisissez le 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), saisissez un ID unique.

5.    Choisissez Save (Enregistrer).

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

Les étapes et les exemples de cet article recherchent tous les pools d'utilisateurs Amazon Cognito dont l'authentification MFA est désactivée (MFA: OFF) et marquent les résultats comme NON_COMPLIANT (NON CONFORMES). Toutefois, vous pouvez modifier le processus pour qu'il réponde à vos besoins spécifiques avec n'importe quel type de ressource non pris en charge. Vous trouverez d'autres exemples de code utilisant le type de ressource AWS::::Account sur 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, vous devez saisir AWS::::Account comme valeur de ComplianceResourceType. Le type de ressource AWS::::Account indique l'ensemble du compte au lieu d'une ressource spécifique.

Exemple :

{
  '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 d'AWS::::Account, les erreurs suivantes s'affichent :

  • Sur la console : « No results available » (Aucun résultat disponible)
  • Journaux 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))

Notez les points suivants lorsque vous utilisez la valeur de type de ressourceAWS::::Account :

1.    Un élément de configuration n'est pas enregistré pour ce type de ressource.

2.    Un élément de configuration de conformité sous AWS::Config::ResourceCompliance n'est pas enregistré pour ce type de ressource.

3.    Un calendrier de ressources n'est pas disponible pour ce type de ressource.

4.    Dans la console de gestion AWS, le bouton Manage Resource (Gérer les ressources) n'est pas disponible pour ce type de ressource.


Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?