Raccogliere i log di AWS IAM

Supportato in:

Questo documento spiega come importare i log IAM di AWS in Google Security Operations. Il parser trasforma i log non elaborati in formato JSON in un modello UDM (Unified Data Model) strutturato. Estrae i campi pertinenti, come i dettagli utente, le informazioni sui ruoli, le autorizzazioni e i timestamp, mappandoli ai campi UDM corrispondenti per un'analisi della sicurezza coerente.

Prima di iniziare

  • Assicurati di avere un'istanza Google SecOps.
  • Assicurati di disporre dell'accesso con privilegi ad AWS.

Configura AWS IAM e S3

  1. Crea un bucket Amazon S3 seguendo questa guida dell'utente: Creazione di un bucket.
  2. Salva Nome e Regione del bucket per utilizzarli in un secondo momento.
  3. Crea un utente seguendo questa guida dell'utente: Creare un utente IAM.
  4. Seleziona l'utente creato.
  5. Seleziona la scheda Credenziali di sicurezza.
  6. Fai clic su Crea chiave di accesso nella sezione Chiavi di accesso.
  7. Seleziona Servizio di terze parti come Caso d'uso.
  8. Fai clic su Avanti.
  9. (Facoltativo) Aggiungi un tag di descrizione.
  10. Fai clic su Crea chiave di accesso.
  11. Fai clic su Scarica file CSV per salvare la chiave di accesso e la chiave di accesso segreta per utilizzarle in un secondo momento.
  12. Fai clic su Fine.
  13. Seleziona la scheda Autorizzazioni.
  14. Fai clic su Aggiungi autorizzazioni nella sezione Norme relative alle autorizzazioni.
  15. Seleziona Aggiungi autorizzazioni.
  16. Seleziona Collega direttamente i criteri.
  17. Cerca e seleziona il criterio AmazonS3FullAccess.
  18. Fai clic su Avanti.
  19. Fai clic su Aggiungi autorizzazioni.

Configura CloudTrail per acquisire i log IAM

  1. Accedi alla AWS Management Console.
  2. Nella barra di ricerca, digita e seleziona CloudTrail dall'elenco dei servizi.
  3. Fai clic su Crea percorso.
  4. Fornisci un nome del percorso, ad esempio IAMActivityTrail.
    • Applica il percorso a tutte le regioni: seleziona per acquisire le attività in tutte le regioni.
    • Posizione di archiviazione: seleziona il bucket S3 creato in precedenza o creane uno nuovo.
    • Bucket S3: inserisci un nome per il bucket S3, ad esempio iam-logs-bucket.
    • Seleziona Crea un nuovo ruolo IAM (se non è stato creato in precedenza).
    • Eventi di gestione: seleziona Lettura e Scrittura per acquisire gli eventi di lettura e scrittura nelle risorse IAM.
    • Eventi di dati: attiva gli eventi di dati S3 e Lambda.
  5. Fai clic su Crea per creare il percorso.

Configura CloudTrail per esportare i log in S3

  1. Vai a Servizi > S3.
  2. Seleziona il bucket S3 in cui sono archiviati i log di CloudTrail, ad esempio iam-logs-bucket.
  3. Assicurati che CloudTrail disponga delle autorizzazioni necessarie per scrivere i log nel bucket.
  4. Aggiungi il seguente criterio se non è già presente:

    {
      "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. Attiva il controllo delle versioni sul bucket S3 per assicurarti che i log vengano archiviati con più versioni.

  6. Vai a Proprietà > Versionamento del bucket > Attiva.

(Facoltativo) Configura Lambda per l'esportazione in tempo reale

  1. Vai alla console Lambda di AWS.
  2. Fai clic su Crea funzione.
  3. Seleziona Autore da zero.
  4. Imposta il nome della funzione su ExportIAMLogsToS3.
  5. Seleziona un runtime Python 3.x.
  6. Assegna alla funzione un ruolo IAM con autorizzazioni per:

    {
      "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. Utilizza il seguente codice Python per recuperare i log IAM e caricarli su 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
        )
    
  • Sostituisci your-s3-bucket-name con il nome effettivo del bucket.

Configurare l'attivatore Lambda per i log CloudWatch

  1. Nella console Lambda, vai a Designer.
  2. Scegli Aggiungi attivatore > Log di CloudWatch.
  3. Seleziona il gruppo di log CloudWatch Logs associato ai log IAM, ad esempio /aws/cloudtrail/.
  4. Fai clic su Aggiungi.

Configura un feed in Google SecOps per importare i log AWS IAM

  1. Vai a Impostazioni SIEM > Feed.
  2. Fai clic su Aggiungi nuovo.
  3. Nel campo Nome feed, inserisci un nome per il feed, ad esempio Log AWS IAM.
  4. Seleziona Amazon S3 come Tipo di origine.
  5. Seleziona AWS IAM come Tipo di log.
  6. Fai clic su Avanti.
  7. Specifica i valori per i seguenti parametri di input:

    • Regione: la regione in cui si trova il bucket Amazon S3.
    • URI S3: l'URI del bucket.
      • s3://your-log-bucket-name/
        • Sostituisci your-log-bucket-name con il nome effettivo del bucket.
    • L'URI è una: seleziona Directory o Directory che include sottodirectory.
    • Opzioni di eliminazione dell'origine: seleziona l'opzione di eliminazione in base alle tue preferenze.

    • ID chiave di accesso: la chiave di accesso utente con accesso al bucket S3.

    • Chiave di accesso segreta: la chiave segreta dell'utente con accesso al bucket S3.

    • Spazio dei nomi dell'asset: lo spazio dei nomi dell'asset.

    • Etichette di importazione: l'etichetta da applicare agli eventi di questo feed.

  8. Fai clic su Avanti.

  9. Rivedi la configurazione del nuovo feed nella schermata Concludi e poi fai clic su Invia.

Tabella di mappatura UDM

Campo log Mappatura UDM Logica
Arn entity.entity.resource.name Mappato direttamente dal campo Arn per i tipi di entità USER e RESOURCE. Per il tipo di entità GRUPPO, viene mappato da Group.Arn.
AssumeRolePolicyDocument entity.entity.resource.attribute.permissions.name Mappato direttamente dal campo AssumeRolePolicyDocument, ma solo per il tipo di entità RESOURCE.
CreateDate entity.entity.user.attribute.creation_time Mappato direttamente dal campo CreateDate e convertito nel formato timestamp di Chronicle per il tipo di entità USER.
CreateDate entity.entity.resource.attribute.creation_time Mappato direttamente dal campo CreateDate e convertito nel formato timestamp di Chronicle per il tipo di entità RESOURCE.
Group.Arn entity.entity.resource.name Mappato direttamente dal campo Group.Arn per il tipo di entità GRUPPO.
Group.CreateDate entity.entity.group.attribute.creation_time Mappato direttamente dal campo Group.CreateDate e convertito nel formato timestamp di Chronicle.
Group.GroupID entity.entity.group.product_object_id Mappato direttamente dal campo Group.GroupID.
Group.GroupName entity.entity.group.group_display_name Mappato direttamente dal campo Group.GroupName.
Group.GroupName entity.entity.group.email_addresses Mappato direttamente dal campo Group.GroupName.
Group.Path entity.entity.group.attribute.labels.value Mappato direttamente dal campo Group.Path, la chiave è hardcoded su path
IsTruncated entity.entity.group.attribute.labels.value Mappato direttamente dal campo IsTruncated e convertito in stringa, la chiave è hardcoded su is_truncated
Indicatore entity.entity.group.attribute.labels.value Mappato direttamente dal campo Marker, la chiave è hardcoded su marker
PasswordLastUsed entity.entity.user.last_login_time Mappato direttamente dal campo PasswordLastUsed e convertito nel formato timestamp di Chronicle.
Percorso entity.entity.user.attribute.labels.value Mappato direttamente dal campo Path per il tipo di entità USER, la chiave è hardcoded su path.
Percorso entity.entity.resource.attribute.labels.value Mappato direttamente dal campo Path per il tipo di entità RESOURCE, la chiave è hardcoded su path.
PermissionsBoundary.PermissionsBoundaryArn entity.entity.resource.attribute.labels.value Mappato direttamente dal campo PermissionsBoundary.PermissionsBoundaryArn, la chiave è hardcoded su permissions_boundary_arn.
PermissionsBoundary.PermissionsBoundaryType entity.entity.resource.attribute.labels.value Mappato direttamente dal campo PermissionsBoundary.PermissionsBoundaryType, la chiave è hardcoded su permissions_boundary_type.
RoleID entity.entity.resource.product_object_id Mappato direttamente dal campo RoleID.
RoleLastUsed.LastUsedDate entity.entity.resource.attribute.labels.value Mappato direttamente dal campo RoleLastUsed.LastUsedDate, la chiave è hardcoded su role_last_used_date.
RoleLastUsed.Region entity.entity.location.name Mappato direttamente dal campo RoleLastUsed.Region.
RoleName entity.entity.resource.attribute.roles.name Mappato direttamente dal campo RoleName.
Tags.Key entity.entity.user.attribute.labels.key Utilizzato come chiave per il campo labels all'interno dell'attributo utente.
Tags.Value entity.entity.user.attribute.labels.value Utilizzato come valore per il campo labels all'interno dell'attributo utente.
UserID entity.entity.user.product_object_id Mappato direttamente dal campo UserID.
Nome utente entity.entity.user.userid Mappato direttamente dal campo UserName.
Users.Arn relations.entity.resource.name Mappato direttamente dal campo Users.Arn all'interno della relazione utente.
Users.CreateDate relations.entity.user.attribute.creation_time Mappato direttamente dal campo Users.CreateDate all'interno della relazione utente e convertito nel formato timestamp di Chronicle.
Users.PasswordLastUsed relations.entity.user.last_login_time Mappato direttamente dal campo Users.PasswordLastUsed all'interno della relazione utente e convertito nel formato timestamp di Chronicle.
Users.Path relations.entity.user.attribute.labels.value Mappato direttamente dal campo Users.Path all'interno della relazione utente, la chiave è hardcoded su path.
Users.PermissionsBoundary.PermissionsBoundaryArn relations.entity.resource.attribute.labels.value Mappato direttamente dal campo Users.PermissionsBoundary.PermissionsBoundaryArn all'interno della relazione utente, la chiave è hardcoded su permissions_boundary_arn.
Users.PermissionsBoundary.PermissionsBoundaryType relations.entity.resource.attribute.labels.value Mappato direttamente dal campo Users.PermissionsBoundary.PermissionsBoundaryType all'interno della relazione utente, la chiave è hardcoded su permissions_boundary_type.
Users.UserID relations.entity.user.product_object_id Mappato direttamente dal campo Users.UserID all'interno della relazione utente.
Users.UserName relations.entity.user.userid Mappato direttamente dal campo Users.UserName all'interno della relazione utente.
N/D entity.metadata.collected_timestamp Completato con il timestamp dell'evento dal log non elaborato.
N/D entity.metadata.vendor_name Hardcoded a AWS.
N/D entity.metadata.product_name Hardcoded a AWS IAM.
N/D entity.metadata.entity_type Determinato in base alla presenza di campi specifici: USER se esiste UserID, RESOURCE se esiste RoleName e GROUP se esiste Group.GroupName.
N/D entity.entity.resource.resource_subtype Impostato su User per i tipi di entità USER e GROUP.
N/D entity.entity.resource.resource_type Impostato su ACCESS_POLICY per il tipo di entità RESOURCE.
N/D entity.entity.resource.attribute.cloud.environment Hardcoded a AMAZON_WEB_SERVICES.
N/D relations.entity_type Hardcoded su USER per le relazioni utente all'interno di un gruppo.
N/D relations.relationship Hardcoded su MEMBER per le relazioni utente all'interno di un gruppo.
N/D relations.direction Hardcoded su UNIDIRECTIONAL per le relazioni utente all'interno di un gruppo.
N/D relations.entity.resource.resource_subtype Hardcoded su User per le relazioni utente all'interno di un gruppo.

Modifiche

2023-12-14

  • Parser appena creato.

Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.