Habilitación del registro de acceso al servidor de Amazon S3 - Amazon Simple Storage Service

Habilitación del registro de acceso al servidor de Amazon S3

El registro de acceso al servidor proporciona el historial detallado de las solicitudes que se realizan a un bucket de Amazon S3. Los registros de acceso al servidor resultan útiles para muchas aplicaciones. Por ejemplo, la información del registro de acceso puede ser útil en auditorías de acceso y seguridad. También puede ayudarle a conocer mejor su base de clientes y entender su factura de Amazon S3.

De forma predeterminada, Amazon S3 no recopila registros de acceso al servidor. Cuando activa la actividad de registro, Amazon S3 envía los registros de acceso de un bucket de origen a un bucket de destino que usted selecciona. El bucket de destino debe estar en la misma Región de AWS y Cuenta de AWS que el bucket de origen y no debe tener una configuración de periodo de retención predeterminada.

Una entrada de registro de acceso incluye detalles de las solicitudes realizadas a un bucket. Esta información puede incluir el tipo de solicitud, los recursos especificados en la solicitud y la hora y la fecha en que se procesó la solicitud. Para obtener más información acerca de los conceptos básicos de los registros, consulte Registro de solicitudes mediante el registro de acceso al servidor.

importante
  • Habilitar el registro de acceso al servidor en un bucket de Amazon S3 ni incurre en ningún cargo adicional. Sin embargo, los archivos de registro que recibe del sistema acumularán los cargos usuales de almacenamiento. (Puede eliminar los registros en cualquier momento). No contemplamos los cargos de transferencia de datos por la entrega de los archivos de registro, pero sí aplicamos el cargo de la tasa normal de transferencia de datos por obtener acceso a los archivos de registro.

  • El bucket de destino no debe tener habilitado el registro de acceso al servidor. Puede enviar los registros a cualquier bucket de su propiedad que se encuentre en la misma región que el bucket de origen, incluido el propio bucket de origen. Sin embargo, esto provocaría un bucle infinito de registros y no se recomienda. Para que la administración de registros sea más sencilla, le recomendamos que guarde los registros de acceso en un bucket distinto. Para obtener más información, consulte ¿Cómo habilito la entrega de registros?.

Puede habilitar o desactivar el registro de acceso al servidor mediante la consola de Amazon S3, la API de Amazon S3, AWS Command Line Interface (AWS CLI) o los SDK de AWS.

Antes de habilitar el registro de acceso al servidor, tenga en cuenta lo siguiente:

  • Puede utilizar una política de bucket o listas de control de acceso (ACL) de bucket para conceder permisos de entrega de registros. Sin embargo, le recomendamos que utilice una política de bucket. Si el bucket de destino utiliza la configuración de propietario del bucket obligatorio de Object Ownership, las ACL se desactivan y ya no afectan a los permisos. Debe actualizar una política de bucket para conceder permisos de acceso a la entidad principal del servicio de registro. Para obtener más información, consulte Permisos para entrega de registros .

  • La inclusión de condiciones deny en una política de bucket puede impedir que Amazon S3 envíe registros de acceso.

  • Puede utilizar el cifrado de bucket predeterminado en el bucket de destino solo si usa AES256 (SSE-S3). No se admite el cifrado predeterminado con claves AWS KMS (SSE-KMS).

  • No puede habilitar el bloqueo de objetos S3 en el bucket de destino.

Permisos para entrega de registros

Amazon S3 utiliza una cuenta especial de entrega de registros para escribir registros de acceso al servidor. Estos escritos están sujetos a las restricciones de control de acceso habituales. Le recomendamos que actualice la política de bucket en el bucket de destino para conceder acceso a la entidad principal del servicio de registro (logging.s3.amazonaws.com) para la entrega de registros de acceso.

Para conceder acceso mediante la política de bucket del bucket de destino, actualiza la política de bucket para permitir acceso s3:PutObject para la entidad principal del servicio de registro. Si utiliza la consola de Amazon S3 para habilitar los registros de acceso al servidor, la consola actualiza automáticamente la política del bucket de destino para conceder estos permisos a la entidad principal del servicio de registro. Si habilita el registro de acceso al servidor mediante programación, puede actualizar manualmente la política del bucket de destino para conceder acceso a la entidad principal del servicio de registro.

También puede utilizar las ACL de bucket para conceder acceso para la entrega de registros de acceso. Agregue una entrada de concesión a la ACL del bucket que concede permisos WRITE y READ_ACP para el grupo entrega de registros de S3. No se recomienda conceder acceso al grupo de entrega de registros de S3 mediante la ACL del bucket.

Configuración de propietario del bucket obligatorio de S3 Object Ownership

Si el bucket de destino utiliza la configuración de propietario del bucket obligatorio de Object Ownership, las ACL se desactivan y ya no afectan a los permisos. Debe actualizar la política del bucket de destino para conceder acceso a la entidad principal del servicio de registro. No puede actualizar la ACL del bucket para conceder acceso al grupo de entrega de registros de S3. Tampoco puede incluir concesiones de destino en la configuración PutBucketLogging. Para obtener información sobre la migración de las ACL de bucket existentes para la entrega de registros de acceso a una política de bucket, consulte Concesión de acceso al grupo de entrega de registros de S3 para el registro de acceso al servidor. Para obtener más información acerca de la propiedad de objetos, consulte Control de la propiedad de los objetos y desactivación de las ACL del bucket.

Concesión de permisos a la entidad principal del servicio de registro mediante una política de bucket.

Esta política de bucket de ejemplo concede permisos s3:PutObject a la entidad principal del servicio de registro (logging.s3.amazonaws.com). Para utilizar esta política de bucket, reemplace los valores de ejemplo.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "S3ServerAccessLogsPolicy", "Effect": "Allow", "Principal": { "Service": "logging.s3.amazonaws.com" }, "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/EXAMPLE-LOGGING-PREFIX*", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:s3:::SOURCE-BUCKET-NAME" }, "StringEquals": { "aws:SourceAccount": "SOURCE-ACCOUNT-ID" } } } ] }

Concesión de permisos al grupo de entrega de registros mediante la ACL del bucket

Si bien no recomendamos este método, puede conceder permisos al grupo de entrega de registros mediante ACL del bucket. Sin embargo, si el bucket de destino utiliza la configuración de propietario del bucket obligatorio de Object Ownership, no se pueden configurar ACL de bucket u objeto. Tampoco puede incluir concesiones de destino en la configuración PutBucketLogging. Debe utilizar una política de bucket para conceder acceso a la entidad principal del servicio de registro (logging.s3.amazonaws.com). Para obtener más información, consulte Permisos para entrega de registros .

En la ACL del bucket, el grupo entrega de registros se representa con la siguiente URL.

http://acs.amazonaws.com/groups/s3/LogDelivery

Para conceder los permisos WRITE y READ_ACP (lectura de ACL), agregue las siguientes concesiones a la ACL del bucket de destino.

<Grant> <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Group"> <URI>http://acs.amazonaws.com/groups/s3/LogDelivery</URI> </Grantee> <Permission>WRITE</Permission> </Grant> <Grant> <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Group"> <URI>http://acs.amazonaws.com/groups/s3/LogDelivery</URI> </Grantee> <Permission>READ_ACP</Permission> </Grant>

Para obtener ejemplos de cómo agregar concesiones de ACL mediante programación, consulte Configuración de la ACL.

importante

Al habilitar el registro de acceso al servidor de Amazon S3 mediante AWS CloudFormation en un bucket y utilizar ACL para conceder acceso al grupo de entrega de registros de S3, también debe agregar AccessControl": "LogDeliveryWrite" en el campo de propiedades del bucket. Esta acción es importante porque solo puede otorgar esos permisos creando una ACL para el bucket, pero no puede crear ACL personalizadas para los buckets en CloudFormation. Solo puede usar ACL predefinidas.

Para habilitar el registro de acceso al servidor

Utilice los siguientes ejemplos para habilitar el registro de acceso al servidor mediante la AWS Management Console, la AWS CLI, la API REST y AWS SDK for .NET.

  1. Inicie sesión en la AWS Management Console y abra la consola de Amazon S3 en https://console.aws.amazon.com/s3/.

  2. En la lista Buckets (Buckets), elija el nombre del bucket para el que desea activar el registro de acceso al servidor.

  3. Seleccione Properties (Propiedades).

  4. En la sección Server access logging (Registro de acceso al servidor), elija Edit (Editar).

  5. En Server access logging (Registro de acceso al servidor), seleccione Enable (Activar).

  6. En Target bucket (Bucket de destino), seleccione el nombre del bucket que recibirá los objetos de entrada en el registro.

    El bucket de destino debe estar en la misma región que el bucket de origen y no debe tener una configuración de periodo de retención predeterminada.

  7. Elija Save changes.

    Cuando se habilita el registro de acceso al servidor en un bucket, la consola habilita los registros en el bucket de origen y actualiza la política de bucket para que el bucket de destino conceda permisos s3:PutObject a la entidad principal del servicio de registro (logging.s3.amazonaws.com). Para obtener más información acerca de esta política de bucket, consulte Concesión de permisos a la entidad principal del servicio de registro mediante una política de bucket..

    Puede ver los registros en el bucket de destino. Después de habilitar el registro de acceso al servidor, la entrega de los registros al bucket de destino puede tardar unos horas. Para obtener más información acerca de cómo y cuándo se entregan los registros, consulte ¿Cómo se envían los registros?.

Para obtener más información, consulte Visualización de las propiedades para un bucket de S3 .

Para habilitar los registros, envíe una solicitud PUT Bucket logging para añadir la configuración de registros en el bucket de origen. La solicitud especifica el bucket de destino y, de forma opcional, el prefijo que se debe utilizar con todas las claves de objeto de registro.

En el siguiente ejemplo se identifica LOGBUCKET como el bucket de destino y logs/ como el prefijo.

<BucketLoggingStatus xmlns="http://doc.s3.amazonaws.com/2006-03-01"> <LoggingEnabled> <TargetBucket>LOGBUCKET</TargetBucket> <TargetPrefix>logs/</TargetPrefix> </LoggingEnabled> </BucketLoggingStatus>

La cuenta entrega de archivos de registro de S3 escribe y posee los objetos de registro y el propietario del bucket tiene permisos completos sobre los objetos de registro. De forma opcional, también puede utilizar concesiones de destino para conceder permisos a otros usuarios para que puedan acceder a los registros. Para obtener más información, consulte PUT Bucket logging.

nota

Si el bucket de destino utiliza la configuración de propietario del bucket obligatorio de Object Ownership, no puedes usar las concesiones de destino para conceder permisos a otros usuarios. Para conceder permisos a otros, puede utilizar la actualización de la política de bucket en el bucket de destino. Para obtener más información, consulte Permisos para entrega de registros .

Amazon S3 también proporciona la API de GET Bucket logging para recuperar la configuración de registros en un bucket. Para eliminar la configuración de registros, debe enviar la solicitud PUT Bucket logging con un campo BucketLoggingStatus vacío.

<BucketLoggingStatus xmlns="http://doc.s3.amazonaws.com/2006-03-01"> </BucketLoggingStatus>

Puede utilizar la API de Amazon S3 o las bibliotecas de encapsulamiento de los AWS SDK para habilitar los registros en un bucket.

.NET

En el siguiente ejemplo de C# se habilitan los registros en un bucket. Debe crear dos buckets, uno de origen y uno de destino. En el ejemplo, primero se actualiza la ACL del bucket de destino y se otorga al grupo entrega de registros los permisos necesarios para escribir registros en el bucket de destino y, a continuación, se habilita los registros en el bucket de origen.

Este ejemplo no funcionará en buckets de destino que utilizan la configuración de propietario del bucket obligatorio de Object Ownership.

Si el bucket de destino utiliza la configuración de propietario del bucket obligatorio de Object Ownership, no se pueden configurar ACL de bucket u objeto. Tampoco puede incluir concesiones de destino en la configuración PutBucketLogging. Debe utilizar una política de bucket para conceder acceso a la entidad principal del servicio de registro (logging.s3.amazonaws.com). Para obtener más información, consulte Permisos para entrega de registros .

using Amazon; using Amazon.S3; using Amazon.S3.Model; using System; using System.Threading.Tasks; namespace Amazon.DocSamples.S3 { class ServerAccesLoggingTest { private const string bucketName = "*** bucket name for which to enable logging ***"; private const string targetBucketName = "*** bucket name where you want access logs stored ***"; private const string logObjectKeyPrefix = "Logs"; // Specify your bucket region (an example region is shown). private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2; private static IAmazonS3 client; public static void Main() { client = new AmazonS3Client(bucketRegion); EnableLoggingAsync().Wait(); } private static async Task EnableLoggingAsync() { try { // Step 1 - Grant Log Delivery group permission to write log to the target bucket. await GrantPermissionsToWriteLogsAsync(); // Step 2 - Enable logging on the source bucket. await EnableDisableLoggingAsync(); } catch (AmazonS3Exception e) { Console.WriteLine("Error encountered on server. Message:'{0}' when writing an object", e.Message); } catch (Exception e) { Console.WriteLine("Unknown encountered on server. Message:'{0}' when writing an object", e.Message); } } private static async Task GrantPermissionsToWriteLogsAsync() { var bucketACL = new S3AccessControlList(); var aclResponse = client.GetACL(new GetACLRequest { BucketName = targetBucketName }); bucketACL = aclResponse.AccessControlList; bucketACL.AddGrant(new S3Grantee { URI = "http://acs.amazonaws.com/groups/s3/LogDelivery" }, S3Permission.WRITE); bucketACL.AddGrant(new S3Grantee { URI = "http://acs.amazonaws.com/groups/s3/LogDelivery" }, S3Permission.READ_ACP); var setACLRequest = new PutACLRequest { AccessControlList = bucketACL, BucketName = targetBucketName }; await client.PutACLAsync(setACLRequest); } private static async Task EnableDisableLoggingAsync() { var loggingConfig = new S3BucketLoggingConfig { TargetBucketName = targetBucketName, TargetPrefix = logObjectKeyPrefix }; // Send request. var putBucketLoggingRequest = new PutBucketLoggingRequest { BucketName = bucketName, LoggingConfig = loggingConfig }; await client.PutBucketLoggingAsync(putBucketLoggingRequest); } } }

Recomendamos que cree un bucket de registro dedicado en cada Región de AWS en la que tenga buckets de S3. y que guarde el registro de acceso de Amazon S3 en ese bucket de S3. Para obtener más información y ejemplos, consulte put-bucket-logging en la Referencia de AWS CLI.

Si el bucket de destino utiliza la configuración de propietario del bucket obligatorio de Object Ownership, no se pueden configurar ACL de bucket u objeto. Tampoco puede incluir concesiones de destino en la configuración PutBucketLogging. Debe utilizar una política de bucket para conceder acceso a la entidad principal del servicio de registro (logging.s3.amazonaws.com). Para obtener más información, consulte Permisos para entrega de registros .

ejemplo — Habilitar registros de acceso con cinco buckets en dos regiones

Para este ejemplo, suponga que tiene los cinco buckets siguientes:

  • 1-awsexamplebucket1-us-east-1

  • 2-awsexamplebucket1-us-east-1

  • 3-awsexamplebucket1-us-east-1

  • 1-awsexamplebucket1-us-west-2

  • 2-awsexamplebucket1-us-west-2

  1. Cree dos buckets de registro en las siguientes regiones:

    • awsexamplebucket1-logs-us-east-1

    • awsexamplebucket1-logs-us-west-2

  2. A continuación, habilite los registros de acceso de Amazon S3 de la siguiente manera:

    • 1-awsexamplebucket1-us-east-1 registra en el bucket de S3 awsexamplebucket1-logs-us-east-1 con el prefijo 1-awsexamplebucket1-us-east-1

    • 2-awsexamplebucket1-us-east-1 registra en el bucket de S3 awsexamplebucket1-logs-us-east-1 con el prefijo 2-awsexamplebucket1-us-east-1

    • 3-awsexamplebucket1-us-east-1 registra en el bucket de S3 awsexamplebucket1-logs-us-east-1 con el prefijo 3-awsexamplebucket1-us-east-1

    • 1-awsexamplebucket1-us-west-2 registra en el bucket de S3 awsexamplebucket1-logs-us-west-2 con el prefijo 1-awsexamplebucket1-us-west-2

    • 2-awsexamplebucket1-us-west-2 registra en el bucket de S3 awsexamplebucket1-logs-us-west-2 con el prefijo 2-awsexamplebucket1-us-west-2

  3. Concesión de permisos para la entrega de registros de acceso al servidor mediante una ACL de bucket o una política de bucket:

    • Update the bucket policy (Actualizar la política de bucket) (recomendado): para conceder permisos a la entidad principal del servicio de registro, utilice put-bucket-policy:

      aws s3api put-bucket-policy --bucket awsexamplebucket1-logs --policy file://policy.json

      Policy.json es un documento JSON en la carpeta actual que contiene la política de bucket. Para utilizar esta política de bucket, reemplace los valores de ejemplo.

      { "Version": "2012-10-17", "Statement": [ { "Sid": "S3ServerAccessLogsPolicy", "Effect": "Allow", "Principal": { "Service": "logging.s3.amazonaws.com" }, "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::awsexamplebucket1-logs/*", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:s3:::SOURCE-BUCKET-NAME" }, "StringEquals": { "aws:SourceAccount": "SOURCE-ACCOUNT-ID" } } } ] }
    • Update the bucket ACL (Actualizar la ACL del bucket): para conceder permisos al grupo de entrega de registros de S3, utilice put-bucket-acl.

      aws s3api put-bucket-acl --bucket awsexamplebucket1-logs --grant-write URI=http://acs.amazonaws.com/groups/s3/LogDelivery --grant-read-acp URI=http://acs.amazonaws.com/groups/s3/LogDelivery
  4. A continuación, aplique la política de registro.

    aws s3api put-bucket-logging --bucket awsexamplebucket1 --bucket-logging-status file://logging.json

    Logging.json es un documento JSON en la carpeta actual que contiene la configuración de registro. Si un bucket utiliza la configuración de propietario del bucket obligatorio de Object Ownership, la configuración de registro no puede contener concesiones de destino. Para obtener más información, consulte Permisos para entrega de registros .

    ejemplo – Logging.json sin concesiones de destino

    El siguiente archivo Logging.json de ejemplo no contiene concesiones de destino y se puede aplicar a un bucket que utiliza la configuración de propietario del bucket obligatorio de Object Ownership.

    { "LoggingEnabled": { "TargetBucket": "awsexamplebucket1-logs", "TargetPrefix": "awsexamplebucket1/" } }

    ejemplo – Logging.json con concesiones de destino

    El siguiente archivo Logging.json de ejemplo contiene concesiones de destino.

    Si el bucket de destino utiliza la configuración de propietario del bucket obligatorio de Object Ownership, no puede incluir las concesiones de destino en la configuración PutBucketLogging. Para obtener más información, consulte Permisos para entrega de registros .

    { "LoggingEnabled": { "TargetBucket": "awsexamplebucket1-logs", "TargetPrefix": "awsexamplebucket1/", "TargetGrants": [ { "Grantee": { "Type": "AmazonCustomerByEmail", "EmailAddress": "user@example.com" }, "Permission": "FULL_CONTROL" } ] } }
  5. Utilice un script bash para agregar el registro de acceso a todos los buckets de la cuenta.

    nota

    Este script solo funciona si todos los buckets están en la misma región. Si tiene buckets en multirregiones, debe ajustar el script.

    ejemplo – Conceder acceso con políticas de bucket y agregar registros para los buckets de la cuenta

    loggingBucket='awsexamplebucket1-logs' region='us-west-2' # Create Logging bucket aws s3 mb s3://$loggingBucket --region $region aws s3api put-bucket-policy --bucket $loggingBucket --policy file://policy.json # List buckets in this account buckets="$(aws s3 ls | awk '{print $3}')" # Put bucket logging on each bucket for bucket in $buckets do printf '{ "LoggingEnabled": { "TargetBucket": "%s", "TargetPrefix": "%s/" } }' "$loggingBucket" "$bucket" > logging.json aws s3api put-bucket-logging --bucket $bucket --bucket-logging-status file://logging.json echo "$bucket done" done rm logging.json echo "Complete"

    ejemplo – Conceder acceso con ACL de bucket y agregar registros para los buckets de la cuenta

    loggingBucket='awsexamplebucket1-logs' region='us-west-2' # Create Logging bucket aws s3 mb s3://$loggingBucket --region $region aws s3api put-bucket-acl --bucket $loggingBucket --grant-write URI=http://acs.amazonaws.com/groups/s3/LogDelivery --grant-read-acp URI=http://acs.amazonaws.com/groups/s3/LogDelivery # List buckets in this account buckets="$(aws s3 ls | awk '{print $3}')" # Put bucket logging on each bucket for bucket in $buckets do printf '{ "LoggingEnabled": { "TargetBucket": "%s", "TargetPrefix": "%s/" } }' "$loggingBucket" "$bucket" > logging.json aws s3api put-bucket-logging --bucket $bucket --bucket-logging-status file://logging.json echo "$bucket done" done rm logging.json echo "Complete"