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

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

Amazon AppConfig 中的安全性

Amazon 十分重视云安全性。作为 Amazon 客户,您将从专为满足大多数安全敏感型组织的要求而打造的数据中心和网络架构中受益。

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

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

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

Amazon AppConfig 是 Amazon Systems Manager 的功能。了解如何在使用 Amazon AppConfig 时应用责任共担模式,请参阅 Security in 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 都会从 KmsKeyIdentifier 中生成一个 Amazon KMS 数据密钥,以便在存储数据之前对其进行加密。之后在 GetHostedConfigurationVersionStartDeployment API 操作期间访问数据时,Amazon AppConfig 会使用有关生成的数据密钥的信息解密配置数据。

Amazon AppConfig还支持对已部署的配置数据进行客户托管密钥加密。要加密配置数据,客户可以为其部署提供 KmsKeyIdentifier。Amazon AppConfig 使用此 KmsKeyIdentifier 生成 Amazon KMS 数据密钥,以加密 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 PrivateLink) 访问 Amazon AppConfig

您可以使用 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 VPC 控制台或 Amazon Command Line Interface (Amazon CLI) 为 Amazon AppConfig 创建接口端点。有关更多信息,请参阅《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

为接口端点创建端点策略

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

端点策略指定以下信息:

  • 可执行操作的主体(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 密钥轮换

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

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

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

要启用 Amazon AppConfig 部署的 Secrets Manager 密钥的密钥轮换,请更新您的轮换 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))