Amazon S3 서버 액세스 로깅 사용 설정 - Amazon Simple Storage Service

Amazon S3 서버 액세스 로깅 사용 설정

서버 액세스 로깅은 Amazon S3 버킷에 수행된 요청에 대한 상세 레코드를 제공합니다. 서버 액세스 로그는 많은 애플리케이션에 있어 유용합니다. 예를 들어 액세스 로그 정보는 보안 및 액세스 감사에 유용할 수 있습니다. 이 정보를 통해 고객 기반을 이해하고 Amazon S3 청구 비용을 파악할 수도 있습니다.

Amazon S3는 기본적으로 서버 액세스 로그를 수집하지 않습니다. 로깅을 활성화하면 Amazon S3는 선택된 대상 버킷에 소스 버킷에 대한 액세스 로그를 전송합니다. 대상 버킷은 소스 버킷과 AWS 리전 및 AWS 계정이 동일해야 합니다.

액세스 로그 레코드에는 버킷에 대한 요청 내역이 자세히 나와 있습니다. 이 정보에는 요청 유형, 요청에 지정된 리소스, 요청을 처리한 날짜 및 시간 등이 포함됩니다. 로깅 기초 사항에 대한 자세한 내용은 서버 액세스 로깅을 사용한 요청 로깅 단원을 참조하십시오.

중요
  • Amazon S3 버킷에서 서버 액세스 로그를 사용하는 데 따른 별도의 요금은 청구되지 않습니다. 단, 시스템이 사용자에게 전달하는 로그 파일에 대해서는 일반적인 스토리지 요금이 발생합니다. (로그 파일은 언제든지 삭제할 수 있습니다.) 로그 파일 전송에 따른 데이터 전송 요금은 발생하지 않지만 로그 파일 액세스에 따른 일반 데이터 전송 요금은 부과됩니다.

  • 대상 버킷에는 서버 액세스 로깅을 활성화해서는 안 됩니다. 소스 버킷 자체를 포함하여 소스 버킷과 동일한 리전에 있는 자신의 고유 버킷에 로그를 전달할 수 있습니다. 그러나 원본 버킷에 로그를 전송하면 로그의 무한 루프가 발생하므로 권장되지 않습니다. 로그 관리를 간소화하기 위해서는 액세스 로그를 다른 버킷에 저장하는 것이 좋습니다. 자세한 내용은 로그 전송을 사용 설정하려면 어떻게 해야 합니까? 섹션을 참조하세요.

  • S3 객체 잠금이 활성화된 S3 버킷은 서버 액세스 로그의 대상 버킷으로 사용할 수 없습니다. 대상 버킷에는 기본 보존 기간이 구성되어 있지 않아야 합니다.

  • 대상 버킷에는 요청자 지불이 활성화되어 있지 않아야 합니다.

  • 256비트 고급 암호화 표준(AES-256)을 사용하는 Amazon S3 관리형 키(SSE-S3)를 통한 서버 측 암호화를 사용할 경우에만 대상 버킷에 기본 버킷 암호화를 사용할 수 있습니다. AWS Key Management Service(AWS KMS) 키(SSE-KMS)를 사용한 기본 서버 측 암호화는 지원되지 않습니다.

Amazon S3 콘솔, Amazon S3 API, AWS Command Line Interface(AWS CLI) 또는 AWS SDK를 사용하여 서버 액세스 로깅을 사용하거나 사용 중지할 수 있습니다.

로그 전달을 위한 권한

Amazon S3는 특별 로그 전달 계정을 사용하여 서버 액세스 로그를 씁니다. 이 쓰기는 일반적인 액세스 제어 제약 조건을 따릅니다. 액세스 로그를 전송하려면 로깅 서비스 보안 주체(logging.s3.amazonaws.com)에 대상 버킷에 대한 액세스 권한을 부여해야 합니다.

Amazon S3에 로그 전송 권한을 부여하려면 대상 버킷의 S3 객체 소유권 설정에 따라 버킷 정책 또는 버킷 액세스 제어 목록(ACL)을 사용할 수 있습니다. 그러나 ACL 대신 버킷 정책을 사용하는 것이 좋습니다.

S3 객체 소유권에 대한 버킷 소유자 시행 설정

대상 버킷이 객체 소유권에 버킷 소유자 적용 설정을 사용하는 경우 ACL이 비활성화되고 더 이상 권한에 영향을 주지 않습니다. 이 경우, 대상 버킷에서 로깅 서비스 보안 주체에 액세스 권한을 부여하도록 버킷 정책을 업데이트해야 합니다. S3 로그 전달 그룹에 액세스 권한을 부여하기 위해 버킷 ACL을 업데이트할 수 없습니다. 또한 PutBucketLogging 구성에 대상 권한 부여를 포함할 수 없습니다.

버킷 정책으로 액세스 로그 전달을 위해 기존 버킷 ACL을 마이그레이션하는 방법에 대한 자세한 내용은 서버 액세스 로깅을 위해 S3 로그 전송 그룹에 대한 액세스 권한 부여 섹션을 참조하십시오. 객체 소유권에 대한 자세한 내용은 객체 소유권 제어 및 버킷에 대해 ACL 사용 중지 섹션을 참조하십시오. 새 버킷을 만들 때 기본적으로 ACL이 비활성화됩니다.

버킷 정책을 사용하여 액세스 권한 부여

대상 버킷에 대한 버킷 정책을 사용하여 액세스 권한을 부여하려면 로깅 서비스 보안 주체에 s3:PutObject 권한을 부여하도록 버킷 정책을 업데이트합니다. Amazon S3 콘솔을 사용하여 서버 액세스 로깅을 활성화하는 경우 콘솔은 대상 버킷에 대한 버킷 정책을 자동으로 업데이트하여 이 권한을 로깅 서비스 보안 주체에 부여합니다. 프로그래밍 방식으로 서버 액세스 로깅을 활성화하는 경우 대상 버킷에서 로깅 서비스 보안 주체에 액세스 권한을 부여하도록 버킷 정책을 수동으로 업데이트해야 합니다.

로깅 서비스 보안 주체에 액세스 권한을 부여하는 버킷 정책의 예시는 버킷 정책을 사용하여 로깅 서비스 보안 주체에 권한 부여 섹션을 참조하세요.

버킷 ACL을 사용하여 액세스 권한 부여

또는 버킷 ACL을 사용하여 액세스 로그 전달을 위한 액세스 권한을 부여할 수 있습니다. S3 로그 전달 그룹에 WRITEREAD_ACP 권한을 부여하는 권한 부여 항목을 버킷 ACL에 추가합니다. 그러나 버킷 ACL을 사용하여 S3 로그 전달 그룹에 액세스 권한을 부여하는 것은 권장되지 않습니다. 자세한 내용은 객체 소유권 제어 및 버킷에 대해 ACL 사용 중지 단원을 참조하십시오. 버킷 정책으로 액세스 로그 전달을 위해 기존 버킷 ACL을 마이그레이션하는 방법에 대한 자세한 내용은 서버 액세스 로깅을 위해 S3 로그 전송 그룹에 대한 액세스 권한 부여 섹션을 참조하십시오. 로깅 서비스 보안 주체에 액세스 권한을 부여하는 ACL의 예시는 버킷 ACL을 사용하여 로그 전달 그룹에 권한 부여 섹션을 참조하세요.

버킷 정책을 사용하여 로깅 서비스 보안 주체에 권한 부여

이 예시 버킷 정책은 로깅 서비스 보안 주체(logging.s3.amazonaws.com)에 s3:PutObject 권한을 부여합니다. 이 버킷 정책을 사용하려면 user input placeholders를 사용자의 정보로 대체합니다. 다음 정책에서 DOC-EXAMPLE-DESTINATION-BUCKET은 서버 액세스 로그가 전송되는 대상 버킷이고 DOC-EXAMPLE-SOURCE-BUCKET은 소스 버킷입니다. EXAMPLE-LOGGING-PREFIX는 원하는 경우 로그 객체에 선택적으로 사용할 수 있는 대상 접두사입니다. SOURCE-ACCOUNT-ID는 소스 버킷을 소유한 AWS 계정입니다.

참고

버킷 정책에 Deny 명령문이 있는 경우 Amazon S3가 액세스 로그를 전송하는 것을 차단하지 않도록 해야 합니다.

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

버킷 ACL을 사용하여 로그 전달 그룹에 권한 부여

참고

보안 모범 사례로 Amazon S3는 기본적으로 모든 새 버킷에서 액세스 제어 목록(ACL)을 비활성화합니다. Amazon S3 콘솔의 ACL 권한에 대한 자세한 내용은 ACL 구성 단원을 참조하십시오.

권장하지는 않는 방식이지만 버킷 ACL을 사용하여 로그 전송 그룹에 권한을 부여할 수 있습니다. 그러나 대상 버킷이 객체 소유권에 버킷 소유자 적용 설정을 사용하는 경우 버킷 또는 객체 ACL을 설정할 수 없습니다. 또한 PutBucketLogging 구성에 대상 권한 부여를 포함할 수 없습니다. 대신, 로깅 서비스 보안 주체(logging.s3.amazonaws.com)에 액세스 권한을 부여하려면 버킷 정책을 사용해야 합니다. 자세한 내용은 로그 전달을 위한 권한 단원을 참조하십시오.

버킷 ACL에서 로그 전송 그룹은 다음 URL로 표시됩니다.

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

WRITEREAD_ACP(ACL 읽기) 권한을 부여하려면 대상 버킷 ACL에 다음 권한을 추가합니다.

<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>

프로그래밍 방식으로 ACL 권한을 추가하는 예는 ACL 구성 단원을 참조하십시오.

중요

버킷에서 AWS CloudFormation을 사용하여 Amazon S3 서버 액세스 로깅을 활성화하고 ACL을 사용하여 S3 로그 전달 그룹에 액세스 권한을 부여하는 경우 CloudFormation 템플릿에 "AccessControl": "LogDeliveryWrite"도 추가해야 합니다. 이것이 중요한 이유는 버킷에 대해 ACL을 생성해야만 이러한 권한을 부여할 수 있지만 CloudFormation에서 버킷에 대한 사용자 지정 ACL을 생성할 수 없기 때문입니다. 미리 준비된 ACL만 CloudFormation에서 사용할 수 있습니다.

서버 액세스 로깅 사용 설정

Amazon S3 콘솔, Amazon S3 REST API, AWS SDK, AWS CLI를 사용하여 서버 액세스 로깅을 활성화하려면 다음 절차를 수행합니다.

  1. AWS Management Console에 로그인한 후 https://console.aws.amazon.com/s3/에서 Amazon S3 콘솔을 엽니다.

  2. 버킷 목록에서 서버 액세스 로깅을 사용 설정하려는 버킷의 이름을 선택합니다.

  3. [속성(Properties)]을 선택합니다.

  4. 서버 액세스 로깅 섹션에서 편집을 선택합니다.

  5. 서버 액세스 로깅에서 활성화를 선택합니다.

  6. 대상 버킷에서 버킷과 원하는 경우 접두사를 지정합니다. 접두사를 지정하는 경우 로그를 더 쉽게 찾을 수 있도록 접두사 뒤에 슬래시(/)를 포함하는 것이 좋습니다.

    참고

    접두사를 슬래시(/)와 함께 지정하면 로그 객체를 더 쉽게 구분할 수 있습니다. 예를 들어 접두사 값을 logs/로로 지정할 경우 Amazon S3가 만드는 각 로그 객체의 키는 다음과 같이 logs/ 접두사로 시작합니다.

    logs/2013-11-01-21-32-16-E568B2907131C0C0

    접두사 값을 logs로 지정하는 경우 로그 객체는 다음과 같이 나타납니다.

    logs2013-11-01-21-32-16-E568B2907131C0C0
  7. 로그 객체 키 형식에서 다음 중 하나를 수행합니다.

    • 날짜 기반이 아닌 분할을 선택하려면 [DestinationPrefix][YYYY]-[MM]-[DD]-[hh]-[mm]-[ss]-[UniqueString]을 선택합니다.

    • 날짜 기반 분할을 선택하려면 [DestinationPrefix][SourceAccountId]/[SourceRegion]/[SourceBucket]/[YYYY]/[MM]/[DD]/[YYYY]-[MM]-[DD]-[hh]-[mm]-[ss]-[UniqueString]을 선택한 다음 S3 이벤트 시간 또는 로그 파일 전송 시간을 선택합니다.

  8. Save changes(변경 사항 저장)를 선택합니다.

    버킷에서 서버 액세스 로깅을 활성화하면 콘솔이 소스 버킷에서 로깅을 사용 설정하고 대상 버킷에서 로깅 서비스 보안 주체(logging.s3.amazonaws.com)에 s3:PutObject 권한을 부여하도록 버킷 정책을 업데이트합니다. 이 버킷 정책에 대한 자세한 내용은 버킷 정책을 사용하여 로깅 서비스 보안 주체에 권한 부여 섹션을 참조하십시오.

    대상 버킷에서 로그를 볼 수 있습니다. 서버 액세스 로깅을 사용 설정하면 로그가 대상 버킷에 전달되기까지 몇 시간이 소요될 수 있습니다. 로그가 전송되는 방법 및 시기에 대한 자세한 내용은 로그 전송 방법 섹션을 참조하십시오.

자세한 내용은 S3 버킷에 대한 속성 보기 단원을 참조하십시오.

로깅을 활성화하기 위해 소스 버킷에 로깅 구성을 추가하는 PutBucketLogging 요청을 제출합니다. 요청에 대상 버킷, 그리고 선택 사항으로 모든 로그 객체 키에 사용할 접두사를 지정합니다.

다음 예시에서는 대상 버킷으로 DOC-EXAMPLE-DESTINATION-BUCKET을, 접두사로 logs/를 지정합니다.

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

다음 예시에서는 대상 버킷으로 DOC-EXAMPLE-DESTINATION-BUCKET을, 접두사로 logs/를, 로그 객체 키 형식으로 EventTime을 지정합니다.

<BucketLoggingStatus xmlns="http://doc.s3.amazonaws.com/2006-03-01"> <LoggingEnabled> <TargetBucket>DOC-EXAMPLE-DESTINATION-BUCKET</TargetBucket> <TargetPrefix>logs/</TargetPrefix> <TargetObjectKeyFormat> <PartitionedPrefix> <PartitionDateSource>EventTime</PartitionDateSource> </PartitionedPrefix> </TargetObjectKeyFormat> </LoggingEnabled> </BucketLoggingStatus>

S3 로그 전달 계정이 로그 객체를 작성하고 소유하며, 버킷 소유자에게는 로그 객체에 대한 모든 권한이 부여됩니다. 필요한 경우 대상 권한 부여를 사용하여 로그에 액세스할 수 있도록 다른 사용자에게 권한을 부여할 수 있습니다. 자세한 내용은 PutBucketLogging 단원을 참조하십시오.

참고

대상 버킷이 객체 소유권에 버킷 소유자 적용 설정을 사용하는 경우 대상 권한 부여를 사용하여 다른 사용자에게 권한을 부여할 수 없습니다. 다른 사용자에게 권한을 부여하기 위해 대상 버킷에서 버킷 정책을 업데이트할 수 있습니다. 자세한 내용은 로그 전달을 위한 권한 단원을 참조하십시오.

버킷의 로깅 구성을 검색하려면 GetBucketLogging API 작업을 사용하세요.

로깅 구성을 삭제하려면 빈 BucketLoggingStatusPutBucketLogging 요청을 보냅니다.

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

버킷에서 로깅을 활성화하려면 Amazon S3 API 또는 AWS SDK 래퍼 라이브러리를 사용할 수 있습니다.

다음은 버킷에서 로깅을 활성화하는 예시입니다. 소스 버킷 하나와 대상 버킷 하나를 생성해야 합니다. 예시는 대상 버킷의 버킷 ACL을 먼저 업데이트합니다. 그런 다음, 먼저 대상 버킷에 로그를 쓰는 데 필요한 권한을 로그 전송 그룹에 부여하고 나서 소스 버킷에서 로깅을 활성화합니다.

이 예시는 객체 소유권에 버킷 소유자 적용 설정을 사용하는 대상 버킷에서는 작동하지 않습니다.

대상 버킷이 객체 소유권에 버킷 소유자 강제 설정을 사용하는 경우 버킷 또는 객체 ACL을 설정할 수 없습니다. 또한 PutBucketLogging 구성에 대상 권한 부여를 포함할 수 없습니다. 로깅 서비스 보안 주체(logging.s3.amazonaws.com)에 액세스 권한을 부여하려면 버킷 정책을 사용해야 합니다. 자세한 내용은 로그 전달을 위한 권한 단원을 참조하십시오.

.NET
AWS SDK for .NET
참고

GitHub에 더 많은 내용이 있습니다. AWS 코드 예제 리포지토리에서 전체 예제를 찾고 설정 및 실행하는 방법을 배워보세요.

using System; using System.IO; using System.Threading.Tasks; using Amazon.S3; using Amazon.S3.Model; using Microsoft.Extensions.Configuration; /// <summary> /// This example shows how to enable logging on an Amazon Simple Storage /// Service (Amazon S3) bucket. You need to have two Amazon S3 buckets for /// this example. The first is the bucket for which you wish to enable /// logging, and the second is the location where you want to store the /// logs. /// </summary> public class ServerAccessLogging { private static IConfiguration _configuration = null!; public static async Task Main() { LoadConfig(); string bucketName = _configuration["BucketName"]; string logBucketName = _configuration["LogBucketName"]; string logObjectKeyPrefix = _configuration["LogObjectKeyPrefix"]; string accountId = _configuration["AccountId"]; // If the AWS Region defined for your default user is different // from the Region where your Amazon S3 bucket is located, // pass the Region name to the Amazon S3 client object's constructor. // For example: RegionEndpoint.USWest2 or RegionEndpoint.USEast2. IAmazonS3 client = new AmazonS3Client(); try { // Update bucket policy for target bucket to allow delivery of logs to it. await SetBucketPolicyToAllowLogDelivery( client, bucketName, logBucketName, logObjectKeyPrefix, accountId); // Enable logging on the source bucket. await EnableLoggingAsync( client, bucketName, logBucketName, logObjectKeyPrefix); } catch (AmazonS3Exception e) { Console.WriteLine($"Error: {e.Message}"); } } /// <summary> /// This method grants appropriate permissions for logging to the /// Amazon S3 bucket where the logs will be stored. /// </summary> /// <param name="client">The initialized Amazon S3 client which will be used /// to apply the bucket policy.</param> /// <param name="sourceBucketName">The name of the source bucket.</param> /// <param name="logBucketName">The name of the bucket where logging /// information will be stored.</param> /// <param name="logPrefix">The logging prefix where the logs should be delivered.</param> /// <param name="accountId">The account id of the account where the source bucket exists.</param> /// <returns>Async task.</returns> public static async Task SetBucketPolicyToAllowLogDelivery( IAmazonS3 client, string sourceBucketName, string logBucketName, string logPrefix, string accountId) { var resourceArn = @"""arn:aws:s3:::" + logBucketName + "/" + logPrefix + @"*"""; var newPolicy = @"{ ""Statement"":[{ ""Sid"": ""S3ServerAccessLogsPolicy"", ""Effect"": ""Allow"", ""Principal"": { ""Service"": ""logging.s3.amazonaws.com"" }, ""Action"": [""s3:PutObject""], ""Resource"": [" + resourceArn + @"], ""Condition"": { ""ArnLike"": { ""aws:SourceArn"": ""arn:aws:s3:::" + sourceBucketName + @""" }, ""StringEquals"": { ""aws:SourceAccount"": """ + accountId + @""" } } }] }"; Console.WriteLine($"The policy to apply to bucket {logBucketName} to enable logging:"); Console.WriteLine(newPolicy); PutBucketPolicyRequest putRequest = new PutBucketPolicyRequest { BucketName = logBucketName, Policy = newPolicy, }; await client.PutBucketPolicyAsync(putRequest); Console.WriteLine("Policy applied."); } /// <summary> /// This method enables logging for an Amazon S3 bucket. Logs will be stored /// in the bucket you selected for logging. Selected prefix /// will be prepended to each log object. /// </summary> /// <param name="client">The initialized Amazon S3 client which will be used /// to configure and apply logging to the selected Amazon S3 bucket.</param> /// <param name="bucketName">The name of the Amazon S3 bucket for which you /// wish to enable logging.</param> /// <param name="logBucketName">The name of the Amazon S3 bucket where logging /// information will be stored.</param> /// <param name="logObjectKeyPrefix">The prefix to prepend to each /// object key.</param> /// <returns>Async task.</returns> public static async Task EnableLoggingAsync( IAmazonS3 client, string bucketName, string logBucketName, string logObjectKeyPrefix) { Console.WriteLine($"Enabling logging for bucket {bucketName}."); var loggingConfig = new S3BucketLoggingConfig { TargetBucketName = logBucketName, TargetPrefix = logObjectKeyPrefix, }; var putBucketLoggingRequest = new PutBucketLoggingRequest { BucketName = bucketName, LoggingConfig = loggingConfig, }; await client.PutBucketLoggingAsync(putBucketLoggingRequest); Console.WriteLine($"Logging enabled."); } /// <summary> /// Loads configuration from settings files. /// </summary> public static void LoadConfig() { _configuration = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("settings.json") // Load settings from .json file. .AddJsonFile("settings.local.json", true) // Optionally, load local settings. .Build(); } }
  • API 세부 정보는 AWS SDK for .NET API 참조PutBucketLogging을 참조하십시오.

Java
import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.s3.S3Client; import software.amazon.awssdk.services.s3.model.BucketLoggingStatus; import software.amazon.awssdk.services.s3.model.LoggingEnabled; import software.amazon.awssdk.services.s3.model.PartitionedPrefix; import software.amazon.awssdk.services.s3.model.PutBucketLoggingRequest; import software.amazon.awssdk.services.s3.model.TargetObjectKeyFormat; // Class to set a bucket policy on a target S3 bucket and enable server access logging on a source S3 bucket. public class ServerAccessLogging { private static S3Client s3Client; public static void main(String[] args) { String sourceBucketName = "SOURCE-BUCKET"; String targetBucketName = "TARGET-BUCKET"; String sourceAccountId = "123456789012"; String targetPrefix = "logs/"; // Create S3 Client. s3Client = S3Client.builder(). region(Region.US_EAST_2) .build(); // Set a bucket policy on the target S3 bucket to enable server access logging by granting the // logging.s3.amazonaws.com principal permission to use the PutObject operation. ServerAccessLogging serverAccessLogging = new ServerAccessLogging(); serverAccessLogging.setTargetBucketPolicy(sourceAccountId, sourceBucketName, targetBucketName); // Enable server access logging on the source S3 bucket. serverAccessLogging.enableServerAccessLogging(sourceBucketName, targetBucketName, targetPrefix); } // Function to set a bucket policy on the target S3 bucket to enable server access logging by granting the // logging.s3.amazonaws.com principal permission to use the PutObject operation. public void setTargetBucketPolicy(String sourceAccountId, String sourceBucketName, String targetBucketName) { String policy = "{\n" + " \"Version\": \"2012-10-17\",\n" + " \"Statement\": [\n" + " {\n" + " \"Sid\": \"S3ServerAccessLogsPolicy\",\n" + " \"Effect\": \"Allow\",\n" + " \"Principal\": {\"Service\": \"logging.s3.amazonaws.com\"},\n" + " \"Action\": [\n" + " \"s3:PutObject\"\n" + " ],\n" + " \"Resource\": \"arn:aws:s3:::" + targetBucketName + "/*\",\n" + " \"Condition\": {\n" + " \"ArnLike\": {\n" + " \"aws:SourceArn\": \"arn:aws:s3:::" + sourceBucketName + "\"\n" + " },\n" + " \"StringEquals\": {\n" + " \"aws:SourceAccount\": \"" + sourceAccountId + "\"\n" + " }\n" + " }\n" + " }\n" + " ]\n" + "}"; s3Client.putBucketPolicy(b -> b.bucket(targetBucketName).policy(policy)); } // Function to enable server access logging on the source S3 bucket. public void enableServerAccessLogging(String sourceBucketName, String targetBucketName, String targetPrefix) { TargetObjectKeyFormat targetObjectKeyFormat = TargetObjectKeyFormat.builder() .partitionedPrefix(PartitionedPrefix.builder().partitionDateSource("EventTime").build()) .build(); LoggingEnabled loggingEnabled = LoggingEnabled.builder() .targetBucket(targetBucketName) .targetPrefix(targetPrefix) .targetObjectKeyFormat(targetObjectKeyFormat) .build(); BucketLoggingStatus bucketLoggingStatus = BucketLoggingStatus.builder() .loggingEnabled(loggingEnabled) .build(); s3Client.putBucketLogging(PutBucketLoggingRequest.builder() .bucket(sourceBucketName) .bucketLoggingStatus(bucketLoggingStatus) .build()); } }

S3 버킷이 있는 각 AWS 리전에 전용 로깅 버킷을 생성하는 것이 좋습니다. 그런 다음 해당 S3 버킷에 Amazon S3 액세스 로그를 전송하세요. 자세한 내용과 예제는 AWS CLI 참조put-bucket-logging 섹션을 참조하십시오.

대상 버킷이 객체 소유권에 버킷 소유자 강제 설정을 사용하는 경우 버킷 또는 객체 ACL을 설정할 수 없습니다. 또한 PutBucketLogging 구성에 대상 권한 부여를 포함할 수 없습니다. 로깅 서비스 보안 주체(logging.s3.amazonaws.com)에 액세스 권한을 부여하려면 버킷 정책을 사용해야 합니다. 자세한 내용은 로그 전달을 위한 권한 단원을 참조하십시오.

예 - 2개 리전에 걸쳐 5개 버킷으로 액세스 로그 사용 설정

이 예제에서는 다음과 같은 다섯 개 버킷이 있습니다.

  • 1-DOC-EXAMPLE-BUCKET1-us-east-1

  • 2-DOC-EXAMPLE-BUCKET1-us-east-1

  • 3-DOC-EXAMPLE-BUCKET1-us-east-1

  • 1-DOC-EXAMPLE-BUCKET1-us-west-2

  • 2-DOC-EXAMPLE-BUCKET1-us-west-2

참고

다음 절차의 마지막 단계에서는 로깅 버킷을 생성하고 해당 버킷에서 서버 액세스 로깅을 활성화하는 데 사용할 수 있는 예시 bash 스크립트를 제공합니다. 이러한 스크립트를 사용하려면 다음 절차에 설명된 대로 policy.jsonlogging.json 파일을 만들어야 합니다.

  1. 미국 서부(오레곤) 및 미국 동부(버지니아 북부) 리전에 로깅 대상 버킷 두 개를 만들고 다음과 같이 이름을 지정합니다.

    • DOC-EXAMPLE-BUCKET1-logs-us-east-1

    • DOC-EXAMPLE-BUCKET1-logs-us-west-2

  2. 이 단계 후반부에서 다음과 같이 서버 액세스 로깅을 활성화합니다.

    • 1-DOC-EXAMPLE-BUCKET1-us-east-1은 접두사가 1-DOC-EXAMPLE-BUCKET1-us-east-1인 S3 버킷 DOC-EXAMPLE-BUCKET1-logs-us-east-1에 로깅합니다.

    • 2-DOC-EXAMPLE-BUCKET1-us-east-1은 접두사가 2-DOC-EXAMPLE-BUCKET1-us-east-1인 S3 버킷 DOC-EXAMPLE-BUCKET1-logs-us-east-1에 로깅합니다.

    • 3-DOC-EXAMPLE-BUCKET1-us-east-1은 접두사가 3-DOC-EXAMPLE-BUCKET1-us-east-1인 S3 버킷 DOC-EXAMPLE-BUCKET1-logs-us-east-1에 로깅합니다.

    • 1-DOC-EXAMPLE-BUCKET1-us-west-2은 접두사가 1-DOC-EXAMPLE-BUCKET1-us-west-2인 S3 버킷 DOC-EXAMPLE-BUCKET1-logs-us-west-2에 로깅합니다.

    • 2-DOC-EXAMPLE-BUCKET1-us-west-2는 접두사가 2-DOC-EXAMPLE-BUCKET1-us-west-2인 S3 버킷 DOC-EXAMPLE-BUCKET1-logs-us-west-2에 로깅합니다.

  3. 대상 로깅 버킷 각각에 대해 버킷 ACL 또는 버킷 정책을 사용하여 서버 액세스 로그 전송에 대한 권한을 부여합니다.

    • 버킷 정책 업데이트(권장) - 로깅 서비스 보안 주체에 권한을 부여하려면 다음 put-bucket-policy 명령을 사용합니다. DOC-EXAMPLE-DESTINATION-BUCKET-logs를 대상 버킷의 이름으로 바꿉니다.

      aws s3api put-bucket-policy --bucket DOC-EXAMPLE-DESTINATION-BUCKET-logs --policy file://policy.json

      Policy.json은 다음 버킷 정책이 포함된 현재 폴더의 JSON 문서입니다. 이 버킷 정책을 사용하려면 user input placeholders를 사용자의 정보로 대체합니다. 다음 정책에서 DOC-EXAMPLE-DESTINATION-BUCKET-logs는 서버 액세스 로그가 전송될 대상 버킷이고 DOC-EXAMPLE-SOURCE-BUCKET은 소스 버킷입니다. SOURCE-ACCOUNT-ID는 소스 버킷을 소유한 AWS 계정입니다.

      { "Version": "2012-10-17", "Statement": [ { "Sid": "S3ServerAccessLogsPolicy", "Effect": "Allow", "Principal": { "Service": "logging.s3.amazonaws.com" }, "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::DOC-EXAMPLE-DESTINATION-BUCKET-logs/*", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:s3:::DOC-EXAMPLE-SOURCE-BUCKET" }, "StringEquals": { "aws:SourceAccount": "SOURCE-ACCOUNT-ID" } } } ] }
    • 버킷 ACL 업데이트 – S3 로그 전달 그룹에 권한을 부여하려면 다음 put-bucket-acl 명령을 사용합니다. DOC-EXAMPLE-DESTINATION-BUCKET-logs를 대상 버킷의 이름으로 바꾸세요.

      aws s3api put-bucket-acl --bucket DOC-EXAMPLE-DESTINATION-BUCKET-logs --grant-write URI=http://acs.amazonaws.com/groups/s3/LogDelivery --grant-read-acp URI=http://acs.amazonaws.com/groups/s3/LogDelivery
  4. 그런 다음, 아래 세 가지 예시 중 하나를 기반으로 로깅 구성이 포함된 logging.json 파일을 생성합니다. logging.json 파일을 만든 후 다음 put-bucket-logging 명령을 사용하여 로깅 구성을 적용할 수 있습니다. DOC-EXAMPLE-DESTINATION-BUCKET-logs를 대상 버킷의 이름으로 바꾸세요.

    aws s3api put-bucket-logging --bucket DOC-EXAMPLE-DESTINATION-BUCKET-logs --bucket-logging-status file://logging.json
    참고

    put-bucket-logging 명령을 사용하여 각 대상 버킷에 로깅 구성을 적용하는 대신 다음 단계에서 제공하는 bash 스크립트 중 하나를 사용할 수 있습니다. 이러한 스크립트를 사용하려면 이 절차에 설명된 대로 policy.jsonlogging.json 파일을 만들어야 합니다.

    logging.json 파일은 로깅 구성이 포함된 현재 폴더의 JSON 문서입니다. 대상 버킷이 객체 소유권에 버킷 소유자 적용 설정을 사용하는 경우 로깅 구성에 대상 권한 부여가 포함될 수 없습니다. 자세한 내용은 로그 전달을 위한 권한 단원을 참조하십시오.

    예 - 대상 권한 부여가 없는 logging.json

    다음 예시 logging.json 파일에는 대상 권한 부여가 없습니다. 따라서 객체 소유권에 대해 버킷 소유자 적용 설정을 사용하는 대상 버킷에 이 구성을 적용할 수 있습니다.

    { "LoggingEnabled": { "TargetBucket": "DOC-EXAMPLE-DESTINATION-BUCKET-logs", "TargetPrefix": "DOC-EXAMPLE-DESTINATION-BUCKET/" } }
    예 - 대상 권한 부여가 있는 logging.json

    다음 예시 logging.json 파일에는 대상 권한 부여가 포함되어 있습니다.

    대상 버킷이 객체 소유권에 버킷 소유자 적용 설정을 사용하는 경우 PutBucketLogging 구성에 대상 권한 부여를 포함할 수 없습니다. 자세한 내용은 로그 전달을 위한 권한 단원을 참조하십시오.

    { "LoggingEnabled": { "TargetBucket": "DOC-EXAMPLE-DESTINATION-BUCKET-logs", "TargetPrefix": "DOC-EXAMPLE-DESTINATION-BUCKET/", "TargetGrants": [ { "Grantee": { "Type": "AmazonCustomerByEmail", "EmailAddress": "user@example.com" }, "Permission": "FULL_CONTROL" } ] } }
    예 - 로그 객체 키 형식이 S3 이벤트 시간으로 설정된 logging.json

    다음 logging.json 파일은 로그 객체 키 형식을 S3 이벤트 시간으로 변경합니다. 로그 객체 키 형식 설정에 대한 자세한 내용은 로그 전송을 사용 설정하려면 어떻게 해야 합니까? 섹션을 참조하세요.

    { "LoggingEnabled": { "TargetBucket": "DOC-EXAMPLE-DESTINATION-BUCKET-logs", "TargetPrefix": "DOC-EXAMPLE-DESTINATION-BUCKET/", "TargetObjectKeyFormat": { "PartitionedPrefix": { "PartitionDateSource": "EventTime" } } } }
  5. 다음 bash 스크립트 중 하나를 사용하여 계정의 모든 버킷에 대한 액세스 로깅을 추가합니다. DOC-EXAMPLE-DESTINATION-BUCKET-logs를 대상 버킷의 이름으로 바꾸고, us-west-2를 버킷이 위치한 리전의 이름으로 바꾸세요.

    참고

    이 스크립트는 모든 버킷이 동일한 리전에 있는 경우에만 작동합니다. 여러 리전에 버킷이 있는 경우 스크립트를 조정해야 합니다.

    예 – 버킷 정책으로 액세스 권한 부여 및 계정의 버킷에 대한 로깅 추가
    loggingBucket='DOC-EXAMPLE-DESTINATION-BUCKET-logs' region='us-west-2' # Create the logging bucket. aws s3 mb s3://$loggingBucket --region $region aws s3api put-bucket-policy --bucket $loggingBucket --policy file://policy.json # List the buckets in this account. buckets="$(aws s3 ls | awk '{print $3}')" # Put a bucket logging configuration on each bucket. for bucket in $buckets do # This if statement excludes the logging bucket. if [ "$bucket" != "$loggingBucket" ] ; then continue; fi 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"
    예 – 버킷 ACL로 액세스 권한 부여 및 계정의 버킷에 대한 로깅 추가
    loggingBucket='DOC-EXAMPLE-DESTINATION-BUCKET-logs' region='us-west-2' # Create the 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 the buckets in this account. buckets="$(aws s3 ls | awk '{print $3}')" # Put a bucket logging configuration on each bucket. for bucket in $buckets do # This if statement excludes the logging bucket. if [ "$bucket" != "$loggingBucket" ] ; then continue; fi 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"

서버 액세스 로그 설정 확인

서버 액세스 로깅을 활성화한 후 다음 단계를 완료합니다.

  • 대상 버킷에 액세스하여 로그 파일이 전송되고 있는지 확인합니다. 액세스 로그가 설정된 후 모든 요청이 제대로 로깅되고 전달되려면 한 시간 이상 걸릴 수 있습니다. 또한 Amazon S3 요청 지표를 사용하고 이러한 지표에 대한 Amazon CloudWatch 경보를 설정하여 로그 전달을 자동으로 확인할 수 있습니다. 자세한 내용은 Amazon CloudWatch를 사용한 지표 모니터링 단원을 참조하십시오.

  • 로그 파일의 내용을 열고 읽을 수 있는지 확인합니다.

서버 액세스 로깅 문제 해결 정보는 서버 액세스 로깅 문제 해결 섹션을 참조하십시오.