Recolha registos do AWS IAM
Este documento explica como ingerir registos do AWS IAM no Google Security Operations. O analisador transforma os registos formatados JSON não processados num modelo de dados unificado (UDM) estruturado. Extrai campos relevantes, como detalhes do utilizador, informações de funções, autorizações e datas/horas, mapeando-os para os campos da UDM correspondentes para uma análise de segurança consistente.
Antes de começar
- Certifique-se de que tem uma instância do Google SecOps.
- Certifique-se de que tem acesso privilegiado à AWS.
Configure o AWS IAM e o S3
- Crie um contentor do Amazon S3 seguindo este guia do utilizador: Criar um contentor.
- Guarde o Nome e a Região do contentor para utilização posterior.
- Crie um utilizador seguindo este guia do utilizador: Criar um utilizador do IAM.
- Selecione o utilizador criado.
- Selecione o separador Credenciais de segurança.
- Clique em Criar chave de acesso na secção Chaves de acesso.
- Selecione Serviço de terceiros como o Exemplo de utilização.
- Clicar em Seguinte.
- Opcional: adicione uma etiqueta de descrição.
- Clique em Criar chave de acesso.
- Clique em Transferir ficheiro CSV para guardar a chave de acesso e a chave de acesso secreta para utilização posterior.
- Clique em Concluído.
- Selecione o separador Autorizações.
- Clique em Adicionar autorizações na secção Políticas de autorizações.
- Selecione Adicionar autorizações.
- Selecione Anexar políticas diretamente
- Pesquise e selecione a política AmazonS3FullAccess.
- Clicar em Seguinte.
- Clique em Adicionar autorizações.
Configure o CloudTrail para capturar registos do IAM
- Inicie sessão na AWS Management Console.
- Na barra de pesquisa, escreva e selecione CloudTrail na lista de serviços.
- Clique em Criar trilho.
- Indique um nome do rasto; por exemplo,
IAMActivityTrail
.- Aplicar rasto a todas as regiões: selecione Sim para captar atividades em todas as regiões.
- Localização de armazenamento: selecione o contentor do S3 criado anteriormente ou crie um novo.
- Contentor do S3: introduza um nome para o contentor do S3; por exemplo,
iam-logs-bucket
. - Selecione Criar uma nova função do IAM (se não tiver sido criada anteriormente).
- Eventos de gestão: selecione Leitura e Escrita para capturar eventos de leitura e escrita em recursos da IAM.
- Eventos de dados: ative os eventos de dados do S3 e Lambda.
- Clique em Criar para criar o trilho.
Configure o CloudTrail para exportar registos para o S3
- Aceda a Serviços > S3.
- Selecione o contentor S3 onde os registos do CloudTrail estão armazenados; por exemplo,
iam-logs-bucket
. - Certifique-se de que o CloudTrail tem as autorizações adequadas para escrever registos no contentor.
Adicione a seguinte política, se 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 controlo de versões no contentor do S3 para garantir que os registos são armazenados com várias versões.
Aceda a Propriedades > Controlo de versões do contentor > Ativar.
Opcional: configure o Lambda para exportação em tempo real
- Aceda à Lambda Console da AWS.
- Clique em Criar função.
- Selecione Criar do zero.
- Defina o nome da função como
ExportIAMLogsToS3
. - Selecione um tempo de execução do Python 3.x.
Atribua uma função de IAM à função que tenha autorizaçõ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 obter registos da IAM e carregá-los 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 do seu contentor real.
Configure o acionador do Lambda para os registos do CloudWatch
- Na consola Lambda, aceda a Designer.
- Escolha Adicionar acionador > Registos do CloudWatch.
- Selecione o grupo de registos CloudWatch Logs associado aos seus registos IAM; por exemplo,
/aws/cloudtrail/
. - Clique em Adicionar.
Configure feeds
Existem dois pontos de entrada diferentes para configurar feeds na plataforma Google SecOps:
- Definições do SIEM > Feeds > Adicionar novo
- Content Hub > Pacotes de conteúdo > Começar
Como configurar o feed do AWS IAM
- Clique no pacote Amazon Cloud Platform.
- Localize o tipo de registo IAM do AWS.
Especifique os valores nos seguintes campos.
- Tipo de origem: API de terceiros
- Nome de utilizador: nome de utilizador para autenticação
- Segredo: segredo para autenticação
Opções avançadas
- Nome do feed: um valor pré-preenchido que identifica o feed.
- Espaço de nomes do recurso: espaço de nomes associado ao feed.
- Etiquetas de carregamento: etiquetas aplicadas a todos os eventos deste feed.
Clique em Criar feed.
Para mais informações sobre a configuração de vários feeds para diferentes tipos de registos nesta família de produtos, consulte o artigo Configure feeds por produto.
Tabela de mapeamento da UDM
Campo de registo | Mapeamento de UDM | Lógica |
---|---|---|
Arn | entity.entity.resource.name | Mapeado diretamente a partir do campo Arn para os tipos de entidades USER e RESOURCE. Para o tipo de entidade GROUP, é mapeado a partir de Group.Arn . |
AssumeRolePolicyDocument | entity.entity.resource.attribute.permissions.name | Mapeado diretamente a partir do campo AssumeRolePolicyDocument , mas apenas para o tipo de entidade RESOURCE. |
CreateDate | entity.entity.user.attribute.creation_time | Mapeado diretamente a partir do campo CreateDate e convertido para o formato de data/hora do Chronicle para o tipo de entidade USER. |
CreateDate | entity.entity.resource.attribute.creation_time | Mapeado diretamente a partir do campo CreateDate e convertido para o formato de data/hora do Chronicle para o tipo de entidade RESOURCE. |
Group.Arn | entity.entity.resource.name | Mapeado diretamente a partir do campo Group.Arn para o tipo de entidade GROUP. |
Group.CreateDate | entity.entity.group.attribute.creation_time | Mapeado diretamente a partir do campo Group.CreateDate e convertido para o formato de data/hora do Chronicle. |
Group.GroupID | entity.entity.group.product_object_id | Mapeado diretamente a partir do campo Group.GroupID . |
Group.GroupName | entity.entity.group.group_display_name | Mapeado diretamente a partir do campo Group.GroupName . |
Group.GroupName | entity.entity.group.email_addresses | Mapeado diretamente a partir do campo Group.GroupName . |
Group.Path | entity.entity.group.attribute.labels.value | Mapeada diretamente a partir do campo Group.Path , a chave está codificada como path |
IsTruncated | entity.entity.group.attribute.labels.value | Mapeada diretamente a partir do campo IsTruncated e convertida em string, a chave é codificada de forma rígida para is_truncated |
Marcador | entity.entity.group.attribute.labels.value | Mapeada diretamente a partir do campo Marker , a chave está codificada como marker |
PasswordLastUsed | entity.entity.user.last_login_time | Mapeado diretamente a partir do campo PasswordLastUsed e convertido para o formato de data/hora do Chronicle. |
Caminho | entity.entity.user.attribute.labels.value | Mapeada diretamente a partir do campo Path para o tipo de entidade USER, a chave está codificada de forma rígida para path . |
Caminho | entity.entity.resource.attribute.labels.value | Mapeado diretamente a partir do campo Path para o tipo de entidade RESOURCE, a chave está codificada de forma rígida para path . |
PermissionsBoundary.PermissionsBoundaryArn | entity.entity.resource.attribute.labels.value | Mapeada diretamente a partir do campo PermissionsBoundary.PermissionsBoundaryArn , a chave está codificada de forma rígida para permissions_boundary_arn . |
PermissionsBoundary.PermissionsBoundaryType | entity.entity.resource.attribute.labels.value | Mapeada diretamente a partir do campo PermissionsBoundary.PermissionsBoundaryType , a chave está codificada de forma rígida para permissions_boundary_type . |
RoleID | entity.entity.resource.product_object_id | Mapeado diretamente a partir do campo RoleID . |
RoleLastUsed.LastUsedDate | entity.entity.resource.attribute.labels.value | Mapeada diretamente a partir do campo RoleLastUsed.LastUsedDate , a chave está codificada de forma rígida para role_last_used_date . |
RoleLastUsed.Region | entity.entity.location.name | Mapeado diretamente a partir do campo RoleLastUsed.Region . |
RoleName | entity.entity.resource.attribute.roles.name | Mapeado diretamente a partir do campo RoleName . |
Tags.Key | entity.entity.user.attribute.labels.key | Usado como chave para o campo labels no atributo do utilizador. |
Tags.Value | entity.entity.user.attribute.labels.value | Usado como o valor do campo labels no atributo do utilizador. |
UserID | entity.entity.user.product_object_id | Mapeado diretamente a partir do campo UserID . |
Nome de utilizador | entity.entity.user.userid | Mapeado diretamente a partir do campo UserName . |
Users.Arn | relations.entity.resource.name | Mapeado diretamente a partir do campo Users.Arn na relação de utilizador. |
Users.CreateDate | relations.entity.user.attribute.creation_time | Mapeado diretamente a partir do campo Users.CreateDate na relação de utilizadores e convertido para o formato de data/hora do Chronicle. |
Users.PasswordLastUsed | relations.entity.user.last_login_time | Mapeado diretamente a partir do campo Users.PasswordLastUsed na relação de utilizadores e convertido para o formato de data/hora do Chronicle. |
Users.Path | relations.entity.user.attribute.labels.value | Mapeada diretamente a partir do campo Users.Path na relação do utilizador, a chave está codificada como path . |
Users.PermissionsBoundary.PermissionsBoundaryArn | relations.entity.resource.attribute.labels.value | Mapeada diretamente a partir do campo Users.PermissionsBoundary.PermissionsBoundaryArn na relação do utilizador, a chave está codificada como permissions_boundary_arn . |
Users.PermissionsBoundary.PermissionsBoundaryType | relations.entity.resource.attribute.labels.value | Mapeada diretamente a partir do campo Users.PermissionsBoundary.PermissionsBoundaryType na relação do utilizador, a chave está codificada como permissions_boundary_type . |
Users.UserID | relations.entity.user.product_object_id | Mapeado diretamente a partir do campo Users.UserID na relação de utilizador. |
Users.UserName | relations.entity.user.userid | Mapeado diretamente a partir do campo Users.UserName na relação de utilizador. |
N/A | entity.metadata.collected_timestamp | Preenchida com a data/hora do evento do registo não processado. |
N/A | entity.metadata.vendor_name | Codificado para AWS . |
N/A | entity.metadata.product_name | Codificado para 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 | Definido como User para os tipos de entidades 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 | Codificado para AMAZON_WEB_SERVICES . |
N/A | relations.entity_type | Codificado de forma rígida para USER para relações de utilizadores num grupo. |
N/A | relations.relationship | Codificado de forma rígida para MEMBER para relações de utilizadores num grupo. |
N/A | relations.direction | Codificado de forma rígida para UNIDIRECTIONAL para relações de utilizadores num grupo. |
N/A | relations.entity.resource.resource_subtype | Codificado de forma rígida para User para relações de utilizadores num grupo. |
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais da Google SecOps.