AWS/Project

여러 Account 및 VPC에서 S3 공유(로그 중앙화)

jih0ssang 2024. 1. 5. 23:15

참고 사이트

https://docs.aws.amazon.com/ko_kr/elasticloadbalancing/latest/application/enable-access-logging.html

https://docs.aws.amazon.com/ko_kr/elasticloadbalancing/latest/network/load-balancer-access-logs.html

여러 Account 및 VPC에서 S3 공유(로그 중앙화)

여러 Account 및 VPC에서

각 AWS Config 및 CloudTrail, VPC FlowLog, ELB Log가 수집한 로그를 

중앙 계정의 S3에 쌓도록 로그 중앙화 하는 과정이다.

 

S3는 같은 리전 내 고유한 버킷명을 가지고 있어서

환경별 계정의 IAM Role을 주지 않아도 식별이 가능한 것 같다.

(그전까지 IAM Role까지 수정했던 나 ㅠ.ㅠ)

 

중앙 계정에서 위치한 S3 버킷 Policy를 수정해서

환경별 계정의 각 AWS Config 및 CloudTrail, VPC FlowLog, ELB Log가 S3 버킷에 접근 권한을 부여하도록 한다.

 

서브 계정에서 로그 생성 시, 로그 쌓는 S3 버킷란에 중앙 계정에서 생성한 S3 버킷명을 기입한다.

 

Principal(주체)가 AWS Config 일 경우, Policy

	{
            "Sid": "AWSConfigBucketExistenceCheck",
            "Effect": "Allow",
            "Principal": {
                "Service": "config.amazonaws.com"
            },
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::BucketName",
            "Condition": {
                "StringEquals": {
                    "AWS:SourceAccount": [
                        "AWS-Account-ID-1",
                        "AWS-Account-ID-2",
                        "AWS-Account-ID-3",
                        "AWS-Account-ID-4"
                    ]
                }
            }
        },
        {
            "Sid": "AWSConfigBucketDelivery",
            "Effect": "Allow",
            "Principal": {
                "Service": "config.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::BucketName/prefix/*",
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": "bucket-owner-full-control",
                    "AWS:SourceAccount": [
                        "AWS-Account-ID-1",
                        "AWS-Account-ID-2",
                        "AWS-Account-ID-3",
                        "AWS-Account-ID-4"
                    ]
                }
            }
        }
    ]
}

 

Principal(주체)가 AWS VPC Flowlog 일 경우, Policy

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AWSLogDeliveryWrite",
            "Effect": "Allow",
            "Principal": {
                "Service": "delivery.logs.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": [
                "arn:aws:s3:::BucketName/prefix/AWS-Account-ID-1/*",
                "arn:aws:s3:::BucketName/prefix/AWS-Account-ID-2/*",
                "arn:aws:s3:::BucketName/prefix/AWS-Account-ID-3/*",
                "arn:aws:s3:::BucketName/prefix/AWS-Account-ID-4/*"
            ]
        },
        {
            "Sid": "AWSLogDeliveryAclCheck",
            "Effect": "Allow",
            "Principal": {
                "Service": "delivery.logs.amazonaws.com"
            },
            "Action": [
                "s3:GetBucketAcl",
                "s3:ListBucket"
            ],
            "Resource": "arn:aws:s3:::BucketName"
        }
    ]
}

 

 

Principal(주체)가 AWS CloudTrail 일 경우, Policy

"Principal": {
                "Service": "cloudtrail.amazonaws.com"

}

 

이 이후에도 주체만 바뀌고 접근 권한 부여하는 내용은 동일하다. 

 

Principal(주체)가 AWS ELB Log일 경우, Policy

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "delivery.logs.amazonaws.com",
                "AWS": "arn:aws:iam::600734575887:root"
            },
            "Action": "s3:PutObject",
            "Resource": [
                "arn:aws:s3:::BucketName/prefix/AWS-Account-ID-1/*",
                "arn:aws:s3:::BucketName/prefix/AWS-Account-ID-2/*",
                "arn:aws:s3:::BucketName/prefix/AWS-Account-ID-3/*",
                "arn:aws:s3:::BucketName/prefix/AWS-Account-ID-4/*"
            ],
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": "bucket-owner-full-control",
                    "aws:SourceAccount": "AWS-Account-ID-1"
                },
                "ArnLike": {
                    "aws:SourceArn": "arn:aws:logs:ap-northeast-2:AWS-Account-ID-1:*"
                }
            }
        },
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "delivery.logs.amazonaws.com",
                "AWS": "arn:aws:iam::600734575887:root"
            },
            "Action": [
                "s3:GetBucketAcl",
                "s3:ListBucket"
            ],
            "Resource": "arn:aws:s3::BucketName",
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "AWS-Account-ID-1"
                },
                "ArnLike": {
                    "aws:SourceArn": "arn:aws:logs:ap-northeast-2:AWS-Account-ID-1:*"
                }
            }
        }
    ]
}

  

"Principal": {
                "Service": "delivery.logs.amazonaws.com",
                "AWS": "arn:aws:iam::600734575887:root"
}

 

ELB 액세스 로그 수집

ELB 액세스 로그 수집은 살짝 특별하다.

 

S3 Policy 수정

Principal(주체)가 리전의 Elastic Load Balancing에 대한 AWS 계정의 ID가 되어야 한다.

서울 리전(ap-northeast-2)의 elb-account-id는 600734575887이다.

 

 

TLS 리스너 존재

TLS 리스너가 있는 로드밸런서 액세스 로그만 생성 및 수집이 된다.

그래서 ALB는 액세스 로그가 수집이 되지만 NLB는 TLS 리스너인 경우만 수집이 가능하다. (TCP, UDP 수집 불가 !! )