계정 간 AWS 중앙 집중화를 위한 VPC 플로우 로그 구성 - AWS 권장 가이드

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

계정 간 AWS 중앙 집중화를 위한 VPC 플로우 로그 구성

작성자: 벤자민 모리스 (AWS) 와 아만 카우르 간디 () AWS

환경: 프로덕션

기술: 관리 및 거버넌스

AWS서비스: 아마존 S3, 아마존 VPC

요약

Amazon Web Services (AWS) 가상 사설 클라우드 (VPC) 에서 VPC Flow Logs 기능은 운영 및 보안 문제 해결에 유용한 데이터를 제공할 수 있습니다. 하지만 다중 계정 환경에서 VPC 플로우 로그를 사용하는 데에는 제한이 있습니다. 특히 Amazon Logs의 계정 간 흐름 CloudWatch 로그는 지원되지 않습니다. 대신 적절한 버킷 정책으로 Amazon Simple Storage Service(S3) 버킷을 구성하여 로그를 중앙 집중화할 수 있습니다.

참고: 이 패턴은 흐름 로그를 중앙 위치로 전송하기 위한 요구 사항을 설명합니다. 하지만 멤버 계정에서도 로그를 로컬로 사용할 수 있도록 하려면 VPC 각각에 대해 여러 흐름 로그를 만들 수 있습니다. Log Archive 계정에 액세스할 수 없는 사용자는 문제 해결을 위해 트래픽 로그를 볼 수 있습니다. 또는 로그로 로그를 보내는 CloudWatch 각 VPC 플로우 로그를 하나씩 구성할 수도 있습니다. 그런 다음 Amazon Data Firehose 구독 필터를 사용하여 로그를 S3 버킷으로 전달할 수 있습니다. 자세한 내용은 관련 리소스 섹션을 참조하세요.

사전 조건 및 제한 사항

사전 조건

  • 활성 계정 AWS

  • 로그를 중앙 집중화하는 데 사용되는 계정을 가진 Organizations AWS 조직 (예: Log Archive)

제한 사항

AWS키 관리 서비스 (AWSKMS) 관리 키를 사용하여 중앙 버킷을 aws/s3 암호화하는 경우 다른 계정으로부터 로그를 수신하지 않습니다. 대신 다음과 같은 오류가 표시됩니다.

"Unsuccessful": [ { "Error": { "Code": "400", "Message": "LogDestination: <bucketName> is undeliverable" }, "ResourceId": "vpc-1234567890123456" } ]

계정의 AWS 관리 키를 계정 간에 공유할 수 없기 때문입니다.

해결 방법은 Amazon S3 관리 암호화 (SSE-S3) 또는 회원 계정과 공유할 수 있는 AWS KMS 고객 관리 키를 사용하는 것입니다.

아키텍처

대상 기술 스택

다음 다이어그램에는 VPC 각각에 대해 두 개의 흐름 로그가 배포되어 있습니다. 하나는 로컬 로그 그룹에 CloudWatch 로그를 전송합니다. 다른 하나는 중앙 로깅 계정의 S3 버킷으로 로그를 전송합니다. 버킷 정책은 로그 전송 서비스가 버킷에 로그를 기록할 수 있도록 허용합니다.

참고: 2023년 11월부터 AWS 이제 aws: SourceOrg ID 조건 키를 지원합니다. 이 조건을 사용하면 AWS Organizations 조직 외부 계정의 중앙 집중식 버킷에 대한 쓰기를 거부할 수 있습니다.

대상 아키텍처 

각각의 VPC 흐름 로그에서 S3 버킷으로 로그를 CloudWatch 보내고 하나의 흐름 로그에서 S3 버킷으로 로그를 보냅니다.

자동화 및 규모 조정

VPC각각은 중앙 로깅 계정의 S3 버킷으로 로그를 전송하도록 구성되어 있습니다. 다음 자동화 솔루션 중 하나를 사용하면 흐름 로그가 적절하게 구성되도록 할 수 있습니다.

도구

도구

  • Amazon CloudWatch Logs를 사용하면 모든 시스템, 애플리케이션 및 AWS 서비스의 로그를 중앙 집중화하여 로그를 모니터링하고 안전하게 보관할 수 있습니다.

  • Amazon Simple Storage Service(S3)는 원하는 양의 데이터를 저장, 보호 및 검색하는 데 도움이 되는 클라우드 기반 객체 스토리지 서비스입니다.

  • Amazon Virtual Private Cloud (AmazonVPC) 를 사용하면 사용자가 정의한 가상 네트워크로 AWS 리소스를 시작할 수 있습니다. 이 가상 네트워크는 자체 데이터 센터에서 운영하는 기존 네트워크와 비슷하지만 확장 가능한 인프라를 사용할 수 있다는 장점이 있습니다. AWS 이 패턴은 VPC플로우 로그 기능을 사용하여 사용자 VPC 네트워크 인터페이스에서 송수신되는 IP 트래픽에 대한 정보를 캡처합니다.

모범 사례

코드형 인프라 (IaC) 를 사용하면 VPC 플로우 로그 배포 프로세스를 크게 단순화할 수 있습니다. 흐름 로그 리소스 구조를 포함하도록 VPC 배포 정의를 추상화하면 VPCs with 흐름 로그가 자동으로 배포됩니다. 이 내용은 다음 섹션에서 설명합니다.

중앙 집중식 흐름 로그

Terraform의 VPC 모듈에 HashiCorp 중앙 집중식 흐름 로그를 추가하기 위한 예제 구문

이 코드는 a에서 중앙 집중식 S3 버킷으로 VPC 로그를 보내는 흐름 로그를 생성합니다. 참고로 이 패턴에는 S3 버킷 생성이 포함되지 않습니다.

권장 버킷 정책 설명은 추가 정보 섹션을 참조하세요.

variable "vpc_id" { type = string description = "ID of the VPC for which you want to create a Flow Log" } locals { # For more details: https://docs.aws.amazon.com/vpc/latest/userguide/flow-logs.html#flow-logs-custom custom_log_format_v5 = "$${version} $${account-id} $${interface-id} $${srcaddr} $${dstaddr} $${srcport} $${dstport} $${protocol} $${packets} $${bytes} $${start} $${end} $${action} $${log-status} $${vpc-id} $${subnet-id} $${instance-id} $${tcp-flags} $${type} $${pkt-srcaddr} $${pkt-dstaddr} $${region} $${az-id} $${sublocation-type} $${sublocation-id} $${pkt-src-aws-service} $${pkt-dst-aws-service} $${flow-direction} $${traffic-path}" } resource "aws_flow_log" "centralized" { log_destination = "arn:aws:s3:::centralized-vpc-flow-logs-<log_archive_account_id>" # Optionally, a prefix can be added after the ARN. log_destination_type = "s3" traffic_type = "ALL" vpc_id = var.vpc_id log_format = local.custom_log_format_v5 # If you want fields from VPC Flow Logs v3+, you will need to create a custom log format. tags = { Name = "centralized_flow_log" } }

로컬 플로우 로그

필요한 권한을 사용하여 Terraform의 VPC 모듈에 로컬 흐름 로그를 추가하는 구문 예시

이 코드는 a에서 로컬 로그 그룹으로 로그를 보내는 흐름 CloudWatch 로그를 만듭니다. VPC

data "aws_region" "current" {} variable "vpc_id" { type = string description = "ID of the VPC for which you want to create a Flow Log" } resource "aws_iam_role" "local_flow_log_role" { name = "flow-logs-policy-${var.vpc_id }" assume_role_policy = <<EOF { "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "vpc-flow-logs.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } EOF } resource "aws_iam_role_policy" "logs_permissions" { name = "flow-logs-policy-${var.vpc_id}" role = aws_iam_role.local_flow_log_role.id policy = <<EOF { "Version": "2012-10-17", "Statement": [ { "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents", "logs:DescribeLogGroups", "logs:DescribeLogStreams", "logs:CreateLogDelivery", "logs:DeleteLogDelivery" ], "Effect": "Allow", "Resource": "arn:aws:logs:${data.aws_region.current.name}:*:log-group:vpc-flow-logs*" } ] } EOF } resource "aws_cloudwatch_log_group" "local_flow_logs" { # checkov:skip=CKV_AWS_338:local retention is set to 30, centralized S3 bucket can retain for long-term name = "vpc-flow-logs/${var.vpc_id}" retention_in_days = 30 } resource "aws_flow_log" "local" { iam_role_arn = aws_iam_role.local_flow_log_role.arn log_destination = aws_cloudwatch_log_group.local_flow_logs.arn traffic_type = "ALL" vpc_id = var.vpc_id tags = { Name = "local_flow_log" } }

에픽

작업설명필요한 기술

암호화 전략을 결정하고 중앙 S3 버킷에 대한 정책을 생성합니다.

중앙 버킷은 aws/s3 AWS KMS 키를 지원하지 않으므로 SSE -S3 또는 AWS KMS 고객 관리 키를 사용해야 합니다. AWSKMS키를 사용하는 경우 키 정책에 따라 구성원 계정이 키를 사용할 수 있도록 허용해야 합니다.

규정 준수

중앙 흐름 로그 버킷을 생성합니다.

흐름 로그를 전송할 중앙 버킷을 만들고 이전 단계에서 선택한 암호화 전략을 적용합니다. 이는 Log Archive 또는 이와 유사한 용도의 계정에 있어야 합니다.

추가 정보 섹션에서 버킷 정책을 가져와 환경별 값으로 플레이스홀더를 업데이트한 후 중앙 버킷에 적용합니다.

일반 AWS

중앙 VPC 흐름 로그 버킷으로 로그를 보내도록 흐름 로그를 구성합니다.

데이터를 VPC 수집하려는 각각에 흐름 로그를 추가합니다. 가장 확장 가능한 방법은 AFT 또는 AWS Cloud Development Kit (AWSCDK) 와 같은 IaC 도구를 사용하는 것입니다. 예를 들어 흐름 VPC 로그와 함께 배포하는 Terraform 모듈을 만들 수 있습니다. 필요한 경우 흐름 로그를 수동으로 추가합니다.

네트워크 관리자

로컬 로그로 전송하도록 VPC 플로우 로그를 구성하세요. CloudWatch

(선택 사항) 로그가 생성되는 계정에서 흐름 로그를 표시하려면 다른 흐름 로그를 만들어 로컬 계정의 CloudWatch 로그로 데이터를 보내십시오. 또는 로컬 계정의 계정별 S3 버킷으로 데이터를 보낼 수도 있습니다.

일반 AWS

관련 리소스

추가 정보

버킷 정책

이 버킷 정책 예제는 자리 표시자 이름에 값을 추가한 후 흐름 로그용 중앙 S3 버킷에 적용할 수 있습니다.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AWSLogDeliveryWrite", "Effect": "Allow", "Principal": { "Service": "delivery.logs.amazonaws.com" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::<BUCKET_NAME>/*", "Condition": { "StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control", "aws:SourceOrgID": "<ORG_ID>" } } }, { "Sid": "AWSLogDeliveryCheck", "Effect": "Allow", "Principal": { "Service": "delivery.logs.amazonaws.com" }, "Action": "s3:GetBucketAcl", "Resource": "arn:aws:s3:::<BUCKET_NAME>", "Condition": { "StringEquals": { "aws:SourceOrgID": "<ORG_ID>" } } }, { "Sid": "DenyUnencryptedTraffic", "Effect": "Deny", "Principal": { "AWS": "*" }, "Action": "s3:*", "Resource": [ "arn:aws:s3:::<BUCKET_NAME>/*", "arn:aws:s3:::<BUCKET_NAME>" ], "Condition": { "Bool": { "aws:SecureTransport": "false" } } } ] }