Coletar registros do IAM da AWS
Este documento explica como ingerir registros do AWS IAM no 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 da 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: Como criar um bucket.
- Salve o Nome e a Região do bucket para uso posterior.
- 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 posterior.
- 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 rastreamento.
- Forneça um Nome do rastreamento, por exemplo,
IAMActivityTrail
.- Aplicar rastreamento 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 papel do IAM (se ainda não tiver sido criado).
- Eventos de gerenciamento: selecione Leitura e Gravação 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ões do bucket > Ativar.
Opcional: configurar o Lambda para exportação em tempo real
- Acesse o console do Lambda da AWS.
- 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 à função um papel do IAM com 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 seguinte código Python para buscar registros do IAM e fazer 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 um gatilho do Lambda para os registros do CloudWatch
- No Console do Lambda, acesse Designer.
- Escolha Adicionar gatilho > CloudWatch Logs.
- Selecione o grupo de registros do CloudWatch Logs associado aos seus registros do IAM. Por exemplo,
/aws/cloudtrail/
. - Clique em Adicionar.
Configurar feeds
Há dois pontos de entrada diferentes para configurar feeds na plataforma do Google SecOps:
- Configurações do SIEM > Feeds > Adicionar novo
- Central de conteúdo > Pacotes de conteúdo > Começar
Como configurar o feed do AWS IAM
- Clique no pacote Amazon Cloud Platform.
- Localize o tipo de registro IAM da AWS.
Especifique os valores nos campos a seguir.
- Tipo de origem: API de terceiros
- Nome de usuário: nome de usuário para autenticação
- Secret: secret para autenticar com
Opções avançadas
- Nome do feed: um valor pré-preenchido que identifica o feed.
- Namespace do recurso: namespace associado ao feed.
- Rótulos de ingestão: rótulos aplicados a todos os eventos deste feed.
Clique em Criar feed.
Para mais informações sobre como configurar vários feeds para diferentes tipos de registros nessa família de produtos, consulte Configurar feeds por produto.
Tabela de mapeamento da UDM
Campo de registro | Mapeamento do UDM | Lógica |
---|---|---|
Arn | entity.entity.resource.name | Mapeado diretamente do campo Arn para tipos de entidades USER e RESOURCE. 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 GROUP. |
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 | Mapeada diretamente do campo Group.Path , a chave é codificada como path . |
IsTruncated | entity.entity.group.attribute.labels.value | Mapeada diretamente do campo IsTruncated e convertida em string, a chave é fixada no código como is_truncated . |
Marcador | entity.entity.group.attribute.labels.value | Mapeada diretamente do campo Marker , a chave é codificada como 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 | Mapeada 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 é codificada como permissions_boundary_arn . |
PermissionsBoundary.PermissionsBoundaryType | entity.entity.resource.attribute.labels.value | Mapeada diretamente do campo PermissionsBoundary.PermissionsBoundaryType , a chave é codificada como 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 é codificada como 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 a 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 | Mapeada 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 | Mapeada 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 | Mapeada 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 log bruto. |
N/A | entity.metadata.vendor_name | Fixado no código como AWS . |
N/A | entity.metadata.product_name | Fixado no código como 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 | Definido como ACCESS_POLICY para o tipo de entidade RESOURCE. |
N/A | entity.entity.resource.attribute.cloud.environment | Fixado no código como AMAZON_WEB_SERVICES . |
N/A | relations.entity_type | Codificado como USER para relações de usuários em um grupo. |
N/A | relations.relationship | Codificado como MEMBER para relações de usuários em um grupo. |
N/A | relations.direction | Codificado como UNIDIRECTIONAL para relações de usuários em um grupo. |
N/A | relations.entity.resource.resource_subtype | Codificado como User para relações de usuários em um grupo. |
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.