

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

# 設定承載字符身分驗證
<a name="CWL_HTTP_Endpoints_BearerTokenAuth"></a>

在使用承載字符身分驗證與任何 HTTP 擷取端點傳送日誌之前，您需要：
+ 使用 CloudWatch Logs 許可建立 IAM 使用者
+ 產生服務特定的登入資料 （承載字符）
+ 建立日誌群組和日誌串流
+ 在日誌群組上啟用承載字符身分驗證

**重要**  
我們建議針對所有工作負載使用 SigV4 身分驗證搭配短期登入資料，以達成此目的。SigV4 提供最強大的安全狀態。限制在短期憑證型身分驗證不可行的情況下使用 API 金鑰 （承載字符）。當您準備好將 CloudWatch Logs 納入具有更高安全需求的應用程式時，您應該切換到短期憑證。如需詳細資訊，請參閱《*IAM 使用者指南*》中的[長期存取金鑰的替代方案](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#bp-workloads-use-roles)。

## 選項 1：使用 AWS 主控台快速開始使用
<a name="CWL_HTTP_Endpoints_Console_Setup"></a>

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

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

1. 登入 AWS 管理主控台。

1. 導覽至 **CloudWatch** > **設定** > **日誌**。

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

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

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

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

1. 複製並安全地儲存顯示的登入資料：
   + **API 金鑰 ID** （服務特定的登入資料 ID)
   + **API 金鑰秘密** （承載字符）
**重要**  
立即儲存 API 金鑰秘密。它稍後無法擷取。如果遺失，您將需要產生新的 API 金鑰。

1. 建立將存放日誌的日誌群組和日誌串流：

   ```
   # Create the log group
   aws logs create-log-group \
       --log-group-name /aws/hlc-logs/my-application \
       --region us-east-1
   
   # Create the log stream
   aws logs create-log-stream \
       --log-group-name /aws/hlc-logs/my-application \
       --log-stream-name application-stream-001 \
       --region us-east-1
   ```

1. 在日誌群組上啟用承載字符身分驗證：

   ```
   aws logs put-bearer-token-authentication \
       --log-group-identifier /aws/hlc-logs/my-application \
       --bearer-token-authentication-enabled \
       --region us-east-1
   ```

   驗證組態：

   ```
   aws logs describe-log-groups \
       --log-group-name-prefix /aws/hlc-logs/my-application \
       --region us-east-1
   ```

**包含的許可：**自動建立的 IAM 使用者將具有下列許可：
+ `logs:PutLogEvents` – 將日誌事件傳送至 CloudWatch Logs
+ `logs:CallWithBearerToken` – 使用承載字符進行驗證
+ `kms:Describe*`、`kms:GenerateDataKey*`、 `kms:Decrypt` – 存取 KMS 加密日誌群組 （具有限制為日誌服務的條件）

## 選項 2：手動設定
<a name="CWL_HTTP_Endpoints_Manual_Setup"></a>

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

### 步驟 1：建立 IAM 使用者
<a name="CWL_HTTP_Endpoints_Manual_Step1"></a>

建立將用於日誌擷取的 IAM 使用者：

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

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

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

1. 輸入使用者名稱 （例如 `cloudwatch-logs-hlc-user`)。

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

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

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

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

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

   建立並連接下列 IAM 政策：

   ```
   {
       "Version": "2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "LogsAPIs",
               "Effect": "Allow",
               "Action": [
                   "logs:CallWithBearerToken",
                   "logs:PutLogEvents"
               ],
               "Resource": "*"
           },
           {
               "Sid": "KMSAPIs",
               "Effect": "Allow",
               "Action": [
                   "kms:Describe*",
                   "kms:GenerateDataKey*",
                   "kms:Decrypt"
               ],
               "Condition": {
                   "StringEquals": {
                       "kms:ViaService": [
                           "logs.*.amazonaws.com"
                       ]
                   }
               },
               "Resource": "arn:aws:kms:*:*:key/*"
           }
       ]
   }
   ```

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

**注意**  
如果您計劃將日誌傳送至 KMS 加密的日誌群組，則需要 KMS 許可。條件限制 KMS 只能存取透過 CloudWatch Logs 服務使用的金鑰。

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

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

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

```
aws iam create-service-specific-credential \
    --user-name cloudwatch-logs-hlc-user \
    --service-name logs.amazonaws.com \
    --credential-age-days 30
```

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

**重要**  
請妥善儲存 `ServiceCredentialSecret` 值，因為您之後將無法再擷取它。如果遺失，您將需要產生新的 API 金鑰。

### 步驟 3：建立日誌群組和日誌串流
<a name="CWL_HTTP_Endpoints_Manual_Step3"></a>

建立將存放日誌的日誌群組和日誌串流：

```
# Create the log group
aws logs create-log-group \
    --log-group-name /aws/hlc-logs/my-application \
    --region us-east-1

# Create the log stream
aws logs create-log-stream \
    --log-group-name /aws/hlc-logs/my-application \
    --log-stream-name application-stream-001 \
    --region us-east-1
```

### 步驟 4：啟用承載字符身分驗證
<a name="CWL_HTTP_Endpoints_Manual_Step4"></a>

在日誌群組上啟用承載字符身分驗證：

```
aws logs put-bearer-token-authentication \
    --log-group-identifier /aws/hlc-logs/my-application \
    --bearer-token-authentication-enabled \
    --region us-east-1
```

驗證組態：

```
aws logs describe-log-groups \
    --log-group-name-prefix /aws/hlc-logs/my-application \
    --region us-east-1
```

## 控制產生和使用 CloudWatch Logs API 金鑰的許可
<a name="CWL_HTTP_Endpoints_API_Key_Permissions"></a>

CloudWatch Logs API 金鑰的產生和使用由 CloudWatch Logs 和 IAM 服務中的動作和條件金鑰控制。

### 控制 CloudWatch Logs API 金鑰的產生
<a name="CWL_HTTP_Endpoints_Control_Generation"></a>

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

您可以使用下列條件索引鍵，對 `iam:CreateServiceSpecificCredential` 動作的許可施加條件：
+ [iam:ServiceSpecificCredentialAgeDays](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_iam-condition-keys.html#ck_ServiceSpecificCredentialAgeDays) – 可讓您在條件中指定金鑰的過期時間，以天為單位。例如，您可以使用此條件索引鍵，僅允許建立有效期為 90 天的 API 金鑰。
+ [iam:ServiceSpecificCredentialServiceName](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_iam-condition-keys.html#ck_ServiceSpecificCredentialAgeDays) – 可讓您在條件中指定服務的名稱。例如，您可以使用此條件金鑰來僅允許為 CloudWatch Logs 建立 API 金鑰，而非其他 服務。

### 控制 CloudWatch Logs API 金鑰的使用
<a name="CWL_HTTP_Endpoints_Control_Usage"></a>

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

### 政策範例
<a name="CWL_HTTP_Endpoints_Permission_Examples"></a>

#### 防止身分產生和使用 CloudWatch Logs API 金鑰
<a name="CWL_HTTP_Endpoints_Deny_Generation_And_Use"></a>

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

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

#### 防止身分使用 CloudWatch Logs API 金鑰
<a name="CWL_HTTP_Endpoints_Deny_Use"></a>

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

#### 只有在 CloudWatch Logs 金鑰在 90 天內過期時，才允許建立金鑰
<a name="CWL_HTTP_Endpoints_Allow_Expire_90"></a>

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

## 輪換 API 金鑰
<a name="CWL_HTTP_Endpoints_Rotating_Keys"></a>

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

### 輪換程序
<a name="CWL_HTTP_Endpoints_Rotation_Process"></a>

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

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

   ```
   aws iam create-service-specific-credential \
       --user-name cloudwatch-logs-hlc-user \
       --service-name logs.amazonaws.com \
       --credential-age-days 90
   ```

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

1. 將新登入資料匯入廠商的入口網站，或更新您的應用程式組態以使用新的 API 金鑰。

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

   ```
   aws iam update-service-specific-credential \
       --user-name cloudwatch-logs-hlc-user \
       --service-specific-credential-id ACCA1234EXAMPLE1234 \
       --status Inactive
   ```

1. 在 CloudWatch `IncomingBytes` 中監控日誌群組的指標，確認日誌交付未受到影響。如需詳細資訊，請參閱[使用 CloudWatch 指標監控使用量](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Monitoring-CloudWatch-Metrics.html)。

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

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

### 監控金鑰過期
<a name="CWL_HTTP_Endpoints_Monitor_Expiration"></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-logs-hlc-user \
    --service-name logs.amazonaws.com
```

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

## 回應遭入侵的 API 金鑰
<a name="CWL_HTTP_Endpoints_Compromised_Keys"></a>

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

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

   ```
   aws iam update-service-specific-credential \
       --user-name cloudwatch-logs-hlc-user \
       --service-specific-credential-id ACCA1234EXAMPLE1234 \
       --status Inactive
   ```

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

1. 依照中所述的輪換程序**建立替換金鑰**[輪換程序](#CWL_HTTP_Endpoints_Rotation_Process)。

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

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

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

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

**注意**  
若要透過 API 執行這些動作，您必須使用 AWS 登入資料進行驗證，而不是使用 CloudWatch Logs API 金鑰進行驗證。

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

## API 金鑰的安全最佳實務
<a name="CWL_HTTP_Endpoints_Security_Best_Practices"></a>

遵循這些最佳實務來保護您的 CloudWatch Logs API 金鑰：
+ **切勿在原始程式碼中嵌入 API 金鑰。**請勿在應用程式程式碼中硬式編碼 API 金鑰，或將其遞交至版本控制系統。如果金鑰意外遞交到公有儲存庫， AWS 自動化掃描可能會標記它，您應該立即輪換金鑰。
+ **使用秘密管理員。**將 API 金鑰存放在 [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html)或同等的秘密管理解決方案中。這可啟用集中式存取控制、稽核記錄和自動輪換。
+ **在所有金鑰上設定過期。**建立 API 金鑰時，請務必指定`--credential-age-days`值。若要在整個組織中強制執行最長金鑰生命週期，請使用 IAM `iam:ServiceSpecificCredentialAgeDays` 條件金鑰。如需範例，請參閱 [只有在 CloudWatch Logs 金鑰在 90 天內過期時，才允許建立金鑰](#CWL_HTTP_Endpoints_Allow_Expire_90)。
+ **套用最低權限許可。**僅將 IAM 使用者的許可範圍限定為所需的日誌群組和動作。使用 受管 [CloudWatchLogsAPIKeyAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/CloudWatchLogsAPIKeyAccess.html) 政策作為起點，並視需要進一步限制。
+ **啟用 CloudTrail 記錄。**透過啟用 的 CloudTrail 資料事件來稽核 API 金鑰用量`AWS::Logs::LogGroupAuthorization`。請參閱 [使用 CloudTrail 記錄 API 金鑰用量](#CWL_HTTP_Endpoints_CloudTrail_Logging)。
+ **使用 IAM Access Analyzer 監控 。**使用 [IAM Access Analyzer](https://docs.aws.amazon.com/IAM/latest/UserGuide/what-is-access-analyzer.html) 識別未使用的登入資料，以及與您的 API 金鑰 IAM 使用者相關聯的過度寬鬆政策。
+ **定期輪換金鑰。**建立輪換排程並遵循中所述的程序[輪換 API 金鑰](#CWL_HTTP_Endpoints_Rotating_Keys)。

## 使用 CloudTrail 記錄 API 金鑰用量
<a name="CWL_HTTP_Endpoints_CloudTrail_Logging"></a>

您可以使用 AWS CloudTrail 記錄 CloudWatch Logs API 金鑰用量的資料事件。CloudWatch Logs 會發出`CallWithBearerToken`呼叫`AWS::Logs::LogGroupAuthorization`的資料事件，讓您稽核何時及如何使用 API 金鑰傳送日誌。

若要為 CloudWatch Logs API 金鑰用量啟用 CloudTrail 記錄： CloudWatch 

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

1. 建立線索：

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

1. 設定進階事件選取器以擷取 CloudWatch Logs 日誌群組授權事件：

   ```
   aws cloudtrail put-event-selectors \
       --region us-east-1 \
       --trail-name cloudwatch-logs-api-key-audit \
       --advanced-event-selectors '[{
           "Name": "CloudWatch Logs API key authorization events",
           "FieldSelectors": [
               { "Field": "eventCategory", "Equals": ["Data"] },
               { "Field": "resources.type", "Equals": ["AWS::Logs::LogGroupAuthorization"] }
           ]
       }]'
   ```

1. 開始追蹤記錄：

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