Recolha registos do AWS IAM

Compatível com:

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

  1. Crie um contentor do Amazon S3 seguindo este guia do utilizador: Criar um contentor.
  2. Guarde o Nome e a Região do contentor para utilização posterior.
  3. Crie um utilizador seguindo este guia do utilizador: Criar um utilizador do IAM.
  4. Selecione o utilizador criado.
  5. Selecione o separador Credenciais de segurança.
  6. Clique em Criar chave de acesso na secção Chaves de acesso.
  7. Selecione Serviço de terceiros como o Exemplo de utilização.
  8. Clicar em Seguinte.
  9. Opcional: adicione uma etiqueta de descrição.
  10. Clique em Criar chave de acesso.
  11. Clique em Transferir ficheiro CSV para guardar a chave de acesso e a chave de acesso secreta para utilização posterior.
  12. Clique em Concluído.
  13. Selecione o separador Autorizações.
  14. Clique em Adicionar autorizações na secção Políticas de autorizações.
  15. Selecione Adicionar autorizações.
  16. Selecione Anexar políticas diretamente
  17. Pesquise e selecione a política AmazonS3FullAccess.
  18. Clicar em Seguinte.
  19. Clique em Adicionar autorizações.

Configure o CloudTrail para capturar registos do IAM

  1. Inicie sessão na AWS Management Console.
  2. Na barra de pesquisa, escreva e selecione CloudTrail na lista de serviços.
  3. Clique em Criar trilho.
  4. 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.
  5. Clique em Criar para criar o trilho.

Configure o CloudTrail para exportar registos para o S3

  1. Aceda a Serviços > S3.
  2. Selecione o contentor S3 onde os registos do CloudTrail estão armazenados; por exemplo, iam-logs-bucket.
  3. Certifique-se de que o CloudTrail tem as autorizações adequadas para escrever registos no contentor.
  4. 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/*"
        }
      ]
    }
    
  5. Ative o controlo de versões no contentor do S3 para garantir que os registos são armazenados com várias versões.

  6. Aceda a Propriedades > Controlo de versões do contentor > Ativar.

Opcional: configure o Lambda para exportação em tempo real

  1. Aceda à Lambda Console da AWS.
  2. Clique em Criar função.
  3. Selecione Criar do zero.
  4. Defina o nome da função como ExportIAMLogsToS3.
  5. Selecione um tempo de execução do Python 3.x.
  6. 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/*"
        }
      ]
    }
    
  7. 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

  1. Na consola Lambda, aceda a Designer.
  2. Escolha Adicionar acionador > Registos do CloudWatch.
  3. Selecione o grupo de registos CloudWatch Logs associado aos seus registos IAM; por exemplo, /aws/cloudtrail/.
  4. 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

  1. Clique no pacote Amazon Cloud Platform.
  2. Localize o tipo de registo IAM do AWS.
  3. 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.
  4. 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.