本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
設定 VPC 流程日誌以跨 AWS 帳戶集中化
由 Benjamin Morris (AWS) 和 Aman Kaur Gandhi (AWS) 建立
Summary
在 Amazon Web Services (AWS) 虛擬私有雲端 (VPC) 中,VPC 流程日誌功能可以提供有用的資料,以進行操作和安全性疑難排解。不過,在多帳戶環境中使用 VPC 流程日誌有其限制。具體而言,不支援來自 Amazon CloudWatch Logs 的跨帳戶流程日誌。反之,您可以使用適當的儲存貯體政策來設定 Amazon Simple Storage Service (Amazon S3) 儲存貯體,以集中管理日誌。
注意
此模式討論將流程日誌傳送至集中位置的需求。不過,如果您也希望日誌可在成員帳戶中於本機使用,您可以為每個 VPC 建立多個流程日誌。無法存取 Log Archive 帳戶的使用者可以查看流量日誌以進行故障診斷。或者,您可以為將日誌傳送至 CloudWatch Logs 的每個 VPC 設定單一流程日誌。然後,您可以使用 Amazon Data Firehose 訂閱篩選條件,將日誌轉送至 S3 儲存貯體。如需詳細資訊,請參閱相關資源一節。
先決條件和限制
先決條件
作用中的 AWS 帳戶
AWS Organizations 組織具有用於集中日誌的帳戶 (例如,Log Archive)
限制
如果您使用 AWS Key Management Service (AWS KMS) 受管金鑰aws/s3
來加密您的中央儲存貯體,則不會收到來自不同帳戶的日誌。反之,您會看到Unsuccessful
錯誤代碼 400,其中包含訊息,例如指定 "LogDestination: <bucketName> is undeliverable"
的 ResourceId
。
這是因為帳戶的 AWS 受管金鑰無法跨帳戶共用。
解決方案是使用 Amazon S3 受管加密 (SSE-S3) 或可與成員帳戶共用的 AWS KMS 客戶受管金鑰。
架構
目標技術堆疊
在下圖中,會為每個 VPC 部署兩個流程日誌。一個 會將日誌傳送至本機 CloudWatch Logs 群組。另一個 會將日誌傳送至集中式日誌帳戶中的 S3 儲存貯體。儲存貯體政策允許日誌交付服務將日誌寫入儲存貯體。
注意
截至 2023 年 11 月, AWS 現在支援 aws:SourceOrgID 條件金鑰
目標架構

自動化和擴展
每個 VPC 都設定為將日誌傳送至中央記錄帳戶中的 S3 儲存貯體。使用下列其中一個自動化解決方案,以協助確保流程日誌設定正確:
工具
工具
Amazon CloudWatch Logs 可協助您集中所有系統、應用程式和 AWS 服務的日誌,以便您可以監控日誌並將其安全地封存。
Amazon Simple Storage Service (Amazon S3) 是一種雲端型物件儲存服務,可協助您儲存、保護和擷取任何數量的資料。
Amazon Virtual Private Cloud (Amazon VPC) 可協助您在已定義的虛擬網路中啟動 AWS 資源。此虛擬網路類似於您在自己的資料中心內操作的傳統網路,具有使用可擴展的 AWS 基礎設施的優勢。此模式使用 VPC 流程日誌功能來擷取進出 VPC 中網路介面之 IP 流量的相關資訊。
最佳實務
使用基礎設施做為程式碼 (IaC) 可大幅簡化 VPC 流程日誌部署程序。抽象 VPC 部署定義以包含流程日誌資源建構,會自動使用流程日誌部署您的 VPCs。這會在下一節中示範。
集中式流程日誌
在 HashiCorp Terraform 中將集中式流程日誌新增至 VPC 模組的範例語法
此程式碼會建立流程日誌,將日誌從 VPC 傳送至集中式 S3 儲存貯體。請注意,此模式不包含 S3 儲存貯體的建立。
如需建議的儲存貯體政策陳述式,請參閱其他資訊一節。
variable "vpc_id" { type = string }
locals { 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_flow_log" {
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.
}
如需自訂日誌格式的詳細資訊,請參閱 AWS 文件。
本機流程日誌
將本機流程日誌新增至具有必要許可的 Terraform 中的 VPC 模組的範例語法
此程式碼會建立流程日誌,將日誌從 VPC 傳送至本機 CloudWatch Logs 群組。
data "aws_region" "current" {}
variable "vpc_id" { type = string }
resource "aws_iam_role" "local_flow_log_role" {
name = "flow-logs-policy-${var.vpc_id}"
assume_role_policy = <<EOF
{
"Version": "2012-10-17",
"Statement": [{
"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:CreateLog*", "logs:PutLogEvents", "logs:DescribeLog*", "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" {
name = "vpc-flow-logs/${var.vpc_id}"
retention_in_days = 30
}
resource "aws_flow_log" "local_flow_log" {
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
}
史詩
任務 | 描述 | 所需技能 |
---|---|---|
決定加密策略並建立中央 S3 儲存貯體的政策。 | 中央儲存貯體不支援 | 合規 |
建立中央流程日誌儲存貯體。 | 建立流量日誌要傳送到其中的中央儲存貯體,並套用您在上一個步驟中選擇的加密策略。這應該位於日誌封存或類似用途的帳戶中。 從其他資訊區段取得儲存貯體政策,並在使用環境特定值更新預留位置之後,將其套用至您的中央儲存貯體。 | 一般 AWS |
設定 VPC 流程日誌,將日誌傳送至中央流程日誌儲存貯體。 | 將流程日誌新增至您要收集資料的每個 VPC。最可擴展的方式是使用 AFT 或 AWS 雲端開發套件 (AWS CDK) 等 IaC 工具。例如,您可以建立 Terraform 模組,以部署 VPC 與流程日誌。如有必要,您可以手動新增流程日誌。 | 網路管理員 |
設定要傳送至本機 CloudWatch Logs 的 VPC 流程日誌。 | (選用) 如果您希望流程日誌顯示在產生日誌的帳戶中,請建立另一個流程日誌,將資料傳送至本機帳戶中的 CloudWatch Logs。或者,您可以將資料傳送至本機帳戶中的帳戶特定 S3 儲存貯體。 | 一般 AWS |
相關資源
如何使用集中式流程日誌資料來促進資料分析和滿足安全需求
(部落格文章) 如何使用 AWS Config 規則自動啟用 VPC 流程日誌
(部落格文章)
其他資訊
儲存貯體政策
在您新增預留位置名稱的值後,此儲存貯體政策範例可以套用至流量日誌的中央 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"
}
}
}
]
}