Consultar os logs do AWS CloudTrail - Amazon Athena

Consultar os logs do AWS CloudTrail

O AWS CloudTrail é um serviço que registra chamadas de API da AWS e eventos de contas da Amazon Web Services.

Os logs do CloudTrail incluem detalhes sobre todas as chamadas de API feitas para seus Serviços da AWS, incluindo o console. O CloudTrail gera arquivos de log criptografados e os armazena no Amazon S3. Para mais informações, consulte o Guia do usuário do AWS CloudTrail.

nota

Se você quiser realizar consultas SQL nas informações de eventos do CloudTrail entre contas, regiões e datas, considere usar o CloudTrail Lake. O CloudTrail Lake é uma alternativa da AWS à criação de trilhas que agregam informações de uma empresa em um único armazenamento pesquisável de dados de eventos. Em vez de usar o armazenamento de bucket do Amazon S3, ele armazena eventos em um data lake, o que permite consultas mais avançadas e rápidas. Você pode usá-lo para criar consultas SQL que pesquisem eventos em organizações, regiões e em períodos temporais personalizados. Como você executa consultas do CloudTrail Lake diretamente no console do CloudTrail, o uso do CloudTrail Lake não requer o Athena. Para obter mais informações, consulte a Documentação do CloudTrail Lake.

O uso do Athena com os logs do CloudTrail é uma ótima maneira de melhorar a análise das atividades da AWS service (Serviço da AWS). Por exemplo, é possível usar consultas para identificar tendências e isolar ainda mais a atividade por atributos, como endereço IP de origem ou usuário.

Uma aplicação comum é usar os logs do CloudTrail para analisar a segurança e a compatibilidade das atividades operacionais. Para obter um exemplo detalhado, consulte a publicação no blog Big Data da AWS, Análise de segurança, conformidade e atividades operacionais usando o AWS CloudTrail e o Amazon Athena.

Você pode usar o Athena para consultar esses arquivos de log diretamente no Amazon S3 especificando o LOCATION dos arquivos de log. É possível fazer isso de duas formas:

  • Criando tabelas para arquivos de log do CloudTrail diretamente no console do CloudTrail.

  • Criando tabelas manualmente para arquivos de log do CloudTrail no console do Athena.

Noções básicas sobre logs do CloudTrail e tabelas do Athena

Antes de começar a criar tabelas, você deve conhecer melhor o CloudTrail e saber como ele armazena os dados. Isso pode ajudar a criar as tabelas necessárias, tanto pelo console do CloudTrail quanto pelo Athena.

O CloudTrail salva os logs como arquivos de texto JSON no formato gzip compactado (*.json.gzip). O local dos arquivos de log depende de como você configura as trilhas, da Região da AWS ou das regiões onde você está registrando, além de outros fatores.

Para obter mais informações de onde os logs são armazenados, da estrutura JSON e do conteúdo do arquivo de registro, consulte os seguintes tópicos no Manual do usuário do AWS CloudTrail:

Para coletar e salvar os logs no Amazon S3, habilite o CloudTrail no AWS Management Console. Para obter mais informações, consulte Criar uma trilha no Guia do usuário do AWS CloudTrail.

Anote o bucket de destino do Amazon S3 no qual você salva os logs. Substitua a cláusula LOCATION pelo caminho para o local dos logs do CloudTrail e pelo conjunto de objetos com os quais trabalhar. O exemplo usa um valor LOCATION de logs para uma determinada conta, mas você pode usar o grau de especificidade adequado ao aplicativo.

Por exemplo:

  • Para analisar dados de várias contas, você pode reverter o especificador LOCATION para indicar todos os AWSLogs usando LOCATION 's3://MyLogFiles/AWSLogs/'.

  • Para analisar dados de uma data, conta e região específica, use LOCATION 's3://MyLogFiles/123456789012/CloudTrail/us-east-1/2016/03/14/'.

O uso do nível mais alto na hierarquia de objetos proporciona maior flexibilidade ao consultar usando o Athena.

Usar o console do CloudTrail para criar uma tabela do Athena com logs do CloudTrail

Você pode criar uma tabela do Athena não particionada para consultar logs do CloudTrail diretamente no console do CloudTrail. A criação de uma tabela do Athena pelo console do CloudTrail requer que você esteja conectado com um perfil que tenha permissões suficientes para criar tabelas no Athena.

nota

Não é possível usar o console do CloudTrail para criar uma tabela do Athena para logs de trilha da organização. Em vez disso, crie a tabela manualmente usando o console do Athena para que você possa especificar o local correto de armazenamento. Para obter informações sobre trilhas de organização, consulte Criar uma trilha para uma organização no Manual do usuário do AWS CloudTrail.

Para criar uma tabela do Athena para uma trilha do CloudTrail no console do CloudTrail
  1. Abra o console do CloudTrail em https://console.aws.amazon.com/cloudfront/.

  2. No painel de navegação, selecione Event history (Histórico de eventos).

  3. Escolha Create Athena table (Criar tabela do Athena).

    
                        Escolher Create Athena table
  4. Em Storage location (Local de armazenamento), use a seta para baixo para selecionar o bucket do Amazon S3 onde os arquivos de log estão armazenados para a trilha que será consultada.

    nota

    Para localizar o nome do bucket associado a uma trilha, escolha Trails (Trilhas) no painel de navegação do CloudTrail e visualize a coluna S3 bucket (Bucket do S3) da trilha. Para ver o local do bucket do Amazon S3, escolha o link do bucket na coluna S3 bucket (Bucket do S3). O console do Amazon S3 é aberto no local do bucket do CloudTrail.

  5. Escolha Create table. A tabela é criada com um nome padrão que inclui o nome do bucket do Amazon S3.

Criar uma tabela de logs do CloudTrail no Athena usando particionamento manual

É possível criar manualmente tabelas de arquivos de log do CloudTrail no console do Athena e executar consultas no Athena.

Para criar uma tabela do Athena para uma trilha do CloudTrail no console do Athena
  1. Copie e cole a instrução DDL a seguir no editor de consultas do console do Athena.

    CREATE EXTERNAL TABLE cloudtrail_logs ( eventversion STRING, useridentity STRUCT< type:STRING, principalid:STRING, arn:STRING, accountid:STRING, invokedby:STRING, accesskeyid:STRING, userName:STRING, sessioncontext:STRUCT< attributes:STRUCT< mfaauthenticated:STRING, creationdate:STRING>, sessionissuer:STRUCT< type:STRING, principalId:STRING, arn:STRING, accountId:STRING, userName:STRING>, ec2RoleDelivery:string, webIdFederationData:map<string,string> > >, eventtime STRING, eventsource STRING, eventname STRING, awsregion STRING, sourceipaddress STRING, useragent STRING, errorcode STRING, errormessage STRING, requestparameters STRING, responseelements STRING, additionaleventdata STRING, requestid STRING, eventid STRING, resources ARRAY<STRUCT< arn:STRING, accountid:STRING, type:STRING>>, eventtype STRING, apiversion STRING, readonly STRING, recipientaccountid STRING, serviceeventdetails STRING, sharedeventid STRING, vpcendpointid STRING, eventCategory STRING, tlsDetails struct< tlsVersion:string, cipherSuite:string, clientProvidedHostHeader:string> ) PARTITIONED BY (region string, year string, month string, day string) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' STORED AS INPUTFORMAT 'com.amazon.emr.cloudtrail.CloudTrailInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://CloudTrail_bucket_name/AWSLogs/Account_ID/CloudTrail/';
    nota

    Sugerimos usar o org.apache.hive.hcatalog.data.JsonSerDe exibido no exemplo. Embora exista um com.amazon.emr.hive.serde.CloudTrailSerde, no momento ele não processa alguns dos campos mais recentes do CloudTrail.

  2. (Opcional) Remova quaisquer campos não obrigatórios para a tabela. Se for necessário ler somente um determinado conjunto de colunas, sua definição de tabela poderá excluir as outras colunas.

  3. Modifique s3://CloudTrail_bucket_name/AWSLogs/Account_ID/CloudTrail/ para apontar para o bucket do Amazon S3 que contém os dados de log.

  4. Verifique se os campos estão listados corretamente. Para obter mais informações sobre a lista completa de campos em um registro do CloudTrail, consulte Conteúdo do registro do CloudTrail.

    O exemplo a seguir usa a Hive JSON SerDe. Neste exemplo, os campos requestparameters, responseelements e additionaleventdata são listados como tipo STRING na consulta, mas são tipos de dados STRUCT usados em JSON. Portanto, para obter dados desses campos, use funções JSON_EXTRACT. Para obter mais informações, consulte Extrair dados do JSON. Para melhorias de performance, o exemplo particiona os dados por Região da AWS, ano, mês e dia.

  5. Execute a instrução CREATE TABLE no console do Athena.

  6. Use o comando ALTER TABLE ADD PARTITION a fim de carregar as partições para que você consiga consultá-las, conforme o exemplo a seguir.

    ALTER TABLE table_name ADD PARTITION (region='us-east-1', year='2019', month='02', day='01') LOCATION 's3://cloudtrail_bucket_name/AWSLogs/Account_ID/CloudTrail/us-east-1/2019/02/01/'

Criar uma tabela para uma trilha de toda a organização usando particionamento manual

Para criar uma tabela para arquivos de log do CloudTrail em toda a organização no Athena, siga as etapas listadas em Criar uma tabela de logs do CloudTrail no Athena usando particionamento manual, mas faça as modificações observadas no procedimento a seguir.

Criar uma tabela do Athena para logs do CloudTrail em toda a organização
  1. Na instrução CREATE TABLE, modifique a cláusula LOCATION para incluir o ID da organização, como no exemplo a seguir:

    LOCATION 's3://cloudtrail_bucket_name/AWSLogs/organization_id/Account_ID/CloudTrail/'
  2. Na cláusula PARTITIONED BY, adicione uma entrada para o ID da conta como cadeia de caracteres, como no exemplo a seguir:

    PARTITIONED BY (account string, region string, year string, month string, day string)

    O exemplo a seguir mostra o resultado combinado:

    ... PARTITIONED BY (account string, region string, year string, month string, day string) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' STORED AS INPUTFORMAT 'com.amazon.emr.cloudtrail.CloudTrailInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://cloudtrail_bucket_name/AWSLogs/organization_id/Account_ID/CloudTrail/'
  3. Na instrução ALTER TABLE, na cláusula ADD PARTITION, inclua o ID da organização, como no exemplo a seguir:

    ALTER TABLE table_name ADD PARTITION (account='111122223333', region='us-east-1', year='2022', month='08', day='08')
  4. Na instrução ALTER TABLE, na cláusula LOCATION, inclua o ID da organização, o ID da conta e a partição que você deseja adicionar, como no exemplo a seguir:

    LOCATION 's3://cloudtrail_bucket_name/AWSLogs/organization_id/Account_ID/CloudTrail/us-east-1/2022/08/08/'

    No exemplo a seguir, a instrução ALTER TABLE mostra o resultado combinado:

    ALTER TABLE table_name ADD PARTITION (account='111122223333', region='us-east-1', year='2022', month='08', day='08') LOCATION 's3://cloudtrail_bucket_name/AWSLogs/organization_id/111122223333/CloudTrail/us-east-1/2022/08/08/'

Criar a tabela de logs do CloudTrail no Athena usando a projeção de partições

Como os logs do CloudTrail têm uma estrutura conhecida com um esquema de partição que você pode especificar antecipadamente, é possível reduzir o tempo de execução das consultas e automatizar o gerenciamento de partições usando o recurso de projeção de partições do Athena. A projeção de partições adiciona automaticamente novas partições à medida que os dados são adicionados. Isso elimina a necessidade de adicionar manualmente as partições usando ALTER TABLE ADD PARTITION.

A instrução de exemplo CREATE TABLE a seguir usa automaticamente a projeção de partições com base nos logs do CloudTrail a partir de uma data especificada até o dia de hoje para uma única Região da AWS. Nas cláusulas LOCATION e storage.location.template, substitua os espaços reservados bucket, account-id e aws-region pelos valores idênticos correspondentes. Em ‭projection.timestamp.range, substitua ‭‬2020‭‬/‭‬01‭/‭01‭‬ pela data de início desejada. Depois que você executar a consulta com êxito, poderá consultar a tabela. Você não precisa executar ALTER TABLE ADD PARTITION para carregar as partições.

CREATE EXTERNAL TABLE cloudtrail_logs_pp( eventVersion STRING, userIdentity STRUCT< type: STRING, principalId: STRING, arn: STRING, accountId: STRING, invokedBy: STRING, accessKeyId: STRING, userName: STRING, sessionContext: STRUCT< attributes: STRUCT< mfaAuthenticated: STRING, creationDate: STRING>, sessionIssuer: STRUCT< type: STRING, principalId: STRING, arn: STRING, accountId: STRING, userName: STRING>, ec2RoleDelivery:string, webIdFederationData:map<string,string> > >, eventTime STRING, eventSource STRING, eventName STRING, awsRegion STRING, sourceIpAddress STRING, userAgent STRING, errorCode STRING, errorMessage STRING, requestparameters STRING, responseelements STRING, additionaleventdata STRING, requestId STRING, eventId STRING, readOnly STRING, resources ARRAY<STRUCT< arn: STRING, accountId: STRING, type: STRING>>, eventType STRING, apiVersion STRING, recipientAccountId STRING, serviceEventDetails STRING, sharedEventID STRING, vpcendpointid STRING, eventCategory STRING, tlsDetails struct< tlsVersion:string, cipherSuite:string, clientProvidedHostHeader:string> ) PARTITIONED BY ( `timestamp` string) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' STORED AS INPUTFORMAT 'com.amazon.emr.cloudtrail.CloudTrailInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://bucket/AWSLogs/account-id/CloudTrail/aws-region' TBLPROPERTIES ( 'projection.enabled'='true', 'projection.timestamp.format'='yyyy/MM/dd', 'projection.timestamp.interval'='1', 'projection.timestamp.interval.unit'='DAYS', 'projection.timestamp.range'='2020/01/01,NOW', 'projection.timestamp.type'='date', 'storage.location.template'='s3://bucket/AWSLogs/account-id/CloudTrail/aws-region/${timestamp}')

Para obter mais informações sobre projeção de partições, consulte Projeção de partições com o Amazon Athena.

Consultar campos aninhados

Como os campos userIdentity e resources são tipos de dados aninhados, é necessário um tratamento especial para consultá-los.

O objeto userIdentity consiste em tipos STRUCT aninhados. É possível consultá-los usando um ponto para separar os campos, como no seguinte exemplo:

SELECT eventsource, eventname, useridentity.sessioncontext.attributes.creationdate, useridentity.sessioncontext.sessionissuer.arn FROM cloudtrail_logs WHERE useridentity.sessioncontext.sessionissuer.arn IS NOT NULL ORDER BY eventsource, eventname LIMIT 10

O campo resources é um array de objetos STRUCT. Para esses arrays, use CROSS JOIN UNNEST para remover o aninhamento do array de modo que você possa consultar seus objetos.

O exemplo a seguir retorna todas as linhas em que o ARN do recurso termina com example/datafile.txt. Para legibilidade, a função replace remove a substring inicial arn:aws:s3::: do ARN.

SELECT awsregion, replace(unnested.resources_entry.ARN,'arn:aws:s3:::') as s3_resource, eventname, eventtime, useragent FROM cloudtrail_logs t CROSS JOIN UNNEST(t.resources) unnested (resources_entry) WHERE unnested.resources_entry.ARN LIKE '%example/datafile.txt' ORDER BY eventtime

Veja a seguir exemplos de consultas de eventos DeleteBucket. A consulta extrai do objeto resources o nome do bucket e o ID da conta à qual o bucket pertence.

SELECT awsregion, replace(unnested.resources_entry.ARN,'arn:aws:s3:::') as deleted_bucket, eventtime AS time_deleted, useridentity.username, unnested.resources_entry.accountid as bucket_acct_id FROM cloudtrail_logs t CROSS JOIN UNNEST(t.resources) unnested (resources_entry) WHERE eventname = 'DeleteBucket' ORDER BY eventtime

Para obter mais informações sobre como remover o aninhamento, consulte Filtrar matrizes.

Consulta de exemplo

O exemplo a seguir mostra a parte de uma consulta que retorna todas as solicitações anônimas (não assinadas) da tabela criada para os logs de eventos do CloudTrail. Essa consulta seleciona as solicitações em que useridentity.accountid são anônimos e useridentity.arn não é especificado:

SELECT * FROM cloudtrail_logs WHERE eventsource = 's3.amazonaws.com' AND eventname in ('GetObject') AND useridentity.accountid = 'anonymous' AND useridentity.arn IS NULL AND requestparameters LIKE '%[your bucket name ]%';

Para obter mais informações, consulte a publicação no blog Big Data da AWS, Análise de segurança, conformidade e atividades operacionais usando o AWS CloudTrail e o Amazon Athena.

Dicas para consultar logs do CloudTrail

Para explorar os dados dos logs do CloudTrail, siga estas dicas:

  • Antes de consultar os logs, verifique se a tabela de logs tem a mesma aparência da tabela em Criar uma tabela de logs do CloudTrail no Athena usando particionamento manual. Se não for a primeira tabela, exclua a tabela existente usando o seguinte comando: DROP TABLE cloudtrail_logs.

  • Depois de ignorar a tabela existente, recrie-a. Para obter mais informações, consulte Criar uma tabela de logs do CloudTrail no Athena usando particionamento manual.

    Verifique se os campos na consulta do Athena estão listados corretamente. Para obter informações sobre a lista completa de campos em um registro do CloudTrail, consulte Conteúdo do registro do CloudTrail.

    Se a consulta incluir campos em formatos JSON, como STRUCT, extraia dados de JSON. Para obter mais informações, consulte Extrair dados do JSON.

    Algumas sugestões para realizar consultas em sua tabela do CloudTrail:

  • Comece observando quais usuários do chamaram quais operações da API e de quais endereços IP de origem.

  • Use a consulta SQL básica a seguir como o modelo. Cole a consulta no console do Athena e execute-a.

    SELECT useridentity.arn, eventname, sourceipaddress, eventtime FROM cloudtrail_logs LIMIT 100;
  • Modifique a consulta para explorar ainda mais seus dados.

  • Para melhorar a performance, inclua a cláusula LIMIT para retornar um subconjunto especificado de linhas.