安全性 Amazon AppConfig - Amazon AppConfig
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

安全性 Amazon AppConfig

云安全 Amazon 是重中之重。作为 Amazon 客户,您可以从专为满足大多数安全敏感型组织的要求而构建的数据中心和网络架构中受益。

安全是双方共同承担 Amazon 的责任。责任共担模式将其描述为云的安全性和云安全性:

  • 云安全 — Amazon 负责保护在云中运行 Amazon 服务的基础架构 Amazon Web Services 云。 Amazon 还为您提供可以安全使用的服务。作为的一部分,第三方审计师定期测试和验证我们安全的有效性。要了解适用的合规计划 Amazon Systems Manager,请参阅按合规计划划分的划分的范围内的服务

  • 云端安全-您的责任由您使用的 Amazon 服务决定。您还需要对其他因素负责,包括您的数据的敏感性、您公司的要求以及适用的法律法规。

Amazon AppConfig 的能力是 Amazon Systems Manager。要了解在使用时如何应用分担责任模型 Amazon AppConfig,请参阅中的 “安全” Amazon Systems Manager。本节介绍了如何配置 Systems Manager 以实现 Amazon AppConfig的安全性和合规性目标。

实施最低权限访问

作为安全最佳实践,应授予身份在特定条件下对特定资源执行特定操作所需的最低权限。 Amazon AppConfig 代理提供两种功能,使代理能够访问实例或容器的文件系统:备份写入磁盘。如果启用这些功能,请确认只有 Amazon AppConfig 代理才有权写入文件系统上的指定配置文件。还要验证只有从这些配置文件中读取所需的进程才能读取这些配置文件。实施最低权限访问对于减小安全风险以及可能由错误或恶意意图造成的影响至关重要。

有关实现最低权限访问的更多信息,请参阅《Amazon Well-Architected Tool 用户指南》中的 SEC03-BP02 授予最低权限访问权限。有关本节中提及的 Amazon AppConfig 代理功能的更多信息,请参阅其他检索功能

Amazon AppConfig中的静态数据加密

Amazon AppConfig 默认情况下提供加密,以使用保护静态客户数据 Amazon 拥有的密钥。

Amazon 拥有的密钥— 默认 Amazon AppConfig 使用这些密钥自动加密由服务部署并托管在 Amazon AppConfig 数据存储中的数据。您无法查看、管理 Amazon 拥有的密钥、使用或审核其使用情况。但是您无需执行任何工作或更改任何计划即可保护用于加密数据的密钥。有关更多信息,请参阅 Amazon Key Management Service 开发人员指南中的 Amazon 拥有的密钥

虽然您无法禁用此加密层或选择其他加密类型,但您可以指定在保存数据存储中托管的配置数据和部署配置 Amazon AppConfig 数据时使用的客户托管密钥。

客户托管密钥 — Amazon AppConfig 支持使用您创建、拥有和管理的对称客户托管密钥,在现有 Amazon 拥有的密钥密钥的基础上添加第二层加密。由于您可以完全控制这一层加密,因此可以执行以下任务:

  • 建立和维护密钥政策和授权

  • 建立和维护 IAM 策略

  • 启用和禁用密钥政策

  • 轮换加密材料

  • 添加标签

  • 创建密钥别名

  • 计划删除密钥

有关更多信息,请参阅 Amazon Key Management Service 开发人员指南中的客户托管密钥

Amazon AppConfig 支持客户托管密钥

Amazon AppConfig 为配置数据的客户托管密钥加密提供支持。对于保存到 Amazon AppConfig 托管数据存储的配置版本,客户可以在相应的配置文件KmsKeyIdentifier上设置。每次使用 CreateHostedConfigurationVersion API 操作创建新版本的配置数据时, Amazon AppConfig 都会从中生成一个 Amazon KMS 数据密钥,KmsKeyIdentifier以便在存储数据之前对其进行加密。以后访问数据时,无论是在GetHostedConfigurationVersionStartDeployment API 操作期间,都会使用有关生成的数据 Amazon AppConfig 密钥的信息解密配置数据。

Amazon AppConfig 还支持对已部署的配置数据进行客户托管密钥加密。要加密配置数据,客户可以KmsKeyIdentifier为其部署提供。 Amazon AppConfig 使用它生成 Amazon KMS 数据密钥KmsKeyIdentifier以加密 StartDeployment API 操作中的数据。

Amazon AppConfig 加密访问

创建客户托管密钥时,请使用以下密钥政策来确保密钥可以使用。

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

要使用客户托管密钥加密托管配置数据,CreateHostedConfigurationVersion 的身份调用需要以下可分配给用户、群组或角色的策略声明:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "kms:GenerateDataKey, "Resource": "arn:aws:kms:Region:account_ID:key_ID" } ] }

如果您使用的是 Secrets Manager 密钥或使用客户托管密钥加密的任何其他配置数据,则您的 retrievalRoleArn 将需要 kms:Decrypt 来解密和检索数据。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "kms:Decrypt", "Resource": "arn:aws:kms:Region:account_ID:configuration source/object" } ] }

调用 Amazon AppConfig StartDeploymentAPI 操作时,身份调用StartDeployment需要以下 IAM 策略,该策略可以分配给用户、群组或角色:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kms:GenerateDataKey*" ], "Resource": "arn:aws:kms:Region:account_ID:key_ID" } ] }

在调用 Amazon AppConfig GetLatestConfigurationAPI 操作时,身份调用GetLatestConfiguration需要以下可以分配给用户、组或角色的策略:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "kms:Decrypt, "Resource": "arn:aws:kms:Region:account_ID:key_ID" } ] }

加密上下文

加密上下文是一组可选的键值对,包含有关数据的其他上下文信息。

Amazon KMS 使用加密上下文作为其他经过身份验证的数据来支持经过身份验证的加密。当您在加密数据的请求中包含加密上下文时,会将加密上下文 Amazon KMS 绑定到加密数据。要解密数据,您必须在请求中包含相同的加密上下文。

Amazon AppConfig 加密上下文:在所有加密操作中 Amazon AppConfig 使用加密上下 Amazon KMS 文来处理加密的托管配置数据和部署。上下文包含一个与数据类型对应的键和一个用于标识特定数据项的值。

监控您的加密密钥 Amazon

当您将 Amazon KMS 客户托管密钥与一起使用时 Amazon AppConfig,您可以使用 Amazon CloudTrail 或 Amazon CloudWatch Logs 来跟踪 Amazon AppConfig 发送到的请求 Amazon KMS。

以下示例是一个 CloudTrail 事件,用于监控Decrypt为访问由 Amazon AppConfig 您的客户托管密钥加密的数据而调用的 Amazon KMS 操作:

{ "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" }

Amazon AppConfig 使用接口端点进行访问 (Amazon PrivateLink)

您可以使用 Amazon PrivateLink 在您的 VPC 和之间创建私有连接 Amazon AppConfig。您可以像在 VPC 中 Amazon AppConfig 一样进行访问,无需使用互联网网关、NAT 设备、VPN 连接或 Amazon Direct Connect 连接。VPC 中的实例不需要公有 IP 地址即可访问 Amazon AppConfig。

您可以通过创建由 Amazon PrivateLink提供支持的接口端点来建立此私有连接。我们将在您为接口端点启用的每个子网中创建一个端点网络接口。这些是请求者托管的网络接口,用作发往 Amazon AppConfig的流量的入口点。

有关更多信息,请参阅《Amazon PrivateLink 指南》中的通过 Amazon PrivateLink访问 Amazon Web Services

的注意事项 Amazon AppConfig

在为设置接口终端节点之前 Amazon AppConfig,请查看Amazon PrivateLink 指南中的注意事项

Amazon AppConfig 支持通过接口端点对appconfigappconfigdata服务进行调用。

为 Amazon AppConfig创建接口端点

您可以创建用于 Amazon AppConfig 使用 Amazon VPC 控制台或 Amazon Command Line Interface (Amazon CLI) 的接口终端节点。有关更多信息,请参阅《Amazon PrivateLink 指南》中的创建接口端点

Amazon AppConfig 使用以下服务名称创建接口终端节点:

com.amazonaws.region.appconfig
com.amazonaws.region.appconfigdata

如果为接口端点启用私有 DNS,则可使用其默认区域 DNS 名称向 Amazon AppConfig 发出 API 请求。例如,appconfig.us-east-1.amazonaws.comappconfigdata.us-east-1.amazonaws.com

为 VPC 端点创建端点策略

端点策略是一种 IAM 资源,您可以将其附加到接口端点。默认终端节点策略允许 Amazon AppConfig 通过接口终端节点进行完全访问。要控制允许 Amazon AppConfig 从您的 VPC 访问权限,请将自定义终端节点策略附加到接口终端节点。

端点策略指定以下信息:

  • 可执行操作的主体(Amazon Web Services 账户、IAM 用户和 IAM 角色)。

  • 可执行的操作。

  • 可对其执行操作的资源。

有关更多信息,请参阅《Amazon PrivateLink 指南》中的使用端点策略控制对服务的访问权限

示例:用于 Amazon AppConfig 操作的 VPC 终端节点策略

以下是自定义端点策略的一个示例。将此策略附加到接口端点时,其会向所有资源上的所有主体授予对列出的 Amazon AppConfig 操作的访问权限。

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

Secrets Manager 密钥轮换

本节介绍有关与 Secrets Manager Amazon AppConfig 集成的重要安全信息。有关 Secrets Manager 的信息,请参阅什么是 Amazon Secrets Manager? 在《Amazon Secrets Manager 用户指南》中。

设置由部署的 Secrets Manager 密钥的自动轮换 Amazon AppConfig

Rotation 是定期更新存储在 Secrets Manager 中的密钥的过程。当轮换密钥时,会同时更新密钥和数据库或服务中的凭据。您可以使用更新密钥和数据库的 Amazon Lambda 函数在 Secrets Manager 中配置自动轮换密钥。有关更多信息,请参阅 Amazon Secrets Manager 用户指南中的轮换 Amazon Secrets Manager 密钥

要启用由部署的 Secrets Manager 密钥的密钥轮换 Amazon AppConfig,请更新轮换 Lambda 函数并部署轮换后的密钥。

注意

在您的密钥轮换并完全更新到新版本后,部署您的 Amazon AppConfig 配置文件。您可以通过 VersionStage 的状态从 AWSPENDING 变为 AWSCURRENT 来确定密钥是否已轮换。密钥轮换完成发生在 Secrets Manager 轮换模板 finish_secret 函数中。

以下是一个在密钥轮换后启动 Amazon 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))