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

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

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

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

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

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

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

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

서버 액세스 로깅을 사용 설정하기 전에 다음을 고려하세요.

  • 버킷 정책 또는 버킷 액세스 제어 목록(ACL)을 사용하여 로그 전달 권한을 부여할 수 있습니다. 그러나 버킷 정책을 사용하는 것이 좋습니다. 대상 버킷이 객체 소유권에 버킷 소유자 시행 설정을 사용하는 경우 ACL이 사용 중지되고 더 이상 권한에 영향을 주지 않습니다. 로깅 서비스 보안 주체에 액세스 권한을 부여하려면 버킷 정책을 사용해야 합니다. 자세한 정보는 로그 전달을 위한 권한을 참조하십시오.

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

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

  • 대상 버킷에서 S3 객체 잠금을 사용 설정할 수 없습니다.

로그 전달을 위한 권한

Amazon S3는 특별 로그 전달 계정을 사용하여 서버 액세스 로그를 씁니다. 이 쓰기는 일반적인 액세스 제어 제약 조건을 따릅니다. 액세스 로그 전달을 위해 로깅 서비스 보안 주체(logging.s3.amazonaws.com)에 액세스 권한을 부여하도록 대상 버킷의 버킷 정책을 업데이트하는 것이 좋습니다.

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

또는 버킷 ACL을 사용하여 액세스 로그 전달을 위한 액세스 권한을 부여할 수 있습니다. S3 로그 전달 그룹에 WRITEREAD_ACP 권한을 부여하는 권한 부여 항목을 버킷 ACL에 추가합니다. 버킷 ACL을 사용하여 S3 로그 전달 그룹에 액세스 권한을 부여하는 것은 권장되지 않습니다.

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

대상 버킷이 객체 소유권에 버킷 소유자 시행 설정을 사용하는 경우 ACL이 사용 중지되고 더 이상 권한에 영향을 주지 않습니다. 대상 버킷에서 로깅 서비스 보안 주체에 액세스 권한을 부여하도록 버킷 정책을 업데이트해야 합니다. S3 로그 전달 그룹에 액세스 권한을 부여하기 위해 버킷 ACL을 업데이트할 수 없습니다. 또한 PutBucketLogging 구성에 대상 부여를 포함할 수 없습니다. 버킷 정책으로 액세스 로그 전달을 위해 기존 버킷 ACL을 마이그레이션하는 방법에 대한 자세한 내용은 서버 접근 로깅을 위해 S3 로그 전달 그룹에 대한 액세스 권한 부여 섹션을 참조하세요. 객체 소유권에 대한 자세한 내용은 객체 소유권 제어 및 버킷에 대해 ACL 사용 중지 섹션을 참조하세요.

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

이 예제 버킷 정책은 로깅 서비스 보안 주체(logging.s3.amazonaws.com)에 s3:PutObject 권한을 부여합니다. 이 버킷 정책을 사용하려면 예제 값을 바꿉니다.

{ "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" } } } ] }

버킷 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 로그 전달 그룹에 액세스 권한을 부여하는 경우 버킷의 속성 필드에 "AccessControl": "LogDeliveryWrite"도 추가해야 합니다. 이것이 중요한 이유는 버킷에 대해 ACL을 생성해야만 이러한 권한을 부여할 수 있지만 CloudFormation에서 버킷에 대한 사용자 지정 ACL을 생성할 수 없기 때문입니다. 미리 준비된 ACL만 사용할 수 있습니다.

서버 액세스 로깅 사용 설정

다음 예를 사용하여 AWS Management Console, AWS CLI, REST API 및 AWS SDK for .NET으로 서버 액세스 로깅을 사용 설정합니다.

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

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

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

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

  5. 서버 액세스 로깅에서 사용 설정를 선택합니다.

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

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

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

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

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

자세한 정보는 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>

S3 로그 전달 계정이 로그 객체를 작성하고 소유하며, 버킷 소유자에게는 로그 객체에 대한 모든 권한이 부여됩니다. 필요한 경우 대상 부여를 사용하여 로그에 액세스할 수 있도록 다른 사용자에게 권한을 부여할 수 있습니다. 자세한 내용은 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개 버킷을 생성해야 합니다. 이 예에서는 먼저 대상 버킷에서 버킷 ACL을 업데이트하고 로그 전달 그룹에 원본 버킷에 로그를 쓰는 데 필요한 권한을 부여한 다음 원본 버킷에서 로깅을 사용 설정합니다.

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

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

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을 참조하세요.

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

예 - 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. 버킷 ACL 또는 버킷 정책을 사용하여 서버 액세스 로그 전달에 대한 권한을 부여합니다.

    • 버킷 정책 업데이트(권장) - 로깅 서비스 보안 주체에 권한을 부여하려면 put-bucket-policy를 사용합니다.

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

      Policy.json은 버킷 정책이 포함된 현재 폴더의 JSON 문서입니다. 이 버킷 정책을 사용하려면 예제 값을 바꿉니다.

      { "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" } } } ] }
    • 버킷 ACL 업데이트 – S3 로그 전달 그룹에 권한을 부여하려면 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. 그런 다음 로깅 정책을 적용합니다.

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

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

    예 – 대상 부여가 없는 Logging.json

    다음 예제 Logging.json 파일은 대상 부여를 포함하지 않으며 객체 소유권에 버킷 소유자 시행 설정을 사용하는 버킷에 적용할 수 있습니다.

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

    예 – 대상 부여가 있는 Logging.json

    다음 예제 Logging.json 파일에는 대상 부여가 포함되어 있습니다.

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

    { "LoggingEnabled": { "TargetBucket": "awsexamplebucket1-logs", "TargetPrefix": "awsexamplebucket1/", "TargetGrants": [ { "Grantee": { "Type": "AmazonCustomerByEmail", "EmailAddress": "user@example.com" }, "Permission": "FULL_CONTROL" } ] } }
  5. bash 스크립트를 사용하여 계정의 모든 버킷에 대한 액세스 로깅을 추가합니다.

    참고

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

    예 – 버킷 정책으로 액세스 권한 부여 및 계정의 버킷에 대한 로깅 추가

    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"

    예 – 버킷 ACL로 액세스 권한 부여 및 계정의 버킷에 대한 로깅 추가

    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"