Raccogli i log delle funzioni AWS Lambda
Questo documento spiega come importare i log delle funzioni AWS Lambda in Google Security Operations utilizzando Amazon S3.
AWS Lambda è un servizio di calcolo serverless che esegue il tuo codice in risposta agli eventi e gestisce automaticamente le risorse di calcolo sottostanti. Lambda invia automaticamente tutti i log delle funzioni (log della piattaforma, log delle estensioni e output dell'applicazione) ad Amazon CloudWatch Logs, creando un gruppo di log per funzione. Questa integrazione utilizza Amazon Data Firehose per trasmettere in streaming gli eventi di log Lambda da CloudWatch Logs a un bucket S3, che Google SecOps acquisisce utilizzando un feed Amazon S3 V2.
Prima di iniziare
Assicurati di soddisfare i seguenti prerequisiti:
- Un'istanza Google SecOps
- Accesso privilegiato alla Console di gestione AWS con autorizzazioni per gestire:
- AWS Lambda (funzioni, configurazione del logging)
- Amazon CloudWatch Logs (gruppi di log, filtri di sottoscrizione)
- Amazon Data Firehose (flussi di distribuzione)
- Amazon S3 (bucket)
- AWS IAM (ruoli, criteri, utenti)
Verifica il gruppo di log CloudWatch Logs per la tua funzione Lambda
AWS Lambda crea automaticamente un gruppo di log CloudWatch Logs per ogni funzione quando viene richiamata per la prima volta. La convenzione di denominazione predefinita per i gruppi di log è:
/aws/lambda/<function-name>
Per eseguire la verifica:
- Nella console AWS, vai a CloudWatch > Logs > Gruppi di log.
- Cerca
/aws/lambda/. Verifica che esista un gruppo di log per ogni funzione Lambda di cui vuoi importare i log.
Configurare un bucket AWS S3
- Crea un bucket Amazon S3 seguendo questa guida utente: Creazione di un bucket.
- Salva il nome e la regione del bucket per riferimento futuro (ad esempio,
lambda-logs-to-secops).
Configura un ruolo IAM per Amazon Data Firehose
Amazon Data Firehose richiede un ruolo IAM per scrivere i log nel bucket S3.
Crea il criterio IAM
- Nella console AWS, vai a IAM > Policy > Crea policy.
- Seleziona la scheda JSON.
Incolla la seguente policy (sostituisci
lambda-logs-to-secopscon il nome del bucket effettivo):{ "Version": "2012-10-17", "Statement": [ { "Sid": "S3Delivery", "Effect": "Allow", "Action": [ "s3:AbortMultipartUpload", "s3:GetBucketLocation", "s3:GetObject", "s3:ListBucket", "s3:ListBucketMultipartUploads", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::lambda-logs-to-secops", "arn:aws:s3:::lambda-logs-to-secops/*" ] }, { "Sid": "CloudWatchLogging", "Effect": "Allow", "Action": [ "logs:PutLogEvents" ], "Resource": "arn:aws:logs:*:*:log-group:/aws/kinesisfirehose/lambda-logs-to-secops:log-stream:*" } ] }Fai clic su Avanti.
Nel campo Nome policy, inserisci
LambdaLogsFirehoseS3Policy.Fai clic su Crea policy.
Crea il ruolo IAM
- Vai a IAM > Ruoli > Crea ruolo.
- Seleziona Norme di attendibilità personalizzate.
Incolla la seguente policy di attendibilità:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "firehose.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }Fai clic su Avanti.
Cerca e seleziona LambdaLogsFirehoseS3Policy.
Fai clic su Avanti.
Nel campo Nome ruolo, inserisci
LambdaLogsFirehoseToS3Role.Fai clic su Crea ruolo.
Crea lo stream Amazon Data Firehose
- Apri la console Kinesis all'indirizzo https://console.aws.amazon.com/kinesis.
- Nel riquadro di navigazione, seleziona Amazon Data Firehose.
- Fai clic su Crea stream Firehose.
- In Scegli origine e destinazione, fornisci la seguente configurazione:
- Origine: seleziona PUT diretto.
- Destinazione: seleziona Amazon S3.
- Nel campo Nome stream Firehose, inserisci
lambda-logs-to-secops. Nella sezione Decompress source records from Amazon CloudWatch Logs (Decomprimi i record di origine da Amazon CloudWatch Logs) della sezione Transform records (Trasforma record):
- Seleziona Attiva decompressione.
- Non selezionare Attiva l'estrazione dei messaggi.
Nella sezione Impostazioni destinazione:
- Bucket S3: seleziona il bucket S3
lambda-logs-to-secops. - Prefisso bucket S3 (facoltativo): inserisci
lambda-logs/. - Prefisso output errori bucket S3 (facoltativo): inserisci
firehose-errors/.
- Bucket S3: seleziona il bucket S3
Nella sezione Suggerimenti per il buffer:
- Dimensione del buffer:
5MiB (valore predefinito). - Intervallo di buffer:
300secondi (impostazione predefinita).
- Dimensione del buffer:
Nella sezione Impostazioni avanzate:
- Crittografia lato server: facoltativa. Attiva se è necessaria la crittografia.
- Registrazione degli errori: seleziona Attivata (opzione consigliata).
- Autorizzazioni: seleziona Scegli ruolo IAM esistente, quindi seleziona
LambdaLogsFirehoseToS3Role.
Fai clic su Crea stream Firehose.
Attendi che lo Stato dello stream mostri Attivo.
Configura un ruolo IAM per CloudWatch Logs
CloudWatch Logs richiede un ruolo IAM per inviare i dati di log al flusso Firehose.
Crea il criterio IAM
- Vai a IAM > Criteri > Crea criterio.
- Seleziona la scheda JSON.
Incolla il seguente criterio (sostituisci
<region>e<account-id>con la tua regione AWS e il tuo ID account):{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "firehose:PutRecord", "firehose:PutRecordBatch" ], "Resource": "arn:aws:firehose:<region>:<account-id>:deliverystream/lambda-logs-to-secops" } ] }Fai clic su Avanti.
Nel campo Nome policy, inserisci
LambdaLogsCWLtoFirehosePolicy.Fai clic su Crea policy.
Crea il ruolo IAM
- Vai a IAM > Ruoli > Crea ruolo.
- Seleziona Norme di attendibilità personalizzate.
Incolla la seguente policy di attendibilità (sostituisci
<region>con la tua regione AWS):{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "logs.<region>.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }Fai clic su Avanti.
Cerca e seleziona LambdaLogsCWLtoFirehosePolicy.
Fai clic su Avanti.
Nel campo Nome ruolo, inserisci
LambdaLogsCWLtoFirehoseRole.Fai clic su Crea ruolo.
Crea un filtro di sottoscrizione CloudWatch Logs
- Nella console AWS, vai a CloudWatch > Logs > Gruppi di log.
- Seleziona il gruppo di log
/aws/lambda/<function-name>. - Seleziona la scheda Filtri abbonamenti.
- Fai clic su Crea > Crea filtro di abbonamento Amazon Data Firehose.
- Fornisci i seguenti dettagli di configurazione:
- Destinazione: seleziona lo stream Firehose
lambda-logs-to-secops. - Concedi autorizzazione: seleziona il ruolo
LambdaLogsCWLtoFirehoseRole. - Nome filtro iscrizione: inserisci un nome descrittivo (ad esempio,
lambda-logs-to-secops-filter). - Formato log: seleziona Altro.
- Pattern di filtro della sottoscrizione: lascia vuoto per inviare tutti gli eventi di log della funzione Lambda.
- Destinazione: seleziona lo stream Firehose
Fai clic su Avvia streaming.
Configurare un utente IAM per Google SecOps
Google SecOps ha bisogno di un utente IAM con accesso al bucket S3 per importare i log forniti.
- Crea un utente seguendo questa guida utente: 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 il tag della 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 riferimento futuro.
- 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 il criterio AmazonS3FullAccess.
- Seleziona la policy.
- Fai clic su Avanti.
- Fai clic su Aggiungi autorizzazioni.
Configura un feed in Google SecOps per importare i log delle funzioni AWS Lambda
- Vai a Impostazioni SIEM > Feed.
- Fai clic su Aggiungi nuovo feed.
- Nella pagina successiva, fai clic su Configura un singolo feed.
- Inserisci un nome univoco per il nome del feed.
- Seleziona Amazon S3 V2 come Tipo di origine.
- Seleziona Funzione AWS Lambda come Tipo di log.
- Fai clic su Avanti e poi su Invia.
- Specifica i valori per i seguenti campi:
- URI S3:
s3://lambda-logs-to-secops/lambda-logs/ - Opzione di eliminazione della fonte: seleziona l'opzione di eliminazione in base alle tue preferenze.
- Età massima file: includi i file modificati nell'ultimo numero di giorni (il valore predefinito è 180 giorni)
- ID chiave di accesso: chiave di accesso utente con accesso al bucket S3
- Chiave di accesso segreta: 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
- URI S3:
- Fai clic su Avanti e poi su Invia.
Tabella di mappatura UDM
| Campo log | Mappatura UDM | Logica |
|---|---|---|
Activity_id_label |
additional.fields |
Unita |
Arrays_label |
additional.fields |
Unita |
Name_label |
additional.fields |
Unita |
Type_1_label |
additional.fields |
Unita |
Type_id_label |
additional.fields |
Unita |
Type_label |
additional.fields |
Unita |
Uid_label |
additional.fields |
Unita |
Uid_label_1 |
additional.fields |
Unita |
Value_label |
additional.fields |
Unita |
__type_label |
additional.fields |
Unita |
attempts_label |
additional.fields |
Unita |
class_name_label |
additional.fields |
Unita |
contentType_label |
additional.fields |
Unita |
env_label |
additional.fields |
Unita |
extendedRequestId_label |
additional.fields |
Unita |
feature_name_label |
additional.fields |
Unita |
line_number_label |
additional.fields |
Unita |
logType_label |
additional.fields |
Unita |
product_name_label |
additional.fields |
Unita |
requestid_label |
additional.fields |
Unita |
sourceAccount_label |
additional.fields |
Unita |
stack_label |
additional.fields |
Unita |
totalRetryDelay_label |
additional.fields |
Unita |
vendor_name_label |
additional.fields |
Unita |
version_label |
additional.fields |
Unita |
has_principal |
extensions.auth.type |
Mappato: true → AUTHTYPE_UNSPECIFIED |
description |
metadata.description |
Mappato direttamente |
file_desc |
metadata.description |
Mappato direttamente |
Time |
metadata.event_timestamp |
Analizzato come UNIX |
time |
metadata.event_timestamp |
Analizzato come yyyy-MM-ddTHH:mm:ss.SSSZ |
has_principal |
metadata.event_type |
Mappato: true → USER_LOGIN, true → NETWORK_HTTP, true → NETWORK_CONNECTION, `true... |
has_principal_user |
metadata.event_type |
Mappato: true → USER_RESOURCE_ACCESS |
Api.Operation |
metadata.product_event_type |
Mappato direttamente |
name |
metadata.product_event_type |
Mappato direttamente |
Api.Request.Uid |
metadata.product_log_id |
Mappato direttamente |
id |
metadata.product_log_id |
Mappato direttamente |
meta_data.requestId |
metadata.product_log_id |
Mappato direttamente |
Metadata.Version |
metadata.product_version |
Mappato direttamente |
version |
metadata.product_version |
Mappato direttamente |
meta_data.httpStatusCode |
network.http.response_code |
Mappato direttamente |
Http_request.User_agent |
network.http.user_agent |
Mappato direttamente |
Actor.Invoked_by |
principal.administrative_domain |
Mappato direttamente |
Src_endpoint.Domain |
principal.asset.hostname |
Mappato direttamente |
Src_endpoint.Domain |
principal.hostname |
Mappato direttamente |
Cloud.Region |
principal.resource.attribute.cloud.availability_zone |
Mappato direttamente |
Actor.User.Name |
principal.user.userid |
Mappato direttamente |
Status |
security_result.action_details |
Mappato direttamente |
Category_name |
security_result.category_details |
Unita |
error |
security_result.description |
Mappato direttamente |
errorMessage |
security_result.description |
Mappato direttamente |
Metadata_uid_label |
security_result.detection_fields |
Unita |
category_uid_label |
security_result.detection_fields |
Unita |
class_uid_label |
security_result.detection_fields |
Unita |
errorType_label |
security_result.detection_fields |
Unita |
event_code_label |
security_result.detection_fields |
Unita |
fault_label |
security_result.detection_fields |
Unita |
functionName_label |
security_result.detection_fields |
Unita |
severity_id_label |
security_result.detection_fields |
Unita |
sourceArn_label |
security_result.detection_fields |
Unita |
type_name_label |
security_result.detection_fields |
Unita |
type_uid_label |
security_result.detection_fields |
Unita |
user_type_label |
security_result.detection_fields |
Unita |
Severity |
security_result.severity |
Mappato: Informational → INFORMATIONAL |
severity |
security_result.severity |
Mappato: INFO → INFORMATIONAL |
msg |
security_result.summary |
Mappato direttamente |
Api.Service.Name |
target.application |
Mappato direttamente |
service |
target.application |
Mappato direttamente |
size |
target.file.size |
Mappato direttamente |
filename |
target.process.file.full_path |
Mappato direttamente |
Activity_name |
target.resource.name |
Mappato direttamente |
targetVar |
target.resource.name |
Mappato direttamente |
| N/D | extensions.auth.type |
Costante: AUTHTYPE_UNSPECIFIED |
| N/D | metadata.event_type |
Costante: USER_UNCATEGORIZED |
| N/D | metadata.product_name |
Costante: AWS_Lambda_Function |
| N/D | metadata.vendor_name |
Costante: AWS_Lambda_Function |
| N/D | principal.resource.attribute.cloud.environment |
Costante: AMAZON_WEB_SERVICES |
| N/D | security_result.severity |
Costante: INFORMATIONAL |
Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.