Coletar registros de funções do AWS Lambda
Este documento explica como ingerir registros de função do AWS Lambda no Google Security Operations usando o Amazon S3.
O AWS Lambda é um serviço de computação sem servidor que executa seu código em resposta a eventos e gerencia automaticamente os recursos de computação subjacentes. O Lambda envia automaticamente todos os registros de função (registros da plataforma, de extensão e saída do aplicativo) para o Amazon CloudWatch Logs, criando um grupo de registros por função. Essa integração usa o Amazon Data Firehose para transmitir eventos de registro do Lambda dos registros do CloudWatch para um bucket do S3, que o Google SecOps ingere usando um feed do Amazon S3 V2.
Antes de começar
Verifique se você tem os pré-requisitos a seguir:
- Uma instância do Google SecOps
- Acesso privilegiado ao AWS Management Console com permissões para gerenciar:
- AWS Lambda (funções, configuração de geração de registros)
- Amazon CloudWatch Logs (grupos de registros, filtros de assinatura)
- Amazon Data Firehose (fluxos de entrega)
- Amazon S3 (buckets)
- IAM da AWS (papéis, políticas, usuários)
Verifique o grupo de registros do CloudWatch Logs da sua função do Lambda
O AWS Lambda cria automaticamente um grupo de registros do CloudWatch Logs para cada função quando ela é invocada pela primeira vez. A convenção de nomenclatura padrão do grupo de registros é:
/aws/lambda/<function-name>
Para verificar:
- No console da AWS, acesse CloudWatch > Registros > Grupos de registros.
- Pesquisar por
/aws/lambda/. Confirme se há um grupo de registros para cada função do Lambda cujos registros você quer ingerir.
Configurar um bucket do AWS S3
- Crie um bucket do Amazon S3 seguindo este guia do usuário: Como criar um bucket.
- Salve o Nome e a Região do bucket para referência futura (por exemplo,
lambda-logs-to-secops).
Configurar uma função do IAM para o Amazon Data Firehose
O Amazon Data Firehose exige uma função do IAM para gravar registros no bucket do S3.
Criar a política do IAM
- No console da AWS, acesse IAM > Políticas > Criar política.
- Selecione a guia JSON.
Cole a seguinte política (substitua
lambda-logs-to-secopspelo nome real do bucket):{ "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:*" } ] }Clique em Próxima.
No campo Nome da política, digite
LambdaLogsFirehoseS3Policy.Clique em Criar política.
Criar o papel do IAM
- Acesse IAM > Papéis > Criar papel.
- Selecione Política de confiança personalizada.
Cole a seguinte política de confiança:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "firehose.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }Clique em Próxima.
Pesquise e selecione LambdaLogsFirehoseS3Policy.
Clique em Próxima.
No campo Nome da função, insira
LambdaLogsFirehoseToS3Role.Clique em Criar papel.
Criar o fluxo do Amazon Data Firehose
- Abra o console do Kinesis em https://console.aws.amazon.com/kinesis.
- No painel de navegação, selecione Amazon Data Firehose.
- Clique em Criar stream do Firehose.
- Em Escolher origem e destino, forneça a seguinte configuração:
- Origem: selecione PUT direto.
- Destino: selecione Amazon S3.
- No campo Nome do fluxo do Firehose, insira
lambda-logs-to-secops. Em Transformar registros, na seção Descompactar registros de origem do Amazon CloudWatch Logs:
- Selecione Ativar a descompactação.
- Não selecione Ativar a extração de mensagens.
Em Configurações de destino:
- Bucket do S3: selecione o bucket do S3
lambda-logs-to-secops. - Prefixo do bucket do S3 (opcional): insira
lambda-logs/. - Prefixo de saída de erro do bucket do S3 (opcional): insira
firehose-errors/.
- Bucket do S3: selecione o bucket do S3
Em Dicas de buffer:
- Tamanho do buffer:
5MiB (padrão). - Intervalo do buffer:
300segundos (padrão).
- Tamanho do buffer:
Em Configurações avançadas:
- Criptografia do lado do servidor: opcional. Ative se a criptografia for necessária.
- Registro de erros: selecione Ativado (recomendado).
- Permissões: selecione Escolher papel do IAM atual e
LambdaLogsFirehoseToS3Role.
Clique em Criar stream do Firehose.
Aguarde até que o Status do fluxo seja Ativo.
Configurar uma função do IAM para o CloudWatch Logs
O CloudWatch Logs exige uma função do IAM para enviar dados de registros ao fluxo do Firehose.
Criar a política do IAM
- Acesse IAM > Políticas > Criar política.
- Selecione a guia JSON.
Cole a seguinte política (substitua
<region>e<account-id>pela região da AWS e pelo ID da conta):{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "firehose:PutRecord", "firehose:PutRecordBatch" ], "Resource": "arn:aws:firehose:<region>:<account-id>:deliverystream/lambda-logs-to-secops" } ] }Clique em Próxima.
No campo Nome da política, digite
LambdaLogsCWLtoFirehosePolicy.Clique em Criar política.
Criar o papel do IAM
- Acesse IAM > Papéis > Criar papel.
- Selecione Política de confiança personalizada.
Cole a seguinte política de confiança (substitua
<region>pela sua região da AWS):{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "logs.<region>.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }Clique em Próxima.
Pesquise e selecione LambdaLogsCWLtoFirehosePolicy.
Clique em Próxima.
No campo Nome da função, insira
LambdaLogsCWLtoFirehoseRole.Clique em Criar papel.
Criar um filtro de assinatura do CloudWatch Logs
- No console da AWS, acesse CloudWatch > Registros > Grupos de registros.
- Selecione o grupo de registros
/aws/lambda/<function-name>. - Selecione a guia Filtros de assinatura.
- Clique em Criar > Criar filtro de assinatura do Amazon Data Firehose.
- Informe os seguintes detalhes de configuração:
- Destino: selecione o fluxo do Firehose
lambda-logs-to-secops. - Conceder permissão: selecione a função
LambdaLogsCWLtoFirehoseRole. - Nome do filtro de assinatura: insira um nome descritivo, por exemplo,
lambda-logs-to-secops-filter. - Formato do registro: selecione Outro.
- Padrão de filtro de assinatura: deixe em branco para enviar todos os eventos de registro da função Lambda.
- Destino: selecione o fluxo do Firehose
Clique em Iniciar streaming.
Configurar um usuário do IAM para o Google SecOps
O Google SecOps precisa de um usuário do IAM com acesso ao bucket do S3 para ingerir os registros entregues.
- Crie um usuário seguindo este guia: Como criar um usuário do IAM.
- Selecione o usuário criado.
- Selecione a guia Credenciais de segurança.
- Clique em Criar chave de acesso na seção Chaves de acesso.
- Selecione Serviço de terceiros como Caso de uso.
- Clique em Próxima.
- Opcional: adicione uma tag de descrição.
- Clique em Criar chave de acesso.
- Clique em Baixar arquivo .csv para salvar a Chave de acesso e a Chave de acesso secreta para referência futura.
- Clique em Concluído.
- Selecione a guia Permissões.
- Clique em Adicionar permissões na seção Políticas de permissões.
- Selecione Adicionar permissões.
- Selecione Anexar políticas diretamente.
- Pesquise a política AmazonS3FullAccess.
- Selecione a política.
- Clique em Próxima.
- Clique em Adicionar permissões
Configurar um feed no Google SecOps para ingerir registros de funções do AWS Lambda
- Acesse Configurações do SIEM > Feeds.
- Clique em Adicionar novo feed.
- Na próxima página, clique em Configurar um único feed.
- Insira um nome exclusivo para o Nome do feed.
- Selecione Amazon S3 V2 como o Tipo de origem.
- Selecione Função do AWS Lambda como o Tipo de registro.
- Clique em Próxima e em Enviar.
- Especifique valores para os seguintes campos:
- URI do S3:
s3://lambda-logs-to-secops/lambda-logs/ - Opção de exclusão da fonte: selecione a opção de exclusão de acordo com sua preferência.
- Idade máxima do arquivo: inclui arquivos modificados nos últimos dias. O padrão é 180 dias.
- ID da chave de acesso: chave de acesso do usuário com acesso ao bucket do S3
- Chave de acesso secreta: chave secreta do usuário com acesso ao bucket do S3
- Namespace do recurso: o namespace do recurso
- Rótulos de ingestão: o rótulo a ser aplicado aos eventos deste feed
- URI do S3:
- Clique em Próxima e em Enviar.
Tabela de mapeamento do UDM
| Campo de registro | Mapeamento do UDM | Lógica |
|---|---|---|
Activity_id_label |
additional.fields |
Mesclado |
Arrays_label |
additional.fields |
Mesclado |
Name_label |
additional.fields |
Mesclado |
Type_1_label |
additional.fields |
Mesclado |
Type_id_label |
additional.fields |
Mesclado |
Type_label |
additional.fields |
Mesclado |
Uid_label |
additional.fields |
Mesclado |
Uid_label_1 |
additional.fields |
Mesclado |
Value_label |
additional.fields |
Mesclado |
__type_label |
additional.fields |
Mesclado |
attempts_label |
additional.fields |
Mesclado |
class_name_label |
additional.fields |
Mesclado |
contentType_label |
additional.fields |
Mesclado |
env_label |
additional.fields |
Mesclado |
extendedRequestId_label |
additional.fields |
Mesclado |
feature_name_label |
additional.fields |
Mesclado |
line_number_label |
additional.fields |
Mesclado |
logType_label |
additional.fields |
Mesclado |
product_name_label |
additional.fields |
Mesclado |
requestid_label |
additional.fields |
Mesclado |
sourceAccount_label |
additional.fields |
Mesclado |
stack_label |
additional.fields |
Mesclado |
totalRetryDelay_label |
additional.fields |
Mesclado |
vendor_name_label |
additional.fields |
Mesclado |
version_label |
additional.fields |
Mesclado |
has_principal |
extensions.auth.type |
Mapeado: true → AUTHTYPE_UNSPECIFIED |
description |
metadata.description |
Mapeado diretamente |
file_desc |
metadata.description |
Mapeado diretamente |
Time |
metadata.event_timestamp |
Analisado como UNIX |
time |
metadata.event_timestamp |
Analisado como yyyy-MM-ddTHH:mm:ss.SSSZ |
has_principal |
metadata.event_type |
Mapeado: true → USER_LOGIN, true → NETWORK_HTTP, true → NETWORK_CONNECTION, "true... |
has_principal_user |
metadata.event_type |
Mapeado: true → USER_RESOURCE_ACCESS |
Api.Operation |
metadata.product_event_type |
Mapeado diretamente |
name |
metadata.product_event_type |
Mapeado diretamente |
Api.Request.Uid |
metadata.product_log_id |
Mapeado diretamente |
id |
metadata.product_log_id |
Mapeado diretamente |
meta_data.requestId |
metadata.product_log_id |
Mapeado diretamente |
Metadata.Version |
metadata.product_version |
Mapeado diretamente |
version |
metadata.product_version |
Mapeado diretamente |
meta_data.httpStatusCode |
network.http.response_code |
Mapeado diretamente |
Http_request.User_agent |
network.http.user_agent |
Mapeado diretamente |
Actor.Invoked_by |
principal.administrative_domain |
Mapeado diretamente |
Src_endpoint.Domain |
principal.asset.hostname |
Mapeado diretamente |
Src_endpoint.Domain |
principal.hostname |
Mapeado diretamente |
Cloud.Region |
principal.resource.attribute.cloud.availability_zone |
Mapeado diretamente |
Actor.User.Name |
principal.user.userid |
Mapeado diretamente |
Status |
security_result.action_details |
Mapeado diretamente |
Category_name |
security_result.category_details |
Mesclado |
error |
security_result.description |
Mapeado diretamente |
errorMessage |
security_result.description |
Mapeado diretamente |
Metadata_uid_label |
security_result.detection_fields |
Mesclado |
category_uid_label |
security_result.detection_fields |
Mesclado |
class_uid_label |
security_result.detection_fields |
Mesclado |
errorType_label |
security_result.detection_fields |
Mesclado |
event_code_label |
security_result.detection_fields |
Mesclado |
fault_label |
security_result.detection_fields |
Mesclado |
functionName_label |
security_result.detection_fields |
Mesclado |
severity_id_label |
security_result.detection_fields |
Mesclado |
sourceArn_label |
security_result.detection_fields |
Mesclado |
type_name_label |
security_result.detection_fields |
Mesclado |
type_uid_label |
security_result.detection_fields |
Mesclado |
user_type_label |
security_result.detection_fields |
Mesclado |
Severity |
security_result.severity |
Mapeado: Informational → INFORMATIONAL |
severity |
security_result.severity |
Mapeado: INFO → INFORMATIONAL |
msg |
security_result.summary |
Mapeado diretamente |
Api.Service.Name |
target.application |
Mapeado diretamente |
service |
target.application |
Mapeado diretamente |
size |
target.file.size |
Mapeado diretamente |
filename |
target.process.file.full_path |
Mapeado diretamente |
Activity_name |
target.resource.name |
Mapeado diretamente |
targetVar |
target.resource.name |
Mapeado diretamente |
| N/A | extensions.auth.type |
Constante: AUTHTYPE_UNSPECIFIED |
| N/A | metadata.event_type |
Constante: USER_UNCATEGORIZED |
| N/A | metadata.product_name |
Constante: AWS_Lambda_Function |
| N/A | metadata.vendor_name |
Constante: AWS_Lambda_Function |
| N/A | principal.resource.attribute.cloud.environment |
Constante: AMAZON_WEB_SERVICES |
| N/A | security_result.severity |
Constante: INFORMATIONAL |
Registro de alterações
Ver o registro de alterações deste analisador
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.