

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

# 中的安全性 AWS AppConfig
<a name="appconfig-security"></a>

的雲端安全性 AWS 是最高優先順序。身為 AWS 客戶，您可以受益於資料中心和網路架構，這些架構專為符合最安全敏感組織的需求而建置。

安全性是 AWS 與您之間的共同責任。[共同責任模式](https://aws.amazon.com/compliance/shared-responsibility-model/)將其描述為雲端*的*安全性，和雲端*中*的安全性：
+ **雲端的安全性** – AWS 負責保護在 中執行 AWS 服務的基礎設施 AWS 雲端。 AWS 也為您提供可安全使用的服務。在[AWS 合規計畫](https://aws.amazon.com/compliance/programs/)中，第三方稽核人員會定期測試和驗證我們安全的有效性。若要了解適用的合規計劃 AWS Systems Manager，請參閱[AWS 合規計劃的 服務範圍](https://aws.amazon.com/compliance/services-in-scope/)。
+ **雲端的安全性** – 您的責任取決於您使用 AWS 的服務。您也必須對其他因素負責，包括資料的機密性、您公司的要求和適用法律和法規。

AWS AppConfig 是 中的工具 AWS Systems Manager。若要了解如何在使用 時套用共同責任模型 AWS AppConfig，請參閱 [中的安全性 AWS Systems Manager](https://docs.aws.amazon.com/systems-manager/latest/userguide/security.html)。本節說明如何設定 Systems Manager 以符合其安全性和合規目標 AWS AppConfig。

## 實作最低權限存取
<a name="appconfig-security-least-privilege-access"></a>

作為安全最佳實務，授予身分在特定條件下對特定資源執行特定動作所需的最低必要許可。 AWS AppConfig 代理程式提供兩種功能，可讓代理程式存取執行個體或容器的檔案系統：*備份*和*寫入磁碟*。如果您啟用這些功能，請確認只有 AWS AppConfig 代理程式具有寫入檔案系統上指定組態檔案的許可。同時確認只有從這些組態檔案讀取所需的程序才能執行此操作。對降低錯誤或惡意意圖所引起的安全風險和影響而言，實作最低權限存取是相當重要的一環。

如需實作最低權限存取的詳細資訊，請參閱*AWS Well-Architected Tool 《 使用者指南*》中的 [SEC03-BP02 授予最低權限存取](https://docs.aws.amazon.com/wellarchitected/latest/framework/sec_permissions_least_privileges.html)。如需本節提及之 AWS AppConfig 客服人員功能的詳細資訊，請參閱 [使用資訊清單來啟用其他擷取功能](appconfig-agent-how-to-use-additional-features.md)。

## 的靜態資料加密 AWS AppConfig
<a name="appconfig-security-data-encryption"></a>

AWS AppConfig 根據預設提供加密，以使用 保護靜態客戶資料 AWS 擁有的金鑰。

**AWS 擁有的金鑰** - 預設 AWS AppConfig 使用這些金鑰自動加密由 服務部署並託管在資料存放區中的 AWS AppConfig 資料。您無法檢視、管理或使用 AWS 擁有的金鑰或稽核其使用方式。不過，您不需要採取任何動作或變更任何程式，即可保護加密您資料的金鑰。如需詳細資訊，請參閱《AWS Key Management Service 開發人員指南》**中的 [AWS 擁有的金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-owned-cmk)。

雖然您無法停用此層加密或選取替代加密類型，但您可以指定在儲存 AWS AppConfig 資料存放區中託管的組態資料以及部署組態資料時要使用的客戶受管金鑰。

**客戶受管金鑰** — AWS AppConfig 支援使用您建立、擁有和管理的對稱客戶受管金鑰，在現有 上新增第二層加密 AWS 擁有的金鑰。您可以完全控制此層加密，因此能執行以下任務：
+ 建立和維護金鑰政策和授權
+ 建立和維護 IAM 政策
+ 啟用和停用金鑰政策
+ 輪換金鑰密碼編譯資料
+ 新增 標籤
+ 建立金鑰別名
+ 安排金鑰供刪除

如需詳細資訊，請參閱《 *AWS Key Management Service 開發人員指南*》中的[客戶受管金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)。

**AWS AppConfig 支援客戶受管金鑰**

AWS AppConfig 支援組態資料的客戶受管金鑰加密。對於儲存到 AWS AppConfig 託管資料存放區的組態版本，客戶可以在對應的組態設定檔`KmsKeyIdentifier`上設定 。每次使用 `CreateHostedConfigurationVersion` API 操作建立新版本的組態資料時， 都會從 AWS AppConfig 產生 AWS KMS 資料金鑰`KmsKeyIdentifier`，以在儲存資料之前加密資料。稍後在 `GetHostedConfigurationVersion`或 `StartDeployment` API 操作期間存取資料時， 會使用所產生資料金鑰的相關資訊 AWS AppConfig 來解密組態資料。

AWS AppConfig 也支援部署組態資料的客戶受管金鑰加密。若要加密組態資料，客戶可以`KmsKeyIdentifier`為其部署提供 。 會使用此 AWS KMS 金鑰 AWS AppConfig 來`KmsKeyIdentifier`加密 `StartDeployment` API 操作上的資料。

**AWS AppConfig 加密存取**

建立客戶受管金鑰時，請使用下列金鑰政策，以確保可以使用金鑰。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "Allow use of the key",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:role/role_name"
            },
            "Action": [
                "kms:Decrypt",
                "kms:GenerateDataKey"
            ],
            "Resource": "*"
        }
    ]
}
```

------

若要使用客戶受管金鑰加密託管組態資料，身分呼叫`CreateHostedConfigurationVersion`需要下列可指派給使用者、群組或角色的政策陳述式：

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "kms:GenerateDataKey",
            "Resource": "arn:aws:kms:us-east-1:111122223333:key/key-ID"
        }
    ]
}
```

------

如果您使用 Secrets Manager 秘密或使用客戶受管金鑰加密的任何其他組態資料，`retrievalRoleArn`您將需要`kms:Decrypt`解密和擷取資料。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "kms:Decrypt",
      "Resource": "arn:aws:kms:us-east-1:111122223333:key/key-ID"
    }
  ]
}
```

------

呼叫 AWS AppConfig [StartDeployment](https://docs.aws.amazon.com/appconfig/2019-10-09/APIReference/API_appconfigdata_StartDeployment.html) API 操作時，身分呼叫`StartDeployment`需要下列可指派給使用者、群組或角色的 IAM 政策：

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "kms:GenerateDataKey*"
      ],
      "Resource": "arn:aws:kms:us-east-1:111122223333:key/key-ID"
    }
  ]
}
```

------

呼叫 AWS AppConfig [GetLatestConfiguration](https://docs.aws.amazon.com/appconfig/2019-10-09/APIReference/API_appconfigdata_GetLatestConfiguration.html) API 操作時，身分呼叫`GetLatestConfiguration`需要下列可指派給使用者、群組或角色的政策：

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "kms:Decrypt",
            "Resource": "arn:aws:kms:us-east-1:111122223333:key/key-ID"
        }
    ]
}
```

------

**加密內容**

[加密內容](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context)是一組選用的金鑰值對，包含資料的其他相關內容資訊。

AWS KMS 使用加密內容做為額外的已驗證資料，以支援已驗證的加密。當您在加密資料的請求中包含加密內容時， 會將加密內容 AWS KMS 繫結至加密的資料。若要解密資料，您必須在請求中包含相同的加密內容。

 **AWS AppConfig 加密內容**：在所有 AWS KMS 加密操作中使用加密內容，用於加密 AWS AppConfig 的託管組態資料和部署。內容包含對應於資料類型的索引鍵，以及識別特定資料項目的值。

**監控 的加密金鑰 AWS**

當您搭配 使用 AWS KMS 客戶受管金鑰時 AWS AppConfig，您可以使用 AWS CloudTrail 或 Amazon CloudWatch Logs 來追蹤 AWS AppConfig 傳送至 的請求 AWS KMS。

下列範例是 的 CloudTrail 事件`Decrypt`，用於監控 AWS KMS 呼叫的操作 AWS AppConfig ，以存取客戶受管金鑰加密的資料：

```
{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "AWSService",
        "invokedBy": "appconfig.amazonaws.com"
    },
    "eventTime": "2023-01-03T02:22:28z",
    "eventSource": "kms.amazonaws.com",
    "eventName": "Decrypt",
    "awsRegion": "Region",
    "sourceIPAddress": "172.12.34.56",
    "userAgent": "ExampleDesktop/1.0 (V1; OS)",
    "requestParameters": {
        "encryptionContext": {
            "aws:appconfig:deployment:arn": "arn:aws:appconfig:Region:account_ID:application/application_ID/environment/environment_ID/deployment/deployment_ID"
        },
        "keyId": "arn:aws:kms:Region:account_ID:key/key_ID",
        "encryptionAlgorithm": "SYMMETRIC_DEFAULT"
    },
    "responseElements": null,
    "requestID": "ff000af-00eb-00ce-0e00-ea000fb0fba0SAMPLE",
    "eventID": "ff000af-00eb-00ce-0e00-ea000fb0fba0SAMPLE",
    "readOnly": true,
    "resources": [
        {
            "accountId": "account_ID",
            "type": "AWS::KMS::Key",
            "ARN": "arn:aws:kms:Region:account_ID:key_ID"
        }
    ],
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "eventCategory": "Management",
    "recipientAccountId": "account_ID",
    "sharedEventID": "dc129381-1d94-49bd-b522-f56a3482d088"
}
```

## AWS AppConfig 使用界面端點存取 (AWS PrivateLink)
<a name="vpc-interface-endpoints"></a>

您可以使用 在 VPC 和 之間 AWS PrivateLink 建立私有連線 AWS AppConfig。您可以 AWS AppConfig 像在 VPC 中一樣存取 ，無需使用網際網路閘道、NAT 裝置、VPN 連接或 Direct Connect 連線。VPC 中的執行個體不需要公有 IP 地址即可存取 AWS AppConfig。

您可以建立由 AWS PrivateLink提供支援的*介面端點*來建立此私有連線。我們會在您為介面端點啟用的每個子網中建立端點網路介面。這些是請求者管理的網路介面，可作為目的地為 AWS AppConfig之流量的進入點。

如需詳細資訊，請參閱《*AWS PrivateLink 指南*》中的「[透過 AWS PrivateLink存取 AWS 服務](https://docs.aws.amazon.com/vpc/latest/privatelink/privatelink-access-aws-services.html)」。

### 的考量事項 AWS AppConfig
<a name="vpc-endpoint-considerations"></a>

在您設定介面端點之前 AWS AppConfig，請檢閱《 *AWS PrivateLink 指南*》中的[考量事項](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html#considerations-interface-endpoints)。

AWS AppConfig 支援透過介面端點呼叫 [https://docs.aws.amazon.com/appconfig/2019-10-09/APIReference/API_Operations_Amazon_AppConfig.html](https://docs.aws.amazon.com/appconfig/2019-10-09/APIReference/API_Operations_Amazon_AppConfig.html)和 [https://docs.aws.amazon.com/appconfig/2019-10-09/APIReference/API_Operations_AWS_AppConfig_Data.html](https://docs.aws.amazon.com/appconfig/2019-10-09/APIReference/API_Operations_AWS_AppConfig_Data.html)服務。

### 建立 的介面端點 AWS AppConfig
<a name="vpc-endpoint-create"></a>

您可以使用 Amazon VPC AWS AppConfig 主控台或 AWS Command Line Interface () 建立 的介面端點AWS CLI。如需詳細資訊，請參閱《*AWS PrivateLink 指南*》中的「[建立介面端點](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html#create-interface-endpoint-aws)」。

 AWS AppConfig 使用下列服務名稱建立 的介面端點：

```
com.amazonaws.region.appconfig
```

```
com.amazonaws.region.appconfigdata
```

如果您為介面端點啟用私有 DNS，您可以使用 AWS AppConfig 其預設的區域 DNS 名稱向 提出 API 請求。例如，`appconfig.us-east-1.amazonaws.com` 和 `appconfigdata.us-east-1.amazonaws.com`。

### 為您的介面端點建立端點政策
<a name="vpc-endpoint-policy"></a>

端點政策為 IAM 資源，您可將其連接至介面端點。預設端點政策允許 AWS AppConfig 透過介面端點完整存取 。若要控制允許 AWS AppConfig 從您的 VPC 存取 ，請將自訂端點政策連接至介面端點。

端點政策會指定以下資訊：
+ 可執行動作 (AWS 帳戶、IAM 使用者和 IAM 角色) 的主體。
+ 可執行的動作。
+ 可供執行動作的資源。

如需詳細資訊，請參閱《*AWS PrivateLink 指南*》中的「[使用端點政策控制對服務的存取](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-access.html)」。

**範例： AWS AppConfig 動作的 VPC 端點政策**  
以下是自訂端點政策的範例。將此政策附加至介面端點後，此政策會針對所有資源上的所有主體，授予列出的 AWS AppConfig 動作的存取權限。

```
{
   "Statement": [
      {
         "Principal": "*",
         "Effect": "Allow",
         "Action": [
            "appconfig:CreateApplication",
            "appconfig:CreateEnvironment",
            "appconfig:CreateConfigurationProfile",
            "appconfig:StartDeployment",
            "appconfig:GetLatestConfiguration"
            "appconfig:StartConfigurationSession"
         ],
         "Resource":"*"
      }
   ]
}
```

## Secrets Manager 金鑰輪換
<a name="appconfig-security-secrets-manager-key-rotation"></a>

本節說明與 Secrets Manager AWS AppConfig 整合的重要安全性資訊。如需 Secrets Manager 的資訊，請參閱[什麼是 AWS Secrets Manager？](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) *AWS Secrets Manager 《 使用者指南*》中的 。

### 設定 所部署 Secrets Manager 秘密的自動輪換 AWS AppConfig
<a name="appconfig-security-secrets-manager-key-rotation-setting-up"></a>

*輪換*是定期更新存放在 Secrets Manager 中的秘密的程序。當您輪換秘密時，會更新秘密和資料庫或服務中的憑證。您可以使用 AWS Lambda 函數更新秘密和資料庫，在 Secrets Manager 中設定自動秘密輪換。如需詳細資訊，請參閱*AWS Secrets Manager 《 使用者指南*》中的[輪換 AWS Secrets Manager 秘密](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotating-secrets.html)。

若要啟用由 部署之 Secrets Manager 秘密的金鑰輪換 AWS AppConfig，請更新您的輪換 Lambda 函數並部署輪換的秘密。

**注意**  
在秘密輪換並完全更新至新版本之後，部署您的 AWS AppConfig 組態設定檔。您可以判斷秘密是否因為狀態從 `VersionStage`變更為 `AWSPENDING` 而輪換`AWSCURRENT`。秘密輪換完成發生在 Secrets Manager 輪換範本`finish_secret`函數中。

以下是在輪換秘密之後開始 AWS AppConfig 部署的範例函數。

```
import time
import boto3
client = boto3.client('appconfig')

def finish_secret(service_client, arn, new_version):
    """Finish the rotation by marking the pending secret as current
    This method finishes the secret rotation by staging the secret staged AWSPENDING with the AWSCURRENT stage.
    Args:
        service_client (client): The secrets manager service client
        arn (string): The secret ARN or other identifier
        new_version (string): The new version to be associated with the secret
    """
    # First describe the secret to get the current version
    metadata = service_client.describe_secret(SecretId=arn)
    current_version = None
    for version in metadata["VersionIdsToStages"]:
        if "AWSCURRENT" in metadata["VersionIdsToStages"][version]:
            if version == new_version:
                # The correct version is already marked as current, return
                logger.info("finishSecret: Version %s already marked as AWSCURRENT for %s" % (version, arn))
                return
            current_version = version
            break

    # Finalize by staging the secret version current
    service_client.update_secret_version_stage(SecretId=arn, VersionStage="AWSCURRENT", MoveToVersionId=new_version, RemoveFromVersionId=current_version)
    
    # Deploy rotated secret
    response = client.start_deployment(
            ApplicationId='TestApp',
            EnvironmentId='TestEnvironment',
            DeploymentStrategyId='TestStrategy',
            ConfigurationProfileId='ConfigurationProfileId',
            ConfigurationVersion=new_version,
            KmsKeyIdentifier=key,
            Description='Deploy secret rotated at ' + str(time.time())
        )
   
    logger.info("finishSecret: Successfully set AWSCURRENT stage to version %s for secret %s." % (new_version, arn))
```