

# Identificación de solicitudes de Amazon S3 mediante CloudTrail
<a name="cloudtrail-request-identification"></a>

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](using-s3-access-logs-to-identify-requests.md).

**Topics**
+ [Identificación de solicitudes realizadas a Amazon S3 en un registro de CloudTrail](#identify-S3-requests-using-in-CTlog)
+ [Identificación de solicitudes de firma de Amazon S3 versión 2 mediante CloudTrail](#cloudtrail-identification-sigv2-requests)
+ [Identificación del acceso a objetos S3 mediante CloudTrail](#cloudtrail-identification-object-access)

## Identificación de solicitudes realizadas a Amazon S3 en un registro de CloudTrail
<a name="identify-S3-requests-using-in-CTlog"></a>

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://amzn-s3-demo-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](https://docs.aws.amazon.com/athena/latest/ug/cloudtrail-logs.html#create-cloudtrail-table-partition-projection) en la *Guía del usuario de Amazon Athena*.

## Identificación de solicitudes de firma de Amazon S3 versión 2 mediante CloudTrail
<a name="cloudtrail-identification-sigv2-requests"></a>

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](https://forums.aws.amazon.com/ann.jspa?annID=6551) 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](using-s3-access-logs-to-identify-requests.md#using-s3-access-logs-to-identify-sigv2-requests).

**Topics**
+ [Ejemplos de consulta de Athena para identificar solicitudes de firma de Amazon S3 versión 2](#ct-examples-identify-sigv2-requests)
+ [Partición de datos de firma de versión 2](#partitioning-sigv2-data)

### Ejemplos de consulta de Athena para identificar solicitudes de firma de Amazon S3 versión 2
<a name="ct-examples-identify-sigv2-requests"></a>

**Example — 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;
```

**Example — 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
<a name="partitioning-sigv2-data"></a>

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://amzn-s3-demo-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://amzn-s3-demo-bucket1/AWSLogs/111122223333/CloudTrail/us-east-1/2019/02/19/'
    PARTITION (region= 'us-west-1', year= '2019', month= '02', day= '19') LOCATION 's3://amzn-s3-demo-bucket1/AWSLogs/111122223333/CloudTrail/us-west-1/2019/02/19/'
    PARTITION (region= 'us-west-2', year= '2019', month= '02', day= '19') LOCATION 's3://amzn-s3-demo-bucket1/AWSLogs/111122223333/CloudTrail/us-west-2/2019/02/19/'
    PARTITION (region= 'ap-southeast-1', year= '2019', month= '02', day= '19') LOCATION 's3://amzn-s3-demo-bucket1/AWSLogs/111122223333/CloudTrail/ap-southeast-1/2019/02/19/'
    PARTITION (region= 'ap-southeast-2', year= '2019', month= '02', day= '19') LOCATION 's3://amzn-s3-demo-bucket1/AWSLogs/111122223333/CloudTrail/ap-southeast-2/2019/02/19/'
    PARTITION (region= 'ap-northeast-1', year= '2019', month= '02', day= '19') LOCATION 's3://amzn-s3-demo-bucket1/AWSLogs/111122223333/CloudTrail/ap-northeast-1/2019/02/19/'
    PARTITION (region= 'eu-west-1', year= '2019', month= '02', day= '19') LOCATION 's3://amzn-s3-demo-bucket1/AWSLogs/111122223333/CloudTrail/eu-west-1/2019/02/19/'
    PARTITION (region= 'sa-east-1', year= '2019', month= '02', day= '19') LOCATION 's3://amzn-s3-demo-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
<a name="cloudtrail-identification-object-access"></a>

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.

**nota**  
Si está registrando la actividad de datos con AWS CloudTrail, el registro de eventos de un evento de datos `DeleteObjects` de Amazon S3 incluye el evento `DeleteObjects` y un evento `DeleteObject` para cada objeto eliminado como parte de esa operación. Puede excluir del registro del evento la visibilidad adicional sobre los objetos eliminados. Para obtener más información, consulte [Ejemplos de la AWS CLI para filtrar eventos de datos](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/filtering-data-events.html#filtering-data-events-deleteobjects) en la *Guía del usuario de AWS CloudTrail*.

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. 

**Topics**
+ [Ejemplos de consulta de Athena para identificar solicitudes de acceso a objetos de Amazon S3](#ct-examples-identify-object-access-requests)

### Ejemplos de consulta de Athena para identificar solicitudes de acceso a objetos de Amazon S3
<a name="ct-examples-identify-object-access-requests"></a>

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. 

**Example — 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'
```

**Example — 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'
```

**Example — 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'
```

**Example — 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](object-ownership-migrating-acls-prerequisites.md).  

```
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](using-s3-access-logs-to-identify-requests.md#using-s3-access-logs-to-identify-objects-access).