Raccogliere i log di AWS IAM
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
- Crea un bucket Amazon S3 seguendo questa guida dell'utente: Creazione di un bucket.
- Salva Nome e Regione del bucket per utilizzarli in un secondo momento.
- Crea un utente seguendo questa guida dell'utente: Creare 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 utilizzarle in un secondo momento.
- Fai clic su Fine.
- Seleziona la scheda Autorizzazioni.
- Fai clic su Aggiungi autorizzazioni nella sezione Norme relative alle autorizzazioni.
- Seleziona Aggiungi autorizzazioni.
- Seleziona Collega 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 AWS Management Console.
- Nella barra di ricerca, digita e seleziona CloudTrail dall'elenco dei servizi.
- Fai clic su Crea percorso.
- Fornisci un nome del percorso, ad esempio
IAMActivityTrail
.- Applica il percorso 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 nelle risorse IAM.
- Eventi di dati: attiva gli eventi di dati S3 e Lambda.
- Fai clic su Crea per creare il percorso.
Configura CloudTrail per esportare i log in S3
- Vai a Servizi > S3.
- Seleziona il bucket S3 in cui sono archiviati i log di CloudTrail, ad esempio
iam-logs-bucket
. - Assicurati che CloudTrail disponga delle autorizzazioni necessarie 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/*" } ] }
Attiva il controllo delle versioni sul bucket S3 per assicurarti che i log vengano archiviati con più versioni.
Vai a Proprietà > Versionamento 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 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 effettivo del bucket.
Configurare l'attivatore Lambda per i log CloudWatch
- Nella console Lambda, vai a Designer.
- Scegli Aggiungi attivatore > Log di CloudWatch.
- Seleziona il gruppo di log CloudWatch Logs associato ai log IAM, ad esempio
/aws/cloudtrail/
. - Fai clic su Aggiungi.
Configura un feed in Google SecOps per importare i log AWS IAM
- Vai a Impostazioni SIEM > Feed.
- Fai clic su Aggiungi nuovo.
- Nel campo Nome feed, inserisci un nome per il feed, ad esempio Log AWS IAM.
- Seleziona Amazon S3 come Tipo di origine.
- Seleziona AWS IAM come Tipo di log.
- Fai clic su Avanti.
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.
- Sostituisci
- 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.
Fai clic su Avanti.
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.