Collecter des journaux AWS IAM

Compatible avec:

Ce document explique comment ingérer les journaux AWS IAM dans Google Security Operations. L'analyseur transforme les journaux bruts au format JSON en UDM (Unified Data Model) structuré. Il extrait les champs pertinents tels que les informations sur l'utilisateur, les informations sur le rôle, les autorisations et les codes temporels, et les met en correspondance avec les champs UDM correspondants pour une analyse de sécurité cohérente.

Avant de commencer

  • Assurez-vous de disposer d'une instance Google SecOps.
  • Assurez-vous de disposer d'un accès privilégié à AWS.

Configurer AWS IAM et S3

  1. Créez un bucket Amazon S3 en suivant ce guide de l'utilisateur: Créer un bucket.
  2. Enregistrez le nom et la région du bucket pour une utilisation ultérieure.
  3. Créez un utilisateur en suivant le guide de l'utilisateur Créer un utilisateur IAM.
  4. Sélectionnez le compte utilisateur créé.
  5. Sélectionnez l'onglet Informations d'identification de sécurité.
  6. Cliquez sur Créer une clé d'accès dans la section Clés d'accès.
  7. Sélectionnez Service tiers comme Cas d'utilisation.
  8. Cliquez sur Suivant.
  9. Facultatif: ajoutez une balise de description.
  10. Cliquez sur Créer une clé d'accès.
  11. Cliquez sur Download CSV file (Télécharger le fichier CSV) pour enregistrer la clé d'accès et la clé d'accès secrète pour les utiliser ultérieurement.
  12. Cliquez sur OK.
  13. Sélectionnez l'onglet Autorisations.
  14. Cliquez sur Ajouter des autorisations dans la section Règles d'autorisation.
  15. Sélectionnez Ajouter des autorisations.
  16. Sélectionnez Joindre directement des règles.
  17. Recherchez et sélectionnez la règle AmazonS3FullAccess.
  18. Cliquez sur Suivant.
  19. Cliquez sur Ajouter des autorisations.

Configurer CloudTrail pour enregistrer les journaux IAM

  1. Connectez-vous à l'AWS Management Console.
  2. Dans la barre de recherche, saisissez CloudTrail, puis sélectionnez-le dans la liste des services.
  3. Cliquez sur Créer un parcours.
  4. Indiquez un nom de sentier, par exemple IAMActivityTrail.
    • Appliquer la piste à toutes les régions: sélectionnez Oui pour enregistrer les activités dans toutes les régions.
    • Emplacement de stockage: sélectionnez le bucket S3 créé précédemment ou créez-en un.
    • Bucket S3: saisissez un nom pour le bucket S3, par exemple iam-logs-bucket.
    • Sélectionnez Créer un rôle IAM (si vous n'en avez pas créé auparavant).
    • Événements de gestion: sélectionnez Lire et Écrire pour enregistrer les événements de lecture et d'écriture sur les ressources IAM.
    • Événements de données: activez les événements de données S3 et Lambda.
  5. Cliquez sur Créer pour créer le parcours.

Configurer CloudTrail pour exporter des journaux vers S3

  1. Accédez à Services > S3.
  2. Sélectionnez le bucket S3 dans lequel les journaux CloudTrail sont stockés (par exemple, iam-logs-bucket).
  3. Assurez-vous que CloudTrail dispose des autorisations appropriées pour écrire des journaux dans le bucket.
  4. Ajoutez la règle suivante si elle n'est pas déjà présente:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "CloudTrailS3Access",
          "Effect": "Allow",
          "Principal": {
            "Service": "cloudtrail.amazonaws.com"
          },
          "Action": "s3:PutObject",
          "Resource": "arn:aws:s3:::your-bucket-name/AWSLogs/*"
        }
      ]
    }
    
  5. Activez la gestion des versions sur le bucket S3 pour vous assurer que les journaux sont stockés avec plusieurs versions.

  6. Accédez à Propriétés > Gestion des versions des buckets > Activer.

Facultatif: Configurer Lambda pour l'exportation en temps réel

  1. Accédez à la console Lambda AWS.
  2. Cliquez sur Créer une fonction.
  3. Sélectionnez Auteur à partir de zéro.
  4. Définissez le nom de la fonction sur ExportIAMLogsToS3.
  5. Sélectionnez un environnement d'exécution Python 3.x.
  6. Attribuez un rôle IAM à la fonction disposant des autorisations suivantes:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "logs:GetLogEvents",
            "logs:FilterLogEvents",
            "logs:DescribeLogGroups",
            "logs:DescribeLogStreams"
          ],
          "Resource": "*"
        },
        {
          "Effect": "Allow",
          "Action": [
            "s3:PutObject"
          ],
          "Resource": "arn:aws:s3:::your-bucket-name/*"
        }
      ]
    }
    
  7. Utilisez le code Python suivant pour récupérer les journaux IAM et les importer dans S3:

    import boto3
    import gzip
    from io import BytesIO
    
    s3 = boto3.client('s3')
    logs = boto3.client('logs')
    
    def lambda_handler(event, context):
        log_group = event['logGroup']
        log_stream = event['logStream']
    
        log_events = logs.get_log_events(
            logGroupName=log_group,
            logStreamName=log_stream,
            startFromHead=True
        )
    
        log_data = "\n".join([event['message'] for event in log_events['events']])
    
        # Compress and upload to S3
        compressed_data = gzip.compress(log_data.encode('utf-8'))
        s3.put_object(
            Bucket='your-s3-bucket-name',
            Key='iam-logs/{log_stream}.gz',
            Body=compressed_data
        )
    
  • Remplacez your-s3-bucket-name par le nom réel de votre bucket.

Configurer le déclencheur Lambda pour CloudWatch Logs

  1. Dans la console Lambda, accédez à Designer (Concepteur).
  2. Sélectionnez Ajouter un déclencheur > Journaux CloudWatch.
  3. Sélectionnez le groupe de journaux CloudWatch Logs associé à vos journaux IAM, par exemple /aws/cloudtrail/.
  4. Cliquez sur Ajouter.

Configurer un flux dans Google SecOps pour ingèrer les journaux AWS IAM

  1. Accédez à SIEM Settings > Feeds (Paramètres du SIEM > Flux).
  2. Cliquez sur Ajouter.
  3. Dans le champ Nom du flux, saisissez un nom pour le flux (par exemple, Journaux AWS IAM).
  4. Sélectionnez Amazon S3 comme Type de source.
  5. Sélectionnez AWS IAM comme Type de journal.
  6. Cliquez sur Suivant.
  7. Spécifiez les valeurs des paramètres d'entrée suivants:

    • Region (Région) : région dans laquelle se trouve le bucket Amazon S3.
    • URI S3: URI du bucket.
      • s3://your-log-bucket-name/
        • Remplacez your-log-bucket-name par le nom réel du bucket.
    • Un URI est: sélectionnez Répertoire ou Répertoire incluant des sous-répertoires.
    • Options de suppression de la source: sélectionnez l'option de suppression en fonction de vos préférences.

    • ID de clé d'accès: clé d'accès utilisateur ayant accès au bucket S3.

    • Clé d'accès secrète: clé secrète de l'utilisateur ayant accès au bucket S3.

    • Espace de noms des éléments: espace de noms des éléments.

    • Libellés d'ingestion: libellé à appliquer aux événements de ce flux.

  8. Cliquez sur Suivant.

  9. Vérifiez la configuration de votre nouveau flux dans l'écran Finaliser, puis cliquez sur Envoyer.

Tableau de mappage UDM

Champ de journal Mappage UDM Logique
Arn entity.entity.resource.name Mappé directement à partir du champ Arn pour les types d'entités USER et RESOURCE. Pour le type d'entité GROUP, il est mappé à partir de Group.Arn.
AssumeRolePolicyDocument entity.entity.resource.attribute.permissions.name Mappé directement à partir du champ AssumeRolePolicyDocument, mais uniquement pour le type d'entité RESOURCE.
CreateDate entity.entity.user.attribute.creation_time Mappé directement à partir du champ CreateDate et converti au format d'horodatage de Chronicle pour le type d'entité USER.
CreateDate entity.entity.resource.attribute.creation_time Mappé directement à partir du champ CreateDate et converti au format d'horodatage de Chronicle pour le type d'entité RESOURCE.
Group.Arn entity.entity.resource.name Mappé directement à partir du champ Group.Arn pour le type d'entité GROUP.
Group.CreateDate entity.entity.group.attribute.creation_time Mappé directement à partir du champ Group.CreateDate et converti au format de code temporel de Chronicle.
Group.GroupID entity.entity.group.product_object_id Mappé directement à partir du champ Group.GroupID.
Group.GroupName entity.entity.group.group_display_name Mappé directement à partir du champ Group.GroupName.
Group.GroupName entity.entity.group.email_addresses Mappé directement à partir du champ Group.GroupName.
Group.Path entity.entity.group.attribute.labels.value Mappée directement à partir du champ Group.Path, la clé est codée en dur sur path.
IsTruncated entity.entity.group.attribute.labels.value Mappée directement à partir du champ IsTruncated et convertie en chaîne, la clé est codée en dur sur is_truncated.
Repère entity.entity.group.attribute.labels.value Mappée directement à partir du champ Marker, la clé est codée en dur sur marker.
PasswordLastUsed entity.entity.user.last_login_time Mappé directement à partir du champ PasswordLastUsed et converti au format de code temporel de Chronicle.
Chemin d'accès entity.entity.user.attribute.labels.value Mappée directement à partir du champ Path pour le type d'entité USER, la clé est codée en dur sur path.
Chemin d'accès entity.entity.resource.attribute.labels.value Mappée directement à partir du champ Path pour le type d'entité RESOURCE, la clé est codée en dur sur path.
PermissionsBoundary.PermissionsBoundaryArn entity.entity.resource.attribute.labels.value Mappée directement à partir du champ PermissionsBoundary.PermissionsBoundaryArn, la clé est codée en dur sur permissions_boundary_arn.
PermissionsBoundary.PermissionsBoundaryType entity.entity.resource.attribute.labels.value Mappée directement à partir du champ PermissionsBoundary.PermissionsBoundaryType, la clé est codée en dur sur permissions_boundary_type.
RoleID entity.entity.resource.product_object_id Mappé directement à partir du champ RoleID.
RoleLastUsed.LastUsedDate entity.entity.resource.attribute.labels.value Mappée directement à partir du champ RoleLastUsed.LastUsedDate, la clé est codée en dur sur role_last_used_date.
RoleLastUsed.Region entity.entity.location.name Mappé directement à partir du champ RoleLastUsed.Region.
RoleName entity.entity.resource.attribute.roles.name Mappé directement à partir du champ RoleName.
Tags.Key entity.entity.user.attribute.labels.key Utilisé comme clé pour le champ labels dans l'attribut utilisateur.
Tags.Value entity.entity.user.attribute.labels.value Utilisé comme valeur du champ labels dans l'attribut utilisateur.
UserID entity.entity.user.product_object_id Mappé directement à partir du champ UserID.
Nom d'utilisateur entity.entity.user.userid Mappé directement à partir du champ UserName.
Users.Arn relations.entity.resource.name Mappé directement à partir du champ Users.Arn dans la relation utilisateur.
Users.CreateDate relations.entity.user.attribute.creation_time Mappé directement à partir du champ Users.CreateDate dans la relation utilisateur et converti au format de code temporel de Chronicle.
Users.PasswordLastUsed relations.entity.user.last_login_time Mappé directement à partir du champ Users.PasswordLastUsed dans la relation utilisateur et converti au format de code temporel de Chronicle.
Users.Path relations.entity.user.attribute.labels.value Mappée directement à partir du champ Users.Path dans la relation utilisateur, la clé est codée en dur sur path.
Users.PermissionsBoundary.PermissionsBoundaryArn relations.entity.resource.attribute.labels.value Mappée directement à partir du champ Users.PermissionsBoundary.PermissionsBoundaryArn dans la relation utilisateur, la clé est codée en dur sur permissions_boundary_arn.
Users.PermissionsBoundary.PermissionsBoundaryType relations.entity.resource.attribute.labels.value Mappée directement à partir du champ Users.PermissionsBoundary.PermissionsBoundaryType dans la relation utilisateur, la clé est codée en dur sur permissions_boundary_type.
Users.UserID relations.entity.user.product_object_id Mappé directement à partir du champ Users.UserID dans la relation utilisateur.
Users.UserName relations.entity.user.userid Mappé directement à partir du champ Users.UserName dans la relation utilisateur.
N/A entity.metadata.collected_timestamp Inséré avec le code temporel de l'événement à partir du journal brut.
N/A entity.metadata.vendor_name Codé en dur sur AWS.
N/A entity.metadata.product_name Codé en dur sur AWS IAM.
N/A entity.metadata.entity_type Déterminé en fonction de la présence de champs spécifiques: USER si UserID existe, RESOURCE si RoleName existe et GROUP si Group.GroupName existe.
N/A entity.entity.resource.resource_subtype Définissez la valeur sur User pour les types d'entités USER et GROUP.
N/A entity.entity.resource.resource_type Définissez la valeur sur ACCESS_POLICY pour le type d'entité RESOURCE.
N/A entity.entity.resource.attribute.cloud.environment Codé en dur sur AMAZON_WEB_SERVICES.
N/A relations.entity_type Coded en dur sur USER pour les relations utilisateur au sein d'un groupe.
N/A relations.relationship Coded en dur sur MEMBER pour les relations utilisateur au sein d'un groupe.
N/A relations.direction Coded en dur sur UNIDIRECTIONAL pour les relations utilisateur au sein d'un groupe.
N/A relations.entity.resource.resource_subtype Coded en dur sur User pour les relations utilisateur au sein d'un groupe.

Modifications

2023-12-14

  • Analyseur nouvellement créé.

Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.