Amazon S3 서버 액세스 로깅 활성화 - Amazon Simple Storage Service

Amazon S3 서버 액세스 로깅 활성화

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

Amazon S3는 기본적으로 서버 액세스 로그를 수집하지 않습니다. 로깅을 활성화하면 Amazon S3는 사용자가 선택한 대상 버킷에 소스 버킷에 대한 액세스 로그를 전달합니다. 대상 버킷은 소스 버킷과 동일한 AWS 리전 에 있어야 하며 기본 보존 기간 구성이어서는 안 됩니다.

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

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

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

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

서버 액세스 로깅을 활성화하기 전에 다음을 고려하세요.

  • Amazon S3에서는 버킷 정책을 이용하지 않고 버킷 ACL(액세스 제어 목록)을 통해 액세스 로그를 전송하는 권한을 부여할 수 있습니다.

  • 버킷 정책에 deny 조건을 추가하면 Amazon S3가 액세스 로그를 전송하지 못할 수 있습니다.

  • 대상 버킷에서 기본 버킷 암호화는 [AES256(SSE-S3)]을 선택한 경우에만 사용할 수 있습니다. SSE-KMS 암호화는 지원되지 않습니다.

  • 대상 버킷에서 S3 객체 잠금을 활성화할 수 없습니다.

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

  2. 버킷 목록에서 서버 액세스 로깅을 활성화하려는 버킷의 이름을 선택합니다.

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

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

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

  6. 대상 버킷에서는 로그 기록 객체를 받아 보고자 하는 버킷의 이름을 입력합니다.

    대상 버킷은 원본 버킷과 동일한 리전에 있어야 하며 기본 보존 기간 구성이어서는 안 됩니다.

  7. [변경 사항 저장(Save changes)]을 선택합니다.

    버킷의 로깅을 활성화할 때 콘솔은 원본 버킷에 로깅을 활성화하고, 대상 버킷의 ACL(액세스 통제 목록)에 권한을 추가하여 Log Delivery 그룹에 쓰기 권한을 부여합니다.

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

자세한 내용은 S3 버킷에 대한 속성 보기 섹션을 참조하세요.

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

다음 예제에서는 대상 버킷으로 logbucket을, 접두사로 logs/를 지정합니다.

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

로그 객체는 Log Delivery 계정에서 쓰고 소유하며, 버킷 소유자에게는 로그 객체에 대한 모든 권한이 부여됩니다. 또한 필요할 경우 다른 사용자에게 로그에 액세스할 수 있는 권한을 부여할 수 있습니다. 자세한 내용은 PUT Bucket logging 단원을 참조하세요.

Amazon S3는 또한 버킷의 로깅 구성을 검색할 수 있는 GET Bucket logging API를 제공합니다. 로깅 구성을 삭제하려면 빈 BucketLoggingStatus로 PUT Bucket logging 요청을 보냅니다.

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

Amazon S3 API 또는 AWS SDK 래퍼 라이브러리를 사용하여 버킷의 로깅을 사용할 수 있습니다.

.NET

다음은 버킷의 로깅을 활성화하는 C# 예제입니다. 소스 버킷과 대상 버킷의 2개 버킷을 생성해야 합니다. 이 예제에서는 먼저 대상 버킷에 로그를 쓰는 데 필요한 권한을 Log Delivery 그룹에 부여한 다음 원본 버킷에서 로깅을 활성화합니다.

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); } } }

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

예 - 2개 리전에 걸쳐 5개 버킷으로 액세스 로그 활성화

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

  • 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. 다음 리전에 두 개의 로깅 버킷을 생성합니다.

    • awsexamplebucket1-logs-us-east-1

    • awsexamplebucket1-logs-us-west-2

  2. 그런 다음 다음과 같이 Amazon S3 액세스 로그를 활성화합니다.

    • 1-awsexamplebucket1-us-east-1은 접두사 awsexamplebucket1-logs-us-east-1이 있는 S3 버킷 1-awsexamplebucket1-us-east-1에 로깅합니다.

    • 2-awsexamplebucket1-us-east-1은 접두사 awsexamplebucket1-logs-us-east-1이 있는 S3 버킷 2-awsexamplebucket1-us-east-1에 로깅합니다.

    • 3-awsexamplebucket1-us-east-1은 접두사 awsexamplebucket1-logs-us-east-1이 있는 S3 버킷 3-awsexamplebucket1-us-east-1에 로깅합니다.

    • 1-awsexamplebucket1-us-west-2은 접두사 awsexamplebucket1-logs-us-west-2이 있는 S3 버킷 1-awsexamplebucket1-us-west-2에 로깅합니다.

    • 2-awsexamplebucket1-us-west-2은 접두사 awsexamplebucket1-logs-us-west-2이 있는 S3 버킷 2-awsexamplebucket1-us-west-2에 로깅합니다.

  3. 그러면 다음 방법을 사용하여 Amazon S3 액세스 로그를 활성화할 수 있습니다.

    1. 먼저 put-bucket-acl을 사용하여 Amazon S3 권한을 부여합니다.

      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
    2. 그런 다음 로깅 정책을 적용합니다.

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

      Logging.json은 로깅 정책이 포함된 현재 폴더의 JSON 문서입니다.

      { "LoggingEnabled": { "TargetBucket": "awsexamplebucket1-logs", "TargetPrefix": "awsexamplebucket1/", "TargetGrants": [ { "Grantee": { "Type": "AmazonCustomerByEmail", "EmailAddress": "user@example.com" }, "Permission": "FULL_CONTROL" } ] } }
      참고

      Amazon S3의 로그 전달 시스템에 필수 권한(write 및 read-acp 권한)을 부여하려면 put-bucket-acl 명령이 필요합니다.

    3. bash 스크립트를 사용하여 계정의 모든 버킷에 대한 액세스 로깅을 추가합니다.

      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"
      참고

      모든 버킷이 같은 리전에 있는 경우에만 가능합니다. 여러 리전에 버킷이 있는 경우 스크립트를 조정해야 합니다.

Amazon S3 로그 전달 그룹에 대한 WRITE 및 READ_ACP 권한

Amazon S3는 대상 버킷에 로그 파일을 쓰기 위해 Log Delivery라는 사전 정의된 Amazon S3 그룹을 제공합니다. 이 쓰기는 일반적인 액세스 제어 제약 조건을 따릅니다.

S3 콘솔을 사용하여 서버 액세스 로깅을 활성화하면 S3가 자동으로 버킷 ACL(액세스 제어 목록)을 업데이트하여 S3 로그 전달 그룹에 대한 액세스 권한을 부여합니다. ACL 권한을 수동으로 부여할 필요는 없습니다. ACL에 대한 자세한 내용은 ACL(액세스 제어 목록) 개요 단원을 참조하세요.

페이지의 AWS CLI 및 AWS SDK 예제에는 S3 로그 전달 그룹에 ACL 권한을 부여하는 단계가 포함되어 있습니다. 이러한 예제를 사용하는 경우 로그 전달 그룹에 ACL 권한을 수동으로 부여할 필요가 없습니다.

프로그래밍 방식으로 서버 액세스 로깅을 활성화하고 ACL 권한을 지정하지 않은 경우, 대상 버킷의 ACL(액세스 제어 목록)에 s3:GetObjectAcls3:PutObject 권한을 추가하여 이 그룹에 WRITEREAD_ACP 권한을 부여해야 합니다. Log Delivery 그룹을 나타내는 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>
중요

또한 AWS CloudFormation 을(를) 사용해 Amazon S3 서버 액세스를 활성화할 경우 해당 버킷의 속성 필드에 AccessControl": "LogDeliveryWrite"을(를) 추가해야 합니다. 이것이 중요한 이유는 버킷에 대해 ACL을 생성해야만 이러한 권한을 부여할 수 있지만 CloudFormation에서 버킷에 대한 사용자 지정 ACL을 생성할 수 없기 때문입니다. 미리 준비된 ACL만 사용할 수 있습니다.

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