Identificación de solicitudes de Amazon S3 mediante CloudTrail

En Amazon S3, puede identificar solicitudes mediante un registro de eventos de AWS CloudTrail. AWS CloudTrail es la forma preferida de identificar las solicitudes de Amazon S3, pero si utiliza los registros de acceso al servidor de Amazon S3, consulte Uso de los registros de acceso al servidor de Amazon S3 para identificar solicitudes.

Identificación de solicitudes realizadas a Amazon S3 en un registro de CloudTrail

Después de configurar CloudTrail para que entregue los eventos en un bucket, debe empezar a ver cómo llegan objetos al bucket de destino en la consola de Amazon S3. Estos están formateados de la siguiente manera:

s3://DOC-EXAMPLE-BUCKET1/AWSLogs/111122223333/CloudTrail/Region/yyyy/mm/dd

Los eventos registrados por CloudTrail se almacenan como objetos JSON comprimidos gzipped en el bucket de S3. Para encontrar solicitudes de forma eficiente, debe utilizar un servicio como Amazon Athena para indexar y consultar los registros de CloudTrail.

Para obtener más información acerca de CloudTrail y Athena, consulte Creación de la tabla para registros de AWS CloudTrail en Athena mediante proyección de particiones en la Guía del usuario de Amazon Athena.

Identificación de solicitudes de firma de Amazon S3 versión 2 mediante CloudTrail

Puede utilizar un registro de eventos de CloudTrail a fin de identificar qué versión de firma de API se utilizó para firmar una solicitud en Amazon S3. Esta capacidad es importante porque el soporte para Signature Version 2 va a finalizar (esta característica quedará obsoleta). Cuando esto suceda, Amazon S3 dejará de aceptar solicitudes que utilicen Signature Version 2, y todas las solicitudes deberán firmarse con Signature Version 4.

Le recomendamos encarecidamente que utilice CloudTrail para determinar si alguno de sus flujos de trabajo utiliza el proceso de firma de Signature Version 2. Actualice las bibliotecas y el código para que utilicen Signature Version 4 con el fin de evitar que su negocio se vea afectado.

Para obtener más información, consulte Anuncio: AWS CloudTrail para Amazon S3 agrega nuevos campos para auditar la seguridad mejorada en AWS re:Post.

nota

Los eventos de CloudTrail para Amazon S3 incluyen la versión de firma en los detalles de la solicitud con el nombre clave additionalEventData. Para encontrar la versión de firma en solicitudes realizadas para objetos en Amazon S3, como solicitudes GET, PUT y DELETE, debe habilitar los eventos de datos de CloudTrail. (Esta característica está desactivada de forma predeterminada).

AWS CloudTrail es el método preferido para identificar solicitudes de Signature Version 2. Si utiliza los registros de acceso al servidor de Amazon S3, consulte Identificación de solicitudes de la versión 2 de firma mediante registros de acceso de Amazon S3.

Ejemplos de consulta de Athena para identificar solicitudes de firma de Amazon S3 versión 2

ejemplo — Seleccionar todos los eventos de Signature Version 2 e imprimir solo EventTime, S3_Action, Request_Parameters, Region, SourceIP y UserAgent

En la siguiente consulta de Athena, sustituya s3_cloudtrail_events_db.cloudtrail_table por los detalles de Athena y aumente o elimine el límite según corresponda.

SELECT EventTime, EventName as S3_Action, requestParameters as Request_Parameters, awsregion as AWS_Region, sourceipaddress as Source_IP, useragent as User_Agent FROM s3_cloudtrail_events_db.cloudtrail_table WHERE eventsource='s3.amazonaws.com' AND json_extract_scalar(additionalEventData, '$.SignatureVersion')='SigV2' LIMIT 10;
ejemplo — Seleccionar todos los solicitantes que envían tráfico de firma versión 2

SELECT useridentity.arn, Count(requestid) as RequestCount FROM s3_cloudtrail_events_db.cloudtrail_table WHERE eventsource='s3.amazonaws.com' and json_extract_scalar(additionalEventData, '$.SignatureVersion')='SigV2' Group by useridentity.arn

Partición de datos de firma de versión 2

Si tiene una gran cantidad de datos para consultar, puede reducir los costos y el tiempo de ejecución de Athena al crear una tabla particionada.

Para ello, cree una tabla nueva con particiones como se indica a continuación.

CREATE EXTERNAL TABLE s3_cloudtrail_events_db.cloudtrail_table_partitioned( 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> > >, 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 ) PARTITIONED BY (region string, year string, month string, day string) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.orc.OrcSerde' STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.SymlinkTextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://DOC-EXAMPLE-BUCKET1/AWSLogs/111122223333/';

A continuación, cree cada una de las particiones. No puede obtener resultados de fechas que no ha creado.

ALTER TABLE s3_cloudtrail_events_db.cloudtrail_table_partitioned ADD PARTITION (region= 'us-east-1', year= '2019', month= '02', day= '19') LOCATION 's3://DOC-EXAMPLE-BUCKET1/AWSLogs/111122223333/CloudTrail/us-east-1/2019/02/19/' PARTITION (region= 'us-west-1', year= '2019', month= '02', day= '19') LOCATION 's3://DOC-EXAMPLE-BUCKET1/AWSLogs/111122223333/CloudTrail/us-west-1/2019/02/19/' PARTITION (region= 'us-west-2', year= '2019', month= '02', day= '19') LOCATION 's3://DOC-EXAMPLE-BUCKET1/AWSLogs/111122223333/CloudTrail/us-west-2/2019/02/19/' PARTITION (region= 'ap-southeast-1', year= '2019', month= '02', day= '19') LOCATION 's3://DOC-EXAMPLE-BUCKET1/AWSLogs/111122223333/CloudTrail/ap-southeast-1/2019/02/19/' PARTITION (region= 'ap-southeast-2', year= '2019', month= '02', day= '19') LOCATION 's3://DOC-EXAMPLE-BUCKET1/AWSLogs/111122223333/CloudTrail/ap-southeast-2/2019/02/19/' PARTITION (region= 'ap-northeast-1', year= '2019', month= '02', day= '19') LOCATION 's3://DOC-EXAMPLE-BUCKET1/AWSLogs/111122223333/CloudTrail/ap-northeast-1/2019/02/19/' PARTITION (region= 'eu-west-1', year= '2019', month= '02', day= '19') LOCATION 's3://DOC-EXAMPLE-BUCKET1/AWSLogs/111122223333/CloudTrail/eu-west-1/2019/02/19/' PARTITION (region= 'sa-east-1', year= '2019', month= '02', day= '19') LOCATION 's3://DOC-EXAMPLE-BUCKET1/AWSLogs/111122223333/CloudTrail/sa-east-1/2019/02/19/';

A continuación, puede realizar la solicitud basándose en estas particiones y no necesita cargar el bucket completo.

SELECT useridentity.arn, Count(requestid) AS RequestCount FROM s3_cloudtrail_events_db.cloudtrail_table_partitioned WHERE eventsource='s3.amazonaws.com' AND json_extract_scalar(additionalEventData, '$.SignatureVersion')='SigV2' AND region='us-east-1' AND year='2019' AND month='02' AND day='19' Group by useridentity.arn

Identificación del acceso a objetos S3 mediante CloudTrail

Puede utilizar los registros de eventos de AWS CloudTrail para identificar las solicitudes de acceso a objetos de Amazon S3 para eventos de datos, como GetObject, DeleteObject y PutObject y descubrir información adicional sobre esas solicitudes.

En el siguiente ejemplo, se muestra cómo obtener todas las solicitudes de objeto PUT para Amazon S3 desde el registro de eventos de AWS CloudTrail.

Ejemplos de consulta de Athena para identificar solicitudes de acceso a objetos de Amazon S3

En los ejemplos de consulta de Athena siguientes, sustituya s3_cloudtrail_events_db.cloudtrail_table por los detalles de Athena y modifique el intervalo de fechas según corresponda.

ejemplo — Seleccionar todos los eventos que tengan solicitudes de acceso de objetos PUT e imprimir solo EventTime, EventSource, SourceIP, UserAgent, BucketName, object y UserARN
SELECT eventTime, eventName, eventSource, sourceIpAddress, userAgent, json_extract_scalar(requestParameters, '$.bucketName') as bucketName, json_extract_scalar(requestParameters, '$.key') as object, userIdentity.arn as userArn FROM s3_cloudtrail_events_db.cloudtrail_table WHERE eventName = 'PutObject' AND eventTime BETWEEN '2019-07-05T00:00:00Z' and '2019-07-06T00:00:00Z'
ejemplo — Seleccionar todos los eventos que tengan solicitudes de acceso de objetos GET e imprimir solo EventTime, EventSource, SourceIP, UserAgent, BucketName, object y UserARN
SELECT eventTime, eventName, eventSource, sourceIpAddress, userAgent, json_extract_scalar(requestParameters, '$.bucketName') as bucketName, json_extract_scalar(requestParameters, '$.key') as object, userIdentity.arn as userArn FROM s3_cloudtrail_events_db.cloudtrail_table WHERE eventName = 'GetObject' AND eventTime BETWEEN '2019-07-05T00:00:00Z' and '2019-07-06T00:00:00Z'
ejemplo — Seleccionar todos los eventos de los solicitantes anónimos en un bucket en un periodo determinado e imprima solo EventTime, EventName, EventSource, SourceIP, UserAgent, BucketName, UserARN y AccountID
SELECT eventTime, eventName, eventSource, sourceIpAddress, userAgent, json_extract_scalar(requestParameters, '$.bucketName') as bucketName, userIdentity.arn as userArn, userIdentity.accountId FROM s3_cloudtrail_events_db.cloudtrail_table WHERE userIdentity.accountId = 'anonymous' AND eventTime BETWEEN '2019-07-05T00:00:00Z' and '2019-07-06T00:00:00Z'
ejemplo — Identificar todas las solicitudes que requerían una ACL para la autorización

El siguiente ejemplo de consulta de Amazon Athena muestra cómo identificar todas las solicitudes realizadas a los buckets de S3 que requerían una lista de control de acceso (ACL) para la autorización. Si la solicitud requería una ACL para la autorización, el valor aclRequired en additionalEventData es Yes. Si no se requirió ninguna ACL, aclRequired no está presente. Puede usar esta información para migrar esos permisos de ACL a las políticas de bucket adecuadas. Una vez que haya creado estas políticas de bucket, puede desactivar las ACL de estos buckets. Para obtener más información acerca de la desactivación de las ACL, consulte Requisitos previos para desactivar las ACL.

SELECT eventTime, eventName, eventSource, sourceIpAddress, userAgent, userIdentity.arn as userArn, json_extract_scalar(requestParameters, '$.bucketName') as bucketName, json_extract_scalar(requestParameters, '$.key') as object, json_extract_scalar(additionalEventData, '$.aclRequired') as aclRequired FROM s3_cloudtrail_events_db.cloudtrail_table WHERE json_extract_scalar(additionalEventData, '$.aclRequired') = 'Yes' AND eventTime BETWEEN '2022-05-10T00:00:00Z' and '2022-08-10T00:00:00Z'
nota
  • Estos ejemplos de consulta también pueden ser útiles para la monitorización de la seguridad. Puede revisar los resultados de las llamadas a las operaciones PutObject o GetObject desde solicitantes o direcciones IP inesperados o no autorizados con el fin de identificar cualquier solicitud anónima que se realice a los buckets.

  • Esta consulta solo recupera información de la hora a la que se habilitó el registro.

Si utiliza los registros de acceso al servidor de Amazon S3, consulte Identificación de solicitudes de acceso a objetos mediante los registros de acceso de Amazon S3.