Amazon S3 서버 접근 로깅 활성화

Amazon S3 서버 접근 로깅 활성화

서버 접근 로깅은 Amazon S3 버킷에 이루어진 요청에 대한 상세 기록을 제공해요. 서버 접근 로그는 많은 애플리케이션에서 유용해요. 예를 들어 접근 로그 정보는 보안 및 접근 감사에 유용할 수 있어요. 이 정보는 고객 기반을 파악하고 Amazon S3 요금을 이해하는 데도 도움이 돼요.

참고: 이 페이지는 일반 용도 Amazon S3 버킷으로 서버 접근 로그를 전달하는 내용을 다뤄요. 구조화된 조회, 계정 간 집계, 선택적 S3 Tables 미러링을 위해 Amazon CloudWatch Logs로 로그를 전달할 수도 있어요. 자세한 내용은 "서버 접근 로그를 CloudWatch Logs로 전달"을 참고하세요.

기본적으로 Amazon S3는 서버 접근 로그를 수집하지 않아요. 로깅을 활성화하면 Amazon S3는 소스 버킷의 접근 로그를 사용자가 선택한 대상 버킷(타깃 버킷이라고도 함)으로 전달해요. 대상 버킷은 소스 버킷과 같은 AWS 리전과 같은 AWS 계정에 있어야 해요.

접근 로그 레코드에는 버킷에 이루어진 요청에 대한 세부 정보가 포함돼요. 이 정보에는 요청 유형, 요청에 지정된 리소스, 요청이 처리된 날짜·시각이 포함될 수 있어요. 로깅 기본 사항에 대한 자세한 내용은 "서버 접근 로깅으로 요청 기록"을 참고하세요.

중요:

  • Amazon S3 버킷에 서버 접근 로깅을 활성화하는 것에는 추가 비용이 없어요. 하지만 시스템이 전달하는 로그 파일에는 일반적인 저장 비용이 발생해요. (언제든 로그 파일을 삭제할 수 있어요.) 로그 파일 전달에는 데이터 전송 요금을 부과하지 않지만, 로그 파일 접근에는 일반 데이터 전송 요율을 부과해요.
  • 대상 버킷에는 서버 접근 로깅을 활성화하지 않아야 해요. 소스 버킷과 같은 리전에 있는 소유한 모든 버킷(소스 버킷 자체 포함)에 로그를 전달할 수 있어요. 하지만 소스 버킷으로 로그를 전달하면 로그 무한 루프가 발생하므로 권장하지 않아요. 더 간단한 로그 관리를 위해 접근 로그를 다른 버킷에 저장할 것을 권장해요.
  • S3 Object Lock이 활성화된 S3 버킷은 서버 접근 로그의 대상 버킷으로 사용할 수 없어요. 대상 버킷에는 기본 보존 기간 구성이 없어야 해요.
  • 대상 버킷에는 Requester Pays가 활성화되어 있어서는 안 돼요.

Amazon S3 콘솔, Amazon S3 API, AWS Command Line Interface(AWS CLI) 또는 AWS SDK로 서버 접근 로깅을 활성화하거나 비활성화할 수 있어요.

출처: 문서

본문

로그 전달 권한

Amazon S3는 특별한 로그 전달 계정으로 서버 접근 로그를 써요. 이러한 쓰기는 일반적인 접근 제어 제한의 적용을 받아요. 접근 로그 전달을 위해 대상 버킷에 로깅 서비스 보안 주체(logging.s3.amazonaws.com)의 접근을 부여해야 해요.

Amazon S3에 로그 전달 권한을 부여하려면 대상 버킷의 S3 Object Ownership 설정에 따라 버킷 정책이나 버킷 액세스 제어 목록(ACL)을 사용할 수 있어요. 하지만 ACL 대신 버킷 정책을 사용할 것을 권장해요.

참고: 대상 버킷이 SSE-KMS 기본 암호화를 사용하면 로깅 서비스 보안 주체에 s3:PutObject를 부여하는 것만으로는 충분하지 않아요. 대상 버킷은 Amazon S3 관리형 키(SSE-S3)를 사용해야 해요. 대상 버킷이 SSE-KMS를 사용하면 Amazon S3가 접근할 수 없는 키로 암호화된 로그 객체를 전달할 수 있어요.

S3 Object Ownership의 Bucket owner enforced 설정 — 대상 버킷이 Object Ownership에 Bucket owner enforced 설정을 사용하면 ACL이 비활성화되고 더 이상 권한에 영향을 주지 않아요. 이 경우 로깅 서비스 보안 주체에 접근을 부여하도록 대상 버킷의 버킷 정책을 업데이트해야 해요. 대상 버킷 ACL을 업데이트해 S3 로그 전달 그룹에 접근을 부여할 수 없어요. 또한 PutBucketLogging 구성에 대상 부여(타깃 부여라고도 함)를 포함할 수도 없어요.

접근 로그 전달을 위해 기존 버킷 ACL을 버킷 정책으로 마이그레이션하는 방법은 "서버 접근 로깅을 위한 S3 로그 전달 그룹 접근 부여"를 참고하세요. Object Ownership에 대한 자세한 내용은 "버킷의 객체 소유권 제어 및 ACL 비활성화"를 참고하세요. 새 버킷을 만들 때는 기본적으로 ACL이 비활성화돼요.

버킷 정책으로 접근 부여 — 대상 버킷의 버킷 정책으로 접근을 부여하려면 로깅 서비스 보안 주체에 s3:PutObject 권한을 부여하도록 버킷 정책을 업데이트해요. Amazon S3 콘솔로 서버 접근 로깅을 활성화하면 콘솔이 대상 버킷의 버킷 정책을 자동으로 업데이트해 이 권한을 로깅 서비스 보안 주체에 부여해요. 프로그래밍 방식으로 서버 접근 로깅을 활성화하면 로깅 서비스 보안 주체에 접근을 부여하도록 대상 버킷의 버킷 정책을 수동으로 업데이트해야 해요.

로깅 서비스 보안 주체에 접근을 부여하는 예시 버킷 정책은 "버킷 정책으로 로깅 서비스 보안 주체에 권한 부여"를 참고하세요.

버킷 ACL로 접근 부여 — 접근 로그 전달을 위해 버킷 ACL로 접근을 부여할 수도 있어요. S3 로그 전달 그룹에 WRITE 및 READ_ACP 권한을 부여하는 부여 항목을 버킷 ACL에 추가해요. 하지만 버킷 ACL로 S3 로그 전달 그룹에 접근을 부여하는 것은 권장되지 않아요. 자세한 내용은 "버킷의 객체 소유권 제어 및 ACL 비활성화"를 참고하세요. 접근 로그 전달을 위해 기존 버킷 ACL을 버킷 정책으로 마이그레이션하는 방법은 "서버 접근 로깅을 위한 S3 로그 전달 그룹 접근 부여"를 참고하세요. 로깅 서비스 보안 주체에 접근을 부여하는 예시 ACL은 "버킷 ACL로 로그 전달 그룹에 권한 부여"를 참고하세요.

버킷 정책으로 로깅 서비스 보안 주체에 권한 부여

다음 예시 버킷 정책은 로깅 서비스 보안 주체(logging.s3.amazonaws.com)에 s3:PutObject 권한을 부여해요. 이 버킷 정책을 사용하려면 user input placeholders를 자신의 정보로 바꾸세요. 다음 정책에서 amzn-s3-demo-destination-bucket은 서버 접근 로그가 전달될 대상 버킷이고, amzn-s3-demo-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:::amzn-s3-demo-destination-bucket/EXAMPLE-LOGGING-PREFIX*",
            "Condition": {
                "ArnLike": {
                    "aws:SourceArn": "arn:aws:s3:::amzn-s3-demo-source-bucket"
                },
                "StringEquals": {
                    "aws:SourceAccount": "SOURCE-ACCOUNT-ID"
                }
            }
        }
    ]
}

버킷 ACL로 로그 전달 그룹에 권한 부여

참고: 보안 모범 사례로 Amazon S3는 모든 새 버킷에서 액세스 제어 목록(ACL)을 기본적으로 비활성화해요. Amazon S3 콘솔의 ACL 권한에 대한 자세한 내용은 "ACL 구성"을 참고하세요.

권장하지는 않지만 버킷 ACL로 로그 전달 그룹에 권한을 부여할 수 있어요. 하지만 대상 버킷이 Object Ownership의 Bucket owner enforced 설정을 사용하면 버킷이나 객체 ACL을 설정할 수 없어요. 또한 PutBucketLogging 구성에 대상 부여(타깃 부여라고도 함)를 포함할 수도 없어요. 대신 로깅 서비스 보안 주체(logging.s3.amazonaws.com)에 접근을 부여하려면 버킷 정책을 사용해야 해요. 자세한 내용은 "로그 전달 권한"을 참고하세요.

버킷 ACL에서 로그 전달 그룹은 다음 URL로 표시돼요.

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

WRITE 및 READ_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을 만들 수 없기 때문에 중요해요. CloudFormation에서는 사전 정의된 ACL(canned ACL)만 사용할 수 있어요.

서버 접근 로깅 활성화

Amazon S3 콘솔, Amazon S3 REST API, AWS SDK 및 AWS CLI로 서버 접근 로깅을 활성화하려면 다음 절차를 사용하세요.

  1. AWS Management Console에 로그인하고 https://console.aws.amazon.com/s3/에서 Amazon S3 콘솔을 엽니다.
  2. 왼쪽 탐색 창에서 General purpose buckets을 선택합니다.
  3. 버킷 목록에서 서버 접근 로깅을 활성화할 버킷의 이름을 선택합니다.
  4. Properties를 선택합니다.
  5. Server access logging 섹션에서 Edit을 선택합니다.
  6. Server access logging에서 Enable을 선택합니다.
  7. Destination bucket에서 버킷과 선택적 접두사를 지정합니다. 접두사를 지정하면 로그를 찾기 쉽도록 접두사 뒤에 슬래시(/)를 포함할 것을 권장합니다.

    참고: 접두사를 슬래시(/)와 함께 지정하면 로그 객체를 더 쉽게 찾을 수 있습니다. 예를 들어 접두사 값 logs/를 지정하면 Amazon S3가 만드는 각 로그 객체가 키에서 logs/ 접두사로 시작합니다. 예: logs/2013-11-01-21-32-16-E568B2907131C0C0. 접두사 값 logs를 지정하면 로그 객체가 logs2013-11-01-21-32-16-E568B2907131C0C0처럼 나타납니다.

  8. Log object key format에서 다음 중 하나를 수행합니다.
    • 날짜 비기반 파티셔닝을 선택하려면 **[DestinationPrefix][YYYY]-[MM]-[DD]-[hh]-[mm]-[ss]-[UniqueString]**을 선택합니다.
    • 날짜 기반 파티셔닝을 선택하려면 **[DestinationPrefix][SourceAccountId]/[SourceRegion]/[SourceBucket]/[YYYY]/[MM]/[DD]/[YYYY]-[MM]-[DD]-[hh]-[mm]-[ss]-[UniqueString]**을 선택한 다음 S3 event time 또는 Log file delivery time을 선택합니다.
  9. Save changes를 선택합니다. 버킷에 서버 접근 로깅을 활성화하면 콘솔이 소스 버킷에 로깅을 활성화하고 대상 버킷의 버킷 정책을 업데이트해 로깅 서비스 보안 주체(logging.s3.amazonaws.com)에 s3:PutObject 권한을 부여합니다. 이 버킷 정책에 대한 자세한 내용은 "버킷 정책으로 로깅 서비스 보안 주체에 권한 부여"를 참고하세요.

대상 버킷에서 로그를 볼 수 있습니다. 서버 접근 로깅을 활성화한 후 로그가 타깃 버킷에 전달되기까지 몇 시간이 걸릴 수 있습니다.

자세한 내용은 "S3 일반 용도 버킷의 속성 보기"를 참고하세요.

로깅을 활성화하려면 소스 버킷에 로깅 구성을 추가하는 PutBucketLogging 요청을 제출합니다. 요청은 대상 버킷(타깃 버킷이라고도 함)과 선택적으로 모든 로그 객체 키에 사용될 접두사를 지정합니다.

다음 예시는 amzn-s3-demo-destination-bucket을 대상 버킷으로, logs/를 접두사로 식별합니다.

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

다음 예시는 amzn-s3-demo-destination-bucket을 대상 버킷으로, logs/를 접두사로, EventTime을 로그 객체 키 형식으로 식별합니다.

<BucketLoggingStatus xmlns="http://doc.s3.amazonaws.com/2006-03-01">
  <LoggingEnabled>
    <TargetBucket>amzn-s3-demo-destination-bucket</TargetBucket>
    <TargetPrefix>logs/</TargetPrefix>
    <TargetObjectKeyFormat>
      <PartitionedPrefix>
         <PartitionDateSource>EventTime</PartitionDateSource>
      </PartitionedPrefix>
  </TargetObjectKeyFormat>
  </LoggingEnabled>
</BucketLoggingStatus>

로그 객체는 S3 로그 전달 계정이 작성하고 소유하며, 버킷 소유자는 로그 객체에 대한 전체 권한을 부여받아요. 선택적으로 대상 부여(타깃 부여라고도 함)를 사용해 다른 사용자에게 로그에 접근할 수 있는 권한을 부여할 수 있어요. 자세한 내용은 PutBucketLogging을 참고하세요.

참고: 대상 버킷이 Object Ownership의 Bucket owner enforced 설정을 사용하면 대상 부여로 다른 사용자에게 권한을 부여할 수 없어요. 다른 사람에게 권한을 부여하려면 대상 버킷의 버킷 정책을 업데이트할 수 있어요. 자세한 내용은 "로그 전달 권한"을 참고하세요.

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

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

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

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

다음 예시는 버킷에 로깅을 활성화해요. 소스 버킷과 대상(타깃) 버킷이라는 두 버킷을 만들어야 해요. 예시는 먼저 대상 버킷의 버킷 ACL을 업데이트해요. 그런 다음 로그 전달 그룹에 대상 버킷에 로그를 쓸 필요한 권한을 부여하고, 소스 버킷에 로깅을 활성화해요.

이 예시는 Bucket owner enforced 설정을 사용하는 대상 버킷에서는 작동하지 않아요. 대상(타깃) 버킷이 Object Ownership에 Bucket owner enforced 설정을 사용하면 버킷이나 객체 ACL을 설정할 수 없어요. 또한 PutBucketLogging 구성에 대상(타깃) 부여를 포함할 수도 없어요. 로깅 서비스 보안 주체(logging.s3.amazonaws.com)에 접근을 부여하려면 버킷 정책을 사용해야 해요. 자세한 내용은 "로그 전달 권한"을 참고하세요.

.NET — 다음 C# 예시는 Amazon S3 버킷에 로깅을 활성화하는 방법을 보여줘요.

using System;
using System.IO;
using System.Threading.Tasks;
using Amazon.S3;
using Amazon.S3.Model;
using Microsoft.Extensions.Configuration;

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"];

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

    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 + @""" }
                                    }
                                }]
                            }";
        PutBucketPolicyRequest putRequest = new PutBucketPolicyRequest
        {
            BucketName = logBucketName,
            Policy = newPolicy,
        };
        await client.PutBucketPolicyAsync(putRequest);
        Console.WriteLine("Policy applied.");
    }

    public static async Task EnableLoggingAsync(
        IAmazonS3 client,
        string bucketName,
        string logBucketName,
        string logObjectKeyPrefix)
    {
        var loggingConfig = new S3BucketLoggingConfig
        {
            TargetBucketName = logBucketName,
            TargetPrefix = logObjectKeyPrefix,
        };
        var putBucketLoggingRequest = new PutBucketLoggingRequest
        {
            BucketName = bucketName,
            LoggingConfig = loggingConfig,
        };
        await client.PutBucketLoggingAsync(putBucketLoggingRequest);
    }

    public static void LoadConfig()
    {
        _configuration = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("settings.json")
            .AddJsonFile("settings.local.json", true)
            .Build();
    }
}

API 세부 정보는 AWS SDK for .NET API Reference의 PutBucketLogging을 참고하세요.

Java — 다음 Java 예시는 대상 S3 버킷에 버킷 정책을 설정하고 소스 S3 버킷에 서버 접근 로깅을 활성화해요.

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;

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/";

        s3Client = S3Client.builder().
                region(Region.US_EAST_2)
                .build();

        ServerAccessLogging serverAccessLogging = new ServerAccessLogging();
        serverAccessLogging.setTargetBucketPolicy(sourceAccountId, sourceBucketName, targetBucketName);
        serverAccessLogging.enableServerAccessLogging(sourceBucketName, targetBucketName, targetPrefix);
    }

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

    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 리전에 전용 로깅 버킷을 만든 다음 Amazon S3 접근 로그가 그 S3 버킷으로 전달되도록 할 것을 권장해요. 자세한 내용과 예시는 AWS CLI Reference의 put-bucket-logging을 참고하세요.

예시 — 두 리전의 다섯 버킷으로 접근 로그 활성화

이 예시에서 다음 다섯 버킷이 있어요.

  • amzn-s3-demo-source-bucket-us-east-1
  • amzn-s3-demo-source-bucket1-us-east-1
  • amzn-s3-demo-source-bucket2-us-east-1
  • amzn-s3-demo-bucket1-us-west-2
  • amzn-s3-demo-bucket2-us-west-2

참고: 다음 절차의 마지막 단계는 로깅 버킷을 만들고 이 버킷에 서버 접근 로깅을 활성화하는 데 사용할 수 있는 예시 bash 스크립트를 제공해요. 이 스크립트를 사용하려면 다음 절차에서 설명한 대로 policy.json과 logging.json 파일을 만들어야 해요.

  1. US West(Oregon)와 US East(N. Virginia) 리전에 로깅 대상 버킷 두 개를 만들고 다음 이름을 지정합니다.
    • amzn-s3-demo-destination-bucket-logs-us-east-1
    • amzn-s3-demo-destination-bucket1-logs-us-west-2
  2. 이후 단계에서 서버 접근 로깅을 다음과 같이 활성화합니다.
    • amzn-s3-demo-source-bucket-us-east-1은 접두사 amzn-s3-demo-source-bucket-us-east-1로 S3 버킷 amzn-s3-demo-destination-bucket-logs-us-east-1에 로깅합니다.
    • amzn-s3-demo-source-bucket1-us-east-1은 접두사 amzn-s3-demo-source-bucket1-us-east-1로 S3 버킷 amzn-s3-demo-destination-bucket-logs-us-east-1에 로깅합니다.
    • amzn-s3-demo-source-bucket2-us-east-1은 접두사 amzn-s3-demo-source-bucket2-us-east-1로 S3 버킷 amzn-s3-demo-destination-bucket-logs-us-east-1에 로깅합니다.
    • amzn-s3-demo-bucket1-us-west-2는 접두사 amzn-s3-demo-bucket1-us-west-2로 S3 버킷 amzn-s3-demo-destination-bucket1-logs-us-west-2에 로깅합니다.
    • amzn-s3-demo-bucket2-us-west-2는 접두사 amzn-s3-demo-bucket2-us-west-2로 S3 버킷 amzn-s3-demo-destination-bucket1-logs-us-west-2에 로깅합니다.
  3. 각 로깅 대상 버킷에 대해 버킷 ACL 또는 버킷 정책으로 서버 접근 로그 전달 권한을 부여합니다.
    • 버킷 정책 업데이트(권장) — 로깅 서비스 보안 주체에 권한을 부여하려면 다음 put-bucket-policy 명령을 사용합니다. amzn-s3-demo-destination-bucket-logs를 대상 버킷 이름으로 바꿉니다.
aws s3api put-bucket-policy --bucket amzn-s3-demo-destination-bucket-logs --policy file://policy.json

policy.json은 현재 폴더에 다음 버킷 정책이 포함된 JSON 문서예요. 이 버킷 정책을 사용하려면 user input placeholders를 자신의 정보로 바꾸세요. 다음 정책에서 amzn-s3-demo-destination-bucket-logs는 서버 접근 로그가 전달될 대상 버킷이고, amzn-s3-demo-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:::amzn-s3-demo-destination-bucket-logs/*",
            "Condition": {
                "ArnLike": {
                    "aws:SourceArn": "arn:aws:s3:::amzn-s3-demo-source-bucket"
                },
                "StringEquals": {
                    "aws:SourceAccount": "SOURCE-ACCOUNT-ID"
                }
            }
        }
    ]
}
  • 버킷 ACL 업데이트 — S3 로그 전달 그룹에 권한을 부여하려면 다음 put-bucket-acl 명령을 사용합니다. amzn-s3-demo-destination-bucket-logs를 대상(타깃) 버킷 이름으로 바꿉니다.
aws s3api put-bucket-acl --bucket amzn-s3-demo-destination-bucket-logs  --grant-write URI=http://acs.amazonaws.com/groups/s3/LogDelivery --grant-read-acp URI=http://acs.amazonaws.com/groups/s3/LogDelivery
  1. 그런 다음 로깅 구성이 포함된 logging.json 파일을 만듭니다(다음 세 예시 중 하나를 기반으로). logging.json 파일을 만든 후 다음 put-bucket-logging 명령으로 로깅 구성을 적용합니다. amzn-s3-demo-destination-bucket-logs를 대상(타깃) 버킷 이름으로 바꿉니다.
aws s3api put-bucket-logging --bucket amzn-s3-demo-destination-bucket-logs --bucket-logging-status file://logging.json

참고: 각 대상 버킷의 로깅 구성을 적용하기 위해 이 put-bucket-logging 명령을 사용하는 대신 다음 단계에서 제공되는 bash 스크립트 중 하나를 사용할 수 있어요. 이 스크립트를 사용하려면 이 절차에서 설명한 대로 policy.json과 logging.json 파일을 만들어야 해요. logging.json 파일은 현재 폴더의 로깅 구성이 포함된 JSON 문서예요. 대상 버킷이 Object Ownership에 Bucket owner enforced 설정을 사용하면 로깅 구성에 대상(타깃) 부여가 포함될 수 없어요. 자세한 내용은 "로그 전달 권한"을 참고하세요.

  • 대상(타깃) 부여가 없는 logging.json 예시 — 다음 예시 logging.json 파일에는 대상(타깃) 부여가 없어요. 따라서 이 구성을 Object Ownership에 Bucket owner enforced 설정을 사용하는 대상(타깃) 버킷에 적용할 수 있어요.
  {
      "LoggingEnabled": {
          "TargetBucket": "amzn-s3-demo-destination-bucket-logs",
          "TargetPrefix": "amzn-s3-demo-destination-bucket/"
       }
   }
  • 대상(타깃) 부여가 있는 logging.json 예시 — 다음 예시 logging.json 파일에는 대상(타깃) 부여가 있어요. 대상 버킷이 Object Ownership에 Bucket owner enforced 설정을 사용하면 PutBucketLogging 구성에 대상(타깃) 부여를 포함할 수 없어요. 자세한 내용은 "로그 전달 권한"을 참고하세요.
  {
      "LoggingEnabled": {
          "TargetBucket": "amzn-s3-demo-destination-bucket-logs",
          "TargetPrefix": "amzn-s3-demo-destination-bucket/",
          "TargetGrants": [
               {
                  "Grantee": {
                      "Type": "CanonicalUser",
                      "ID": "79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be"
                   },
                  "Permission": "FULL_CONTROL"
               }
           ]
       }
   }
  • 수혜자(Grantee) 값 — (요청 요소로) 접근 권한을 부여하는 사람(수혜자)을 다음 방식으로 지정할 수 있어요.
    • 사람의 ID로:
{
  "Grantee": {
    "Type": "CanonicalUser",
    "ID": "ID"
  }
}
 - URI로:
{
  "Grantee": {
    "Type": "Group",
    "URI": "http://acs.amazonaws.com/groups/global/AuthenticatedUsers"
  }
}
  • 로그 객체 키 형식을 S3 이벤트 시간으로 설정한 logging.json 예시 — 다음 logging.json 파일은 로그 객체 키 형식을 S3 이벤트 시간으로 바꿔요.
  {
    "LoggingEnabled": {
        "TargetBucket": "amzn-s3-demo-destination-bucket-logs",
        "TargetPrefix": "amzn-s3-demo-destination-bucket/",
        "TargetObjectKeyFormat": {
            "PartitionedPrefix": {
                "PartitionDateSource": "EventTime"
            }
         }
    }
}
  1. 다음 bash 스크립트 중 하나를 사용해 계정의 모든 버킷에 접근 로깅을 추가합니다. amzn-s3-demo-destination-bucket-logs를 대상(타깃) 버킷 이름으로, us-west-2를 버킷이 있는 리전 이름으로 바꿉니다.

참고: 이 스크립트는 모든 버킷이 같은 리전에 있을 때만 작동해요. 여러 리전에 버킷이 있다면 스크립트를 조정해야 해요.

버킷 정책으로 접근을 부여하고 계정의 버킷에 로깅 추가 — 예시

loggingBucket='amzn-s3-demo-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
    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='amzn-s3-demo-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
    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 S3 요청 메트릭으로 Amazon CloudWatch 알람을 설정해 로그 전달을 자동으로 확인할 수도 있습니다. 자세한 내용은 "Amazon CloudWatch로 메트릭 모니터링"을 참고하세요.
  • 로그 파일의 내용을 열고 읽을 수 있는지 확인합니다.

서버 접근 로깅 문제 해결 정보는 "서버 접근 로깅 문제 해결"을 참고하세요.

더 알아보기 (Learn more)