

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

# 設定指標的承載字符身分驗證
<a name="CloudWatch-OTLP-MetricsBearerTokenAuth"></a>

**注意**  
此頁面涵蓋 CloudWatch Metrics OTLP 端點的承載字符身分驗證。如需 CloudWatch Logs 承載字符身分驗證，請參閱*CloudWatch Logs 使用者指南*》中的[為日誌設定承載字符身分驗證](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_HTTP_Endpoints_BearerTokenAuth.html)。

在使用承載字符身分驗證與 CloudWatch OTLP 端點傳送指標之前，您需要：
+ 建立具有 CloudWatch Metrics 許可的 IAM 使用者
+ 產生服務特定的登入資料 (API 金鑰）

**重要**  
我們建議針對所有工作負載使用具有短期憑證的 SigV4 身分驗證，如果可以的話。SigV4 提供最強大的安全狀態。限制在短期憑證型身分驗證不可行的情況下使用 API 金鑰 （承載字符），例如從非AWS 環境、第三方供應商或不支援 AWS SDK 的平台傳送指標。當您準備好將 CloudWatch 指標納入具有更高安全需求的應用程式時，請切換到短期憑證。如需詳細資訊，請參閱《*IAM 使用者指南*》中的[長期存取金鑰的替代方案](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#bp-workloads-use-roles)。

**重要**  
CloudWatch OTLP 端點需要 TLS (HTTPS)。透過純 HTTP 傳送的承載字符請求會遭到拒絕。設定用戶端`https://monitoring.{{AWS Region}}.amazonaws.com/v1/metrics`時，請務必使用 。

## 選項 1：使用 AWS 主控台快速開始使用
<a name="CloudWatch-OTLP-MetricsBearerTokenAuth-QuickStart"></a>

 AWS 管理主控台提供簡化的工作流程，以產生 OTLP 端點存取的 API 金鑰。

**使用主控台設定 OTLP 端點存取**

1. 登入 AWS 管理主控台。

1. 導覽至 **CloudWatch** > **設定** > **全域**。

1. 在 API 金鑰區段中，選擇**產生 API 金鑰**。

1. 對於 **API 金鑰過期**，請執行下列其中一項操作：
   + 選取 API 金鑰過期持續時間為 **1**、**5**、**30**、**90** 或 **365** 天。
   + 選擇**自訂持續時間**以指定自訂 API 金鑰過期日期。
   + 選取**永不過期** （不建議）。

1. 選擇**產生 API 金鑰**。

主控台會自動：
+ 建立具有適當許可的新 IAM 使用者
+ 連接 [CloudWatchAPIKeyAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/CloudWatchAPIKeyAccess.html) 受管政策 （包含 `cloudwatch:PutMetricData`和 `cloudwatch:CallWithBearerToken`許可）
+ 產生服務特定的登入資料 (API 金鑰）

**儲存和驗證您的 API 金鑰**

1. 複製並安全地儲存顯示的登入資料：
   + **API 金鑰 ID** （服務特定的登入資料 ID)
   + **API 金鑰秘密** （承載字符）

   主控台也提供在產生期間將 API 金鑰直接存放在 [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) 的選項。如果您選擇儲存在 Secrets Manager 中，金鑰會在重設時自動更新，並在金鑰刪除時刪除。
**重要**  
立即儲存 API 金鑰秘密。您稍後無法擷取它。如果遺失，您必須產生新的 API 金鑰。

1. 傳送測試指標以驗證您的設定：

   ```
   curl -X POST "https://monitoring.us-east-1.amazonaws.com/v1/metrics" \
        -H "Content-Type: application/json" \
        -H "Authorization: Bearer {{YOUR_API_KEY}}" \
        -d '{"resourceMetrics":[]}'
   ```

## 選項 2：手動設定
<a name="CloudWatch-OTLP-MetricsBearerTokenAuth-ManualSetup"></a>

如果您偏好對 IAM 組態進行更多控制，或需要自訂許可，您可以手動設定 OTLP 端點存取。

### 步驟 1：建立 IAM 使用者
<a name="CloudWatch-OTLP-MetricsBearerTokenAuth-Step1"></a>

建立用於指標擷取的 IAM 使用者：

**為指標擷取建立 IAM 使用者**

1. 登入 AWS 管理主控台並導覽至 IAM。

1. 在左側導覽窗格中，選擇 **Users (使用者)**。

1. 選擇 **Create user** (建立使用者)。

1. 輸入使用者名稱 （例如 **cloudwatch-metrics-api-key-user**)。

1. 選擇**下一步**。

1. 連接下列其中一個 IAM 政策：

   **選項 A：使用 受管政策 （建議）**

   連接 [CloudWatchAPIKeyAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/CloudWatchAPIKeyAccess.html) 受管政策。

   **選項 B：建立自訂政策**

   建立並連接下列 IAM 政策：

   ```
   {
       "Version": "2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "CloudWatchMetricsAPIs",
               "Effect": "Allow",
               "Action": [
                   "cloudwatch:CallWithBearerToken",
                   "cloudwatch:PutMetricData"
               ],
               "Resource": "*"
           },
           {
               "Sid": "KMSDecryptForCMKDatasets",
               "Effect": "Allow",
               "Action": [
                   "kms:Decrypt"
               ],
               "Condition": {
                   "StringLike": {
                       "kms:ViaService": "cloudwatch.*.amazonaws.com",
                       "kms:EncryptionContext:aws:cloudwatch:arn": "arn:aws:cloudwatch:*:*:dataset/*"
                   }
               },
               "Resource": "arn:aws:kms:*:*:key/*"
           }
       ]
   }
   ```

1. 選擇**下一步**，然後選擇**建立使用者**。

**注意**  
如果您計劃將指標傳送至使用客戶受管 KMS 金鑰 (CMK) 的資料集，則需要 KMS 許可。這些條件限制 KMS 只能存取透過 CloudWatch 服務用於資料集資源的金鑰。

### 步驟 2：產生服務特定的登入資料 (API 金鑰）
<a name="CloudWatch-OTLP-MetricsBearerTokenAuth-Step2"></a>

使用 [CreateServiceSpecificCredential](https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateServiceSpecificCredential.html) API 產生 CloudWatch Metrics API 金鑰。您也可以使用 [create-service-specific-credential](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/create-service-specific-credential.html) AWS CLI 命令。對於憑證存留期，您可以指定介於 1–36600 天之間的值。如果您未指定登入資料存留期，API 金鑰不會過期。

若要產生過期 30 天的 API 金鑰：

```
aws iam create-service-specific-credential \
    --user-name cloudwatch-metrics-api-key-user \
    --service-name cloudwatch.amazonaws.com \
    --credential-age-days 30
```

回應是 [ServiceSpecificCredential](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ServiceSpecificCredential.html) 物件。`ServiceCredentialSecret` 值是您的 CloudWatch Metrics API 金鑰 （承載字符）。

**重要**  
安全地存放 `ServiceCredentialSecret`值。您稍後無法擷取它。如果遺失，您必須產生新的 API 金鑰。

### 步驟 3：傳送指標
<a name="CloudWatch-OTLP-MetricsBearerTokenAuth-Step3"></a>

您可以使用承載字符，立即將指標傳送至 OTLP 端點：

```
curl -X POST "https://monitoring.us-east-1.amazonaws.com/v1/metrics" \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer {{YOUR_API_KEY}}" \
     -d '{"resourceMetrics":[]}'
```

端點接受 `application/json`和 `application/x-protobuf`內容類型。

## 控制產生和使用 CloudWatch Metrics API 金鑰的許可
<a name="CloudWatch-OTLP-MetricsBearerTokenAuth-Permissions"></a>

### 控制 CloudWatch Metrics API 金鑰的產生
<a name="CloudWatch-OTLP-MetricsBearerTokenAuth-Permissions-Generation"></a>

[`iam:CreateServiceSpecificCredential`](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awsidentityandaccessmanagementiam.html#awsidentityandaccessmanagementiam-actions-as-permissions) 動作控制產生服務特定的金鑰 （例如 CloudWatch Metrics API 金鑰）。您可以將此動作的範圍限定為 IAM 使用者，以此限制可以為其產生金鑰的使用者。

您可以使用下列條件索引鍵，對 `iam:CreateServiceSpecificCredential` 動作的許可施加條件：
+ [`iam:ServiceSpecificCredentialAgeDays`](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_iam-condition-keys.html#ck_ServiceSpecificCredentialAgeDays) — 可讓您在條件中指定金鑰的過期時間，以天為單位。
+ [`iam:ServiceSpecificCredentialServiceName`](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_iam-condition-keys.html#ck_ServiceSpecificCredentialServiceName) — 可讓您在 條件中指定服務的名稱。

### 控制 CloudWatch Metrics API 金鑰的使用
<a name="CloudWatch-OTLP-MetricsBearerTokenAuth-Permissions-Usage"></a>

`cloudwatch:CallWithBearerToken` 動作控制 CloudWatch Metrics API 金鑰的使用。若要防止身分使用 CloudWatch Metrics API 金鑰，請將拒絕`cloudwatch:CallWithBearerToken`動作的政策連接至與金鑰相關聯的 IAM 使用者。

**注意**  
CloudWatch 指標的承載字符只能與 OTLP 指標擷取端點 () 搭配使用`https://monitoring.{{AWS Region}}.amazonaws.com/v1/metrics`。它們無法用來呼叫任何其他 CloudWatch API 或端點，包括查詢 APIs(`GetMetricData`、`ListMetrics`、`DescribeAlarms`)、PromQL 查詢端點、OTLP 追蹤端點或 OTLP 日誌端點。

### 政策範例
<a name="CloudWatch-OTLP-MetricsBearerTokenAuth-Permissions-Examples"></a>

**防止身分產生和使用 CloudWatch Metrics API 金鑰：**

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "DenyCWMetricsAPIKeys",
            "Effect": "Deny",
            "Action": [
                "iam:CreateServiceSpecificCredential",
                "cloudwatch:CallWithBearerToken"
            ],
            "Resource": "*"
        }
    ]
}
```

**警告**  
此政策可防止為所有 AWS 支援建立服務特定登入資料的 服務建立登入資料。如需詳細資訊，請參閱《[IAM 使用者指南》中的 IAM 使用者的服務特定憑證](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_service-specific-creds.html)。 **

**防止身分使用 CloudWatch Metrics API 金鑰：**

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Deny",
            "Action": "cloudwatch:CallWithBearerToken",
            "Resource": "*"
        }
    ]
}
```

**只有在 CloudWatch Metrics 金鑰在 90 天內過期時，才允許建立金鑰：**

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "iam:CreateServiceSpecificCredential",
            "Resource": "arn:aws:iam::123456789012:user/{{username}}",
            "Condition": {
                "StringEquals": {
                    "iam:ServiceSpecificCredentialServiceName": "cloudwatch.amazonaws.com"
                },
                "NumericLessThanEquals": {
                    "iam:ServiceSpecificCredentialAgeDays": "90"
                }
            }
        }
    ]
}
```

## 搭配 OpenTelemetry Collector 使用承載字符
<a name="CloudWatch-OTLP-MetricsBearerTokenAuth-Collector"></a>

使用承載字符時，您不需要 `sigv4auth`延伸。使用 [bearertokenauth](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/extension/bearertokenauthextension) 擴充功能，從檔案或環境變數安全地提供您的 API 金鑰：

```
extensions:
  bearertokenauth:
    filename: "/etc/otel/cw-api-key"

exporters:
  otlphttp:
    tls:
      insecure: false
    endpoint: https://monitoring.us-east-1.amazonaws.com/v1/metrics
    auth:
      authenticator: bearertokenauth

receivers:
  otlp:
    protocols:
      http:
        endpoint: 0.0.0.0:4318

processors:
  batch:
    send_batch_size: 200
    timeout: 10s

service:
  extensions: [bearertokenauth]
  pipelines:
    metrics:
      receivers: [otlp]
      processors: [batch]
      exporters: [otlphttp]
```

或者，您可以參考環境變數而非檔案：

```
extensions:
  bearertokenauth:
    token: "${env:CW_API_KEY}"
```

**重要**  
切勿直接在收集器組態檔案中硬式編碼 API 金鑰。組態檔案通常會遞交至版本控制或存放在部署資訊清單中。使用 從掛載的秘密`filename`讀取，或從您秘密管理員插入的環境變數`${env:VAR}`讀取。

**注意**  
使用承載字符身分驗證，您不需要`sigv4auth`副檔名、 AWS 憑證檔案、IAM 角色或 IRSA 組態。這可讓收集器組態在任何環境之間移動 AWS，包括內部部署或其他雲端提供者。

## 輪換 API 金鑰
<a name="CloudWatch-OTLP-MetricsBearerTokenAuth-Rotation"></a>

定期輪換 API 金鑰可降低未經授權的存取風險。建議您建立符合您組織安全政策的輪換排程。

### 輪換程序
<a name="CloudWatch-OTLP-MetricsBearerTokenAuth-Rotation-Process"></a>

若要在不中斷指標交付的情況下輪換 API 金鑰，請遵循下列程序：

**輪換 API 金鑰**

1. 為 IAM 使用者建立新的 （次要） 登入資料：

   ```
   aws iam create-service-specific-credential \
       --user-name cloudwatch-metrics-api-key-user \
       --service-name cloudwatch.amazonaws.com \
       --credential-age-days 90
   ```
**注意**  
IAM 每個服務允許每個 IAM 使用者最多 2 個服務特定的憑證。如果您已達到此限制，請在建立新登入資料之前刪除或停用舊登入資料。

1. （選用） 將新登入資料存放在 AWS Secrets Manager 中，以安全擷取和自動輪換。

1. 更新您的 OpenTelemetry Collector 組態或應用程式以使用新的 API 金鑰。

1. 將原始登入資料設定為非作用中：

   ```
   aws iam update-service-specific-credential \
       --user-name cloudwatch-metrics-api-key-user \
       --service-specific-credential-id {{ACCA1234EXAMPLE1234}} \
       --status Inactive
   ```

1. 確認指標交付不受影響。使用新金鑰傳送測試請求，並確認您收到 HTTP 200 回應。您也可以監控應用程式現有的 CloudWatch 指標，以確認資料持續送達。

1. 使用新金鑰確認成功交付後，請刪除先前的登入資料：

   ```
   aws iam delete-service-specific-credential \
       --service-specific-credential-id {{ACCA1234EXAMPLE1234}}
   ```

### 監控金鑰過期
<a name="CloudWatch-OTLP-MetricsBearerTokenAuth-Rotation-Monitoring"></a>

若要檢查現有 API 金鑰的建立日期和狀態，請使用 [list-service-specific-credentials](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/list-service-specific-credentials.html) 命令：

```
aws iam list-service-specific-credentials \
    --user-name cloudwatch-metrics-api-key-user \
    --service-name cloudwatch.amazonaws.com
```

回應包含每個登入`Status`資料的 `CreateDate`和 。使用此資訊來識別即將過期或已處於作用中狀態超過輪換政策允許的金鑰。

## 回應遭入侵的 API 金鑰
<a name="CloudWatch-OTLP-MetricsBearerTokenAuth-Compromised"></a>

如果您懷疑 API 金鑰已洩露，請立即採取下列步驟：

**回應遭入侵的 API 金鑰**

1. **立即停用金鑰**以防止進一步未經授權的使用：

   ```
   aws iam update-service-specific-credential \
       --user-name cloudwatch-metrics-api-key-user \
       --service-specific-credential-id {{ACCA1234EXAMPLE1234}} \
       --status Inactive
   ```

1. **檢閱 CloudTrail 日誌**以判斷未經授權的存取範圍。如需如何啟用 API 金鑰用量的稽核[使用 CloudTrail 記錄 API 金鑰用量](#CloudWatch-OTLP-MetricsBearerTokenAuth-CloudTrail)，請參閱 。

1. 依照中所述的輪換程序**建立替換金鑰**[輪換程序](#CloudWatch-OTLP-MetricsBearerTokenAuth-Rotation-Process)。

1. 取代完成後**刪除遭入侵的金鑰**：

   ```
   aws iam delete-service-specific-credential \
       --service-specific-credential-id {{ACCA1234EXAMPLE1234}}
   ```

1. 如果您需要在調查時立即封鎖 IAM 使用者的所有承載字符存取，請**連接拒絕政策**：

   ```
   {
       "Version": "2012-10-17",		 	 	 
       "Statement": {
           "Effect": "Deny",
           "Action": "cloudwatch:CallWithBearerToken",
           "Resource": "*"
       }
   }
   ```

**注意**  
若要透過 API 執行這些動作，您必須使用 AWS 登入資料進行身分驗證，而不是使用 CloudWatch Metrics API 金鑰進行身分驗證。承載字符只能用於指標擷取，不能用於 IAM 管理操作。

您也可以使用下列 IAM API 操作來管理遭到入侵的金鑰：
+ [ResetServiceSpecificCredential](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ResetServiceSpecificCredential.html) — 重設金鑰以產生新密碼，而不刪除登入資料。金鑰不得已過期。

## API 金鑰的安全最佳實務
<a name="CloudWatch-OTLP-MetricsBearerTokenAuth-BestPractices"></a>

請遵循以下最佳實務來保護您的 CloudWatch Metrics API 金鑰：
+ **切勿在原始程式碼中嵌入 API 金鑰。**請勿在應用程式碼、收集器組態檔案或版本控制系統中硬式編碼 API 金鑰。搭配 `filename`或 使用 `bearertokenauth`擴充功能`${env:VAR}`，在執行時間注入秘密。
+ **使用秘密管理員。**將 API 金鑰存放在 [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) 或同等的秘密管理解決方案中。這可啟用集中式存取控制、稽核記錄和自動輪換。
+ **在所有金鑰上設定過期。**建立 API 金鑰時，請務必指定`--credential-age-days`值。若要在整個組織中強制執行最長金鑰生命週期，請使用 IAM `iam:ServiceSpecificCredentialAgeDays` 條件金鑰。
+ **套用最低權限許可。**使用 受管 [CloudWatchAPIKeyAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/CloudWatchAPIKeyAccess.html) 政策做為起點，並視需要進一步限制。
+ **啟用 CloudTrail 記錄。**透過啟用 的 CloudTrail 資料事件來稽核 API 金鑰用量`AWS::CloudWatch::Dataset`。請參閱 [使用 CloudTrail 記錄 API 金鑰用量](#CloudWatch-OTLP-MetricsBearerTokenAuth-CloudTrail)。
+ **使用 IAM Access Analyzer 監控 。**使用 [IAM Access Analyzer](https://docs.aws.amazon.com/IAM/latest/UserGuide/what-is-access-analyzer.html) 識別未使用的登入資料，以及與您的 API 金鑰 IAM 使用者相關聯的過度寬鬆政策。
+ **定期輪換金鑰。**建立輪換排程並遵循中所述的程序[輪換 API 金鑰](#CloudWatch-OTLP-MetricsBearerTokenAuth-Rotation)。

## 使用 CloudTrail 記錄 API 金鑰用量
<a name="CloudWatch-OTLP-MetricsBearerTokenAuth-CloudTrail"></a>

您可以使用 AWS CloudTrail 記錄 CloudWatch Metrics OTLP 擷取的資料事件。CloudWatch 會針對對 OTLP 端點的呼叫發出`AWS::CloudWatch::Dataset`資料事件，讓您稽核指標擷取活動，包括 API 金鑰用量。

**注意**  
您為線索指定的 S3 儲存貯體必須具有允許 CloudTrail 將日誌檔案寫入其中的儲存貯體政策。如需詳細資訊，請參閱《[CloudTrail 使用者指南》中的 CloudTrail 的 Amazon S3 儲存貯體政策](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/create-s3-bucket-policy-for-cloudtrail.html)。 *AWS CloudTrail *

**為 CloudWatch Metrics API 金鑰使用啟用 CloudTrail 記錄 CloudWatch**

1. 建立線索：

   ```
   aws cloudtrail create-trail \
       --name cloudwatch-metrics-api-key-audit \
       --s3-bucket-name {{my-cloudtrail-bucket}} \
       --region us-east-1
   ```

1. 設定進階事件選取器以擷取 CloudWatch 指標寫入 （擷取） 資料事件：

   ```
   aws cloudtrail put-event-selectors \
       --region us-east-1 \
       --trail-name cloudwatch-metrics-api-key-audit \
       --advanced-event-selectors '[{
           "Name": "CloudWatch Metrics write data events",
           "FieldSelectors": [
               { "Field": "eventCategory", "Equals": ["Data"] },
               { "Field": "resources.type", "Equals": ["AWS::CloudWatch::Dataset"] },
               { "Field": "readOnly", "Equals": ["false"] }
           ]
       }]'
   ```

1. 開始追蹤記錄：

   ```
   aws cloudtrail start-logging \
       --name cloudwatch-metrics-api-key-audit \
       --region us-east-1
   ```

`readOnly: false` 篩選條件會限制記錄寫入操作 (PutMetricData)，其中包括所有 OTLP 擷取呼叫。若要識別這些事件中的承載字符用量，請查詢您的追蹤日誌 （透過 Athena 或 CloudTrail Lake)，並根據與您的 API 金鑰相關聯的 IAM 使用者名稱進行篩選 （例如 `cloudwatch-metrics-api-key-user`)。來自 OTLP 擷取的事件包括在事件承載`OTLP`中`AdditionalEventData.protocol`設定為 ，您可以在事後查詢中使用，以區分它們與傳統的 PutMetricData SDK 呼叫。