

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 設定 VPC 流程日誌以進行跨 的集中化 AWS 帳戶
<a name="configure-vpc-flow-logs-for-centralization-across-aws-accounts"></a>

*Benjamin Morris 和 Aman Kaur Gandhi，Amazon Web Services*

## 總結
<a name="configure-vpc-flow-logs-for-centralization-across-aws-accounts-summary"></a>

在 AWS 虛擬私有雲端 (VPC) 中，VPC 流程日誌功能可以提供有用的資料，以進行操作和安全性疑難排解。不過，在多帳戶環境中使用 VPC 流程日誌會有限制。具體而言，不支援來自 Amazon CloudWatch Logs 的跨帳戶流程日誌。反之，您可以使用適當的儲存貯體政策設定 Amazon Simple Storage Service (Amazon S3) 儲存貯體，以集中管理日誌。

**注意**  
此模式討論將流程日誌傳送至集中位置的需求。不過，如果您也希望日誌可在成員帳戶中於本機使用，您可以為每個 VPC 建立多個流程日誌。無法存取 Log Archive 帳戶的使用者可以看到流量日誌以進行疑難排解。或者，您可以為將日誌傳送至 CloudWatch Logs 的每個 VPC 設定單一流程日誌。然後，您可以使用 Amazon Data Firehose 訂閱篩選條件，將日誌轉送至 S3 儲存貯體。如需詳細資訊，請參閱[相關資源](#configure-vpc-flow-logs-for-centralization-across-aws-accounts-resources)一節。

## 先決條件和限制
<a name="configure-vpc-flow-logs-for-centralization-across-aws-accounts-prereqs"></a>

**先決條件 **
+ 作用中 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 的客戶受管金鑰。

## Architecture
<a name="configure-vpc-flow-logs-for-centralization-across-aws-accounts-architecture"></a>

**目標架構**

在下圖中，每個 VPC 部署了兩個流程日誌。一個 會將日誌傳送至本機 CloudWatch Logs 群組。另一個 會將日誌傳送至集中式日誌帳戶中的 S3 儲存貯體。儲存貯體政策允許日誌交付服務將日誌寫入儲存貯體。

**注意**  
截至 2023 年 11 月， AWS 現在支援 [aws：SourceOrgID 條件金鑰](https://aws.amazon.com/about-aws/whats-new/2023/11/organization-wide-iam-condition-keys-restrict-aws-service-to-service-requests/)。此條件可讓您拒絕寫入 AWS Organizations 組織外部帳戶的集中式儲存貯體。

![每個 VPC 都會有一個流程日誌將日誌傳送至 CloudWatch，另一個則將日誌傳送至 S3 儲存貯體。](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/718c29f4-a035-47ab-9c58-bd7d5c1ca77e/images/0b502d82-a6ce-4832-b854-99181d2ed834.png)


**自動化和擴展**

每個 VPC 都設定為將日誌傳送至中央記錄帳戶中的 S3 儲存貯體。使用下列其中一個自動化解決方案，以協助確保流程日誌設定正確：
+ [CloudFormation StackSets](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/what-is-cfnstacksets.html)
+ [AWS Control Tower Terraform 帳戶工廠 (AFT)](https://docs.aws.amazon.com/controltower/latest/userguide/taf-account-provisioning.html)
+ [具有修復的 AWS Config 規則](https://aws.amazon.com/blogs/mt/how-to-enable-vpc-flow-logs-automatically-using-aws-config-rules/)

## 工具
<a name="configure-vpc-flow-logs-for-centralization-across-aws-accounts-tools"></a>

**工具**
+ [Amazon CloudWatch Logs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html) 可協助您集中所有系統、應用程式的日誌， AWS 服務 以便您可以監控日誌並將其安全地存檔。
+ [Amazon Simple Storage Service (Amazon S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) 是一種雲端型物件儲存服務，可協助您儲存、保護和擷取任何數量的資料。
+ [Amazon Virtual Private Cloud (Amazon VPC)](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html) 可協助您在已定義的虛擬網路中啟動 AWS 資源。此虛擬網路與您在自己的資料中心中操作的傳統網路相似，且具備使用 AWS可擴展基礎設施的優勢。此模式使用 [VPC 流程日誌](https://docs.aws.amazon.com/vpc/latest/userguide/flow-logs.html)功能來擷取進出 VPC 網路介面之 IP 流量的相關資訊。

## 最佳實務
<a name="configure-vpc-flow-logs-for-centralization-across-aws-accounts-best-practices"></a>

使用基礎設施做為程式碼 (IaC) 可大幅簡化 VPC 流程日誌部署程序。抽象 VPC 部署定義以包含流程日誌資源建構，會自動使用流程日誌部署您的 VPCs。這會在下一節中示範。

**集中式流程日誌**

將集中式流程日誌新增至 HashiCorp Terraform 中 VPC 模組的範例語法：此程式碼會建立流程日誌，將日誌從 VPC 傳送至集中式 S3 儲存貯體。請注意，此模式不包含 S3 儲存貯體的建立。如需建議的儲存貯體政策陳述式，請參閱[其他資訊](#configure-vpc-flow-logs-for-centralization-across-aws-accounts-additional)一節。

```
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.
}
```

如需自訂日誌格式的詳細資訊，請參閱 [Amazon VPC 文件](https://docs.aws.amazon.com/vpc/latest/userguide/flow-log-records.html#flow-logs-custom)。

**本機流程日誌**

將本機流程日誌新增至 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
}
```

## 史詩
<a name="configure-vpc-flow-logs-for-centralization-across-aws-accounts-epics"></a>

### 部署 VPC 流程日誌基礎設施
<a name="deploy-vpc-flow-logs-infrastructure"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 決定加密策略，並建立中央 S3 儲存貯體的政策。 | 中央儲存貯體不支援 AWS KMS `aws/s3`金鑰，因此您必須使用 SSE-S3 或 AWS KMS 客戶受管金鑰。如果您使用 AWS KMS 金鑰，金鑰政策必須允許成員帳戶使用 金鑰。 | 合規 | 
| 建立中央流程日誌儲存貯體。 | 建立流程日誌將傳送到的中央儲存貯體，並套用您在上一個步驟中選擇的加密策略。這應該位於 Log Archive 或類似用途的帳戶中。<br />從[其他資訊](#configure-vpc-flow-logs-for-centralization-across-aws-accounts-additional)區段取得儲存貯體政策，並在使用環境特定值更新預留位置後將其套用至您的中央儲存貯體。 | 一般 AWS | 
| 設定 VPC 流程日誌將日誌傳送至中央流程日誌儲存貯體。 | 將流程日誌新增至您要從中收集資料的每個 VPC。最可擴展的方式是使用 AFT 或 等 IaC 工具 AWS Cloud Development Kit (AWS CDK)。例如，您可以建立 Terraform 模組，將 VPC 與流程日誌一起部署。如有必要，您可以手動新增流程日誌。 | 網路管理員 | 
| 設定要傳送至本機 CloudWatch Logs 的 VPC 流程日誌。 | （選用） 如果您希望流程日誌顯示在產生日誌的帳戶中，請建立另一個流程日誌，將資料傳送至本機帳戶中的 CloudWatch Logs。或者，您可以將資料傳送至本機帳戶中的帳戶特定 S3 儲存貯體。 | 一般 AWS | 

## 相關資源
<a name="configure-vpc-flow-logs-for-centralization-across-aws-accounts-resources"></a>
+ [如何使用集中式流程日誌資料來促進資料分析和滿足安全需求 ](https://aws.amazon.com/blogs/security/how-to-facilitate-data-analysis-and-fulfill-security-requirements-by-using-centralized-flow-log-data/)(AWS 部落格文章）
+ [如何使用 AWS Config 規則自動啟用 VPC 流程日誌 ](https://aws.amazon.com/blogs/mt/how-to-enable-vpc-flow-logs-automatically-using-aws-config-rules/)(AWS 部落格文章）

## 其他資訊
<a name="configure-vpc-flow-logs-for-centralization-across-aws-accounts-additional"></a>

**儲存貯體政策**

在您新增預留位置名稱的值之後，此儲存貯體政策範例可以套用至流量日誌的中央 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"
                }
            }
        }
    ]
}
```