Raccogliere i log IAM AWS
Questo documento spiega come importare i log AWS IAM 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 dell'utente, le informazioni sul ruolo, 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
- Crea un bucket Amazon S3 seguendo questa guida utente: Creazione di un bucket.
- Salva il nome e la regione del bucket per utilizzarli in un secondo momento.
- Crea un utente seguendo questa guida: Creazione di un utente IAM.
- Seleziona l'utente creato.
- Seleziona la scheda Credenziali di sicurezza.
- Fai clic su Crea chiave di accesso nella sezione Chiavi di accesso.
- Seleziona Servizio di terze parti come Caso d'uso.
- Fai clic su Avanti.
- (Facoltativo) Aggiungi un tag di descrizione.
- Fai clic su Crea chiave di accesso.
- Fai clic su Scarica file CSV per salvare la chiave di accesso e la chiave di accesso segreta per un utilizzo successivo.
- Fai clic su Fine.
- Seleziona la scheda Autorizzazioni.
- Fai clic su Aggiungi autorizzazioni nella sezione Criteri per le autorizzazioni.
- Seleziona Aggiungi autorizzazioni.
- Seleziona Allega direttamente i criteri.
- Cerca e seleziona il criterio AmazonS3FullAccess.
- Fai clic su Avanti.
- Fai clic su Aggiungi autorizzazioni.
Configura CloudTrail per acquisire i log IAM
- Accedi alla console di gestione AWS.
- Nella barra di ricerca, digita e seleziona CloudTrail dall'elenco dei servizi.
- Fai clic su Crea percorso.
- Fornisci un Nome trail, ad esempio
IAMActivityTrail
.- Applica la traccia a tutte le regioni: seleziona Sì 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 sulle risorse IAM.
- Eventi di dati: attiva gli eventi di dati S3 e Lambda.
- Fai clic su Crea per creare la traccia.
Configura CloudTrail per esportare i log in S3
- Vai a Services > S3.
- Seleziona il bucket S3 in cui sono archiviati i log di CloudTrail, ad esempio
iam-logs-bucket
. - Assicurati che CloudTrail disponga delle autorizzazioni corrette per scrivere i log nel bucket.
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/*" } ] }
Abilita il controllo delle versioni sul bucket S3 per assicurarti che i log vengano archiviati con più versioni.
Vai a Proprietà > Controllo delle versioni del bucket > Attiva.
(Facoltativo) Configura Lambda per l'esportazione in tempo reale
- Vai alla console Lambda di AWS.
- Fai clic su Crea funzione.
- Seleziona Autore da zero.
- Imposta il nome della funzione su
ExportIAMLogsToS3
. - Seleziona un runtime Python 3.x.
Assegna alla funzione un ruolo IAM con le 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/*" } ] }
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 del bucket effettivo.
Configura il trigger Lambda per CloudWatch Logs
- Nella console Lambda, vai a Designer.
- Scegli Aggiungi trigger > CloudWatch Logs.
- Seleziona il gruppo di log CloudWatch Logs associato ai tuoi log IAM, ad esempio
/aws/cloudtrail/
. - Fai clic su Aggiungi.
Configurare i feed
Esistono due diversi punti di accesso per configurare i feed nella piattaforma Google SecOps:
- Impostazioni SIEM > Feed > Aggiungi nuovo
- Hub dei contenuti > Pacchetti di contenuti > Inizia
Come configurare il feed AWS IAM
- Fai clic sul pacchetto Amazon Cloud Platform.
- Individua il tipo di log AWS IAM.
Specifica i valori nei seguenti campi.
- Tipo di origine: API di terze parti
- Nome utente: nome utente per l'autenticazione
- Secret: secret per l'autenticazione
Opzioni avanzate
- Nome feed: un valore precompilato che identifica il feed.
- Spazio dei nomi dell'asset: lo spazio dei nomi associato al feed.
- Etichette di importazione: etichette applicate a tutti gli eventi di questo feed.
Fai clic su Crea feed.
Per ulteriori informazioni sulla configurazione di più feed per diversi tipi di log all'interno di questa famiglia di prodotti, consulta Configurare i feed per prodotto.
Tabella di mappatura UDM
Campo log | Mappatura UDM | Logic |
---|---|---|
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 | Mappata direttamente dal campo Group.Path , la chiave è hardcoded su path |
IsTruncated | entity.entity.group.attribute.labels.value | Mappata direttamente dal campo IsTruncated e convertita in stringa, la chiave è codificata in modo permanente su is_truncated |
Indicatore | entity.entity.group.attribute.labels.value | Mappata 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 | Mappata direttamente dal campo Path per il tipo di entità USER, la chiave è codificata in modo permanente su path . |
Percorso | entity.entity.resource.attribute.labels.value | Mappata direttamente dal campo Path per il tipo di entità RESOURCE, la chiave è hardcoded su path . |
PermissionsBoundary.PermissionsBoundaryArn | entity.entity.resource.attribute.labels.value | Mappata direttamente dal campo PermissionsBoundary.PermissionsBoundaryArn , la chiave è hardcoded su permissions_boundary_arn . |
PermissionsBoundary.PermissionsBoundaryType | entity.entity.resource.attribute.labels.value | Mappata 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 | Mappata 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 | Mappata direttamente dal campo Users.Path all'interno della relazione utente, la chiave è codificata in modo permanente su path . |
Users.PermissionsBoundary.PermissionsBoundaryArn | relations.entity.resource.attribute.labels.value | Mappata direttamente dal campo Users.PermissionsBoundary.PermissionsBoundaryArn all'interno della relazione utente, la chiave è codificata in modo permanente su permissions_boundary_arn . |
Users.PermissionsBoundary.PermissionsBoundaryType | relations.entity.resource.attribute.labels.value | Mappata direttamente dal campo Users.PermissionsBoundary.PermissionsBoundaryType all'interno della relazione utente, la chiave è codificata in modo permanente 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 | Codificato in modo permanente su AWS . |
N/D | entity.metadata.product_name | Codificato in modo permanente su 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 | Imposta su User per i tipi di entità USER e GROUP. |
N/D | entity.entity.resource.resource_type | Imposta su ACCESS_POLICY per il tipo di entità RESOURCE. |
N/D | entity.entity.resource.attribute.cloud.environment | Codificato in modo permanente su AMAZON_WEB_SERVICES . |
N/D | relations.entity_type | Codificato in modo permanente su USER per le relazioni utente all'interno di un gruppo. |
N/D | relations.relationship | Codificato in modo permanente su MEMBER per le relazioni utente all'interno di un gruppo. |
N/D | relations.direction | Codificato in modo permanente su UNIDIRECTIONAL per le relazioni utente all'interno di un gruppo. |
N/D | relations.entity.resource.resource_subtype | Codificato in modo permanente su User per le relazioni utente all'interno di un gruppo. |
Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.