Coletar registros do AWS IAM
Este documento explica como transferir os registros do AWS IAM para o Google Security Operations. O analisador transforma registros brutos formatados em JSON em um modelo de dados unificado (UDM) estruturado. Ele extrai campos relevantes, como detalhes do usuário, informações de função, permissões e carimbos de data/hora, mapeando-os para os campos correspondentes do UDM para uma análise de segurança consistente.
Antes de começar
- Verifique se você tem uma instância do Google SecOps.
- Verifique se você tem acesso privilegiado à AWS.
Configurar o AWS IAM e o S3
- Crie um bucket do Amazon S3 seguindo este guia do usuário: Criar um bucket.
- Salve o Nome e a Região do bucket para uso futuro.
- 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 o caso de uso.
- Clique em Próxima.
- Opcional: adicione uma tag de descrição.
- Clique em Criar chave de acesso.
- Clique em Fazer o download do arquivo CSV para salvar a chave de acesso e a chave de acesso secreta para uso futuro.
- 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 e selecione a política AmazonS3FullAccess.
- Clique em Próxima.
- Clique em Adicionar permissões
Configurar o CloudTrail para capturar registros do IAM
- Faça login no Console de Gerenciamento da AWS.
- Na barra de pesquisa, digite e selecione CloudTrail na lista de serviços.
- Clique em Criar trilha.
- Informe o nome do percurso, por exemplo,
IAMActivityTrail
.- Aplicar o rastro a todas as regiões: selecione Sim para capturar atividades em todas as regiões.
- Local de armazenamento: selecione o bucket do S3 criado anteriormente ou crie um novo.
- Bucket do S3: insira um nome para o bucket do S3, por exemplo,
iam-logs-bucket
. - Selecione Criar um novo papel do IAM (se não tiver sido criado anteriormente).
- Eventos de gerenciamento: selecione Ler e Escrever para capturar eventos de leitura e gravação em recursos do IAM.
- Eventos de dados: ative os eventos de dados do S3 e do Lambda.
- Clique em Criar para criar a trilha.
Configurar o CloudTrail para exportar registros para o S3
- Acesse Serviços > S3.
- Selecione o bucket do S3 em que os registros do CloudTrail são armazenados, por exemplo,
iam-logs-bucket
. - Verifique se o CloudTrail tem as permissões corretas para gravar registros no bucket.
Adicione a seguinte política, se ela ainda não estiver 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/*" } ] }
Ative o controle de versões no bucket do S3 para garantir que os registros sejam armazenados com várias versões.
Acesse Propriedades > Controle de versão do bucket > Ativar.
Opcional: configure o Lambda para exportação em tempo real
- Acesse o console da AWS Lambda.
- Clique em Criar função.
- Selecione Criar do zero.
- Defina o nome da função como
ExportIAMLogsToS3
. - Selecione um ambiente de execução do Python 3.x.
Atribua um papel do IAM à função que tem permissões para:
{ "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/*" } ] }
Use o código Python abaixo para buscar registros do IAM e fazer o upload deles para o 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 )
- Substitua
your-s3-bucket-name
pelo nome real do bucket.
Configurar o acionador do Lambda para os registros do CloudWatch
- No console do Lambda, acesse o Designer.
- Selecione Adicionar acionador > CloudWatch Logs.
- Selecione o grupo de registros do CloudWatch Logs associado aos seus registros do IAM, por exemplo,
/aws/cloudtrail/
. - Clique em Adicionar.
Configurar um feed no Google SecOps para ingerir registros do AWS IAM
- Acesse Configurações do SIEM > Feeds.
- Clique em Adicionar novo.
- No campo Nome do feed, insira um nome para o feed, por exemplo, AWS IAM Logs.
- Selecione Amazon S3 como o Tipo de origem.
- Selecione AWS IAM como o Tipo de registro.
- Clique em Próxima.
Especifique valores para os seguintes parâmetros de entrada:
- Região: a região em que o bucket do Amazon S3 está localizado.
- URI do S3: o URI do bucket.
s3://your-log-bucket-name/
- Substitua
your-log-bucket-name
pelo nome real do bucket.
- Substitua
- O URI é: selecione Diretório ou Diretório que inclui subdiretórios.
Opções de exclusão de origem: selecione a opção de exclusão de acordo com sua preferência.
ID da chave de acesso: a chave de acesso do usuário com acesso ao bucket do S3.
Chave de acesso secreta: a 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 desse feed.
Clique em Próxima.
Revise a configuração do novo feed na tela Finalizar e clique em Enviar.
Tabela de mapeamento do UDM
Campo de registro | Mapeamento do UDM | Lógica |
---|---|---|
Arn | entity.entity.resource.name | Mapeado diretamente do campo Arn para os tipos de entidade USUÁRIO e RECURSO. Para o tipo de entidade GROUP, ele é mapeado de Group.Arn . |
AssumeRolePolicyDocument | entity.entity.resource.attribute.permissions.name | Mapeado diretamente do campo AssumeRolePolicyDocument , mas apenas para o tipo de entidade RESOURCE. |
CreateDate | entity.entity.user.attribute.creation_time | Mapeado diretamente do campo CreateDate e convertido para o formato de carimbo de data/hora do Chronicle para o tipo de entidade USER. |
CreateDate | entity.entity.resource.attribute.creation_time | Mapeado diretamente do campo CreateDate e convertido para o formato de carimbo de data/hora do Chronicle para o tipo de entidade RESOURCE. |
Group.Arn | entity.entity.resource.name | Mapeado diretamente do campo Group.Arn para o tipo de entidade GRUPO. |
Group.CreateDate | entity.entity.group.attribute.creation_time | Mapeado diretamente do campo Group.CreateDate e convertido para o formato de carimbo de data/hora do Chronicle. |
Group.GroupID | entity.entity.group.product_object_id | Mapeado diretamente do campo Group.GroupID . |
Group.GroupName | entity.entity.group.group_display_name | Mapeado diretamente do campo Group.GroupName . |
Group.GroupName | entity.entity.group.email_addresses | Mapeado diretamente do campo Group.GroupName . |
Group.Path | entity.entity.group.attribute.labels.value | Mapeado diretamente do campo Group.Path , a chave é fixada em path |
IsTruncated | entity.entity.group.attribute.labels.value | Mapeado diretamente do campo IsTruncated e convertido em string, a chave é fixada em is_truncated |
Marcador | entity.entity.group.attribute.labels.value | Mapeado diretamente do campo Marker , a chave é fixada em marker |
PasswordLastUsed | entity.entity.user.last_login_time | Mapeado diretamente do campo PasswordLastUsed e convertido para o formato de carimbo de data/hora do Chronicle. |
Caminho | entity.entity.user.attribute.labels.value | Mapeado diretamente do campo Path para o tipo de entidade USER, a chave é codificada como path . |
Caminho | entity.entity.resource.attribute.labels.value | Mapeada diretamente do campo Path para o tipo de entidade RESOURCE, a chave é codificada como path . |
PermissionsBoundary.PermissionsBoundaryArn | entity.entity.resource.attribute.labels.value | Mapeada diretamente do campo PermissionsBoundary.PermissionsBoundaryArn , a chave é fixada em permissions_boundary_arn . |
PermissionsBoundary.PermissionsBoundaryType | entity.entity.resource.attribute.labels.value | Mapeada diretamente do campo PermissionsBoundary.PermissionsBoundaryType , a chave é fixada em permissions_boundary_type . |
RoleID | entity.entity.resource.product_object_id | Mapeado diretamente do campo RoleID . |
RoleLastUsed.LastUsedDate | entity.entity.resource.attribute.labels.value | Mapeada diretamente do campo RoleLastUsed.LastUsedDate , a chave é fixada em role_last_used_date . |
RoleLastUsed.Region | entity.entity.location.name | Mapeado diretamente do campo RoleLastUsed.Region . |
RoleName | entity.entity.resource.attribute.roles.name | Mapeado diretamente do campo RoleName . |
Tags.Key | entity.entity.user.attribute.labels.key | Usado como chave do campo labels no atributo do usuário. |
Tags.Value | entity.entity.user.attribute.labels.value | Usado como o valor do campo labels no atributo do usuário. |
UserID | entity.entity.user.product_object_id | Mapeado diretamente do campo UserID . |
Nome de usuário | entity.entity.user.userid | Mapeado diretamente do campo UserName . |
Users.Arn | relations.entity.resource.name | Mapeado diretamente do campo Users.Arn na relação do usuário. |
Users.CreateDate | relations.entity.user.attribute.creation_time | Mapeado diretamente do campo Users.CreateDate na relação do usuário e convertido para o formato de carimbo de data/hora do Chronicle. |
Users.PasswordLastUsed | relations.entity.user.last_login_time | Mapeado diretamente do campo Users.PasswordLastUsed na relação do usuário e convertido para o formato de carimbo de data/hora do Chronicle. |
Users.Path | relations.entity.user.attribute.labels.value | Mapeado diretamente do campo Users.Path na relação do usuário, a chave é codificada como path . |
Users.PermissionsBoundary.PermissionsBoundaryArn | relations.entity.resource.attribute.labels.value | Mapeado diretamente do campo Users.PermissionsBoundary.PermissionsBoundaryArn na relação do usuário, a chave é codificada como permissions_boundary_arn . |
Users.PermissionsBoundary.PermissionsBoundaryType | relations.entity.resource.attribute.labels.value | Mapeado diretamente do campo Users.PermissionsBoundary.PermissionsBoundaryType na relação do usuário, a chave é codificada como permissions_boundary_type . |
Users.UserID | relations.entity.user.product_object_id | Mapeado diretamente do campo Users.UserID na relação do usuário. |
Users.UserName | relations.entity.user.userid | Mapeado diretamente do campo Users.UserName na relação do usuário. |
N/A | entity.metadata.collected_timestamp | Preenchido com o carimbo de data/hora do evento do registro bruto. |
N/A | entity.metadata.vendor_name | Fixado em AWS . |
N/A | entity.metadata.product_name | Fixado em AWS IAM . |
N/A | entity.metadata.entity_type | Determinado com base na presença de campos específicos: USER se UserID existir, RESOURCE se RoleName existir e GROUP se Group.GroupName existir. |
N/A | entity.entity.resource.resource_subtype | Defina como User para os tipos de entidade USER e GROUP. |
N/A | entity.entity.resource.resource_type | Defina como ACCESS_POLICY para o tipo de entidade RESOURCE. |
N/A | entity.entity.resource.attribute.cloud.environment | Fixado em AMAZON_WEB_SERVICES . |
N/A | relations.entity_type | Fixado em USER para relações de usuários em um grupo. |
N/A | relations.relationship | Fixado em MEMBER para relações de usuários em um grupo. |
N/A | relations.direction | Fixado em UNIDIRECTIONAL para relações de usuários em um grupo. |
N/A | relations.entity.resource.resource_subtype | Fixado em User para relações de usuários em um grupo. |
Alterações
2023-12-14
- Parser recém-criado.
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.