中的安全性 AWS AppConfig - AWS AppConfig

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

中的安全性 AWS AppConfig

雲安全 AWS 是最高的優先級。身為 AWS 客戶,您可以從資料中心和網路架構中獲益,這些架構是專為滿足對安全性最敏感的組織的需求而打造的。

安全是 AWS 與您之間共同承擔的責任。共同責任模型將其描述為雲端安全性和雲端的安全性:

  • 雲端安全性 — AWS 負責保護中執行 AWS 服務的基礎架構 AWS 雲端。 AWS 還為您提供可以安全使用的服務。若要深入瞭解適用於的規範遵循計劃 AWS Systems Manager,請參閱合規計劃的AWS 服務範圍範圍)。

  • 雲端中的安全性 — 您的責任取決於您使用的 AWS 服務。您也必須對其他因素負責,包括資料的機密性、您公司的要求和適用法律和法規。

AWS AppConfig 是的功能 AWS Systems Manager。若要瞭解如何在使用時套用共用責任模型 AWS AppConfig,請參閱中的安全性 AWS Systems Manager。本節說明如何設定 Systems Manager 以符合的安全性和合規性目標 AWS AppConfig。

實作最低權限存取

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

如需有關實作最低權限存取的詳細資訊,請參閱《AWS Well-Architected Tool 使用指南》中的 SEC03-BP02 授與最少權限存取權。如需本節所述 AWS AppConfig 代理程式功能的詳細資訊,請參閱使用資訊清單來啟用其他擷取功能

靜態資料加密 AWS AppConfig

AWS AppConfig 默認情況下提供加密,以使用保護靜態客戶數據 AWS 擁有的金鑰。

AWS 擁有的金鑰— 預設情況下, AWS AppConfig 使用這些金鑰自動加密服務部署並託管在 AWS AppConfig 資料存放區中的資料。您無法檢視、管理或使用 AWS 擁有的金鑰,或稽核其使用情況。不過,您不需要採取任何動作或變更任何程式,即可保護加密您資料的金鑰。如需詳細資訊,請參閱《AWS Key Management Service 開發人員指南》中的 AWS 擁有的金鑰

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

客戶管理金鑰 — AWS AppConfig 支援使用您建立、擁有和管理的對稱客戶管理金鑰,以針對現有 AWS 擁有的金鑰金鑰新增第二層加密。您可以完全控制此層加密,因此能執行以下任務:

  • 建立和維護關鍵政策和補助金

  • 建立和維護IAM政策

  • 啟用和停用金鑰政策

  • 輪換金鑰密碼編譯資料

  • 新增標籤

  • 建立金鑰別名

  • 安排金鑰供刪除

如需詳細資訊,請參閱AWS Key Management Service 開發人員指南中的客戶管理金鑰

AWS AppConfig 支援客戶管理的金鑰

AWS AppConfig 為配置數據提供客戶管理的密鑰加密支持。對於儲存至 AWS AppConfig 託管資料存放區的組態版本,客戶可以在對應的組態設定檔KmsKeyIdentifier上設定。每次使用CreateHostedConfigurationVersionAPI作業建立新版本的組態資料時,都會從中 AWS AppConfig 產生 AWS KMS 資料金鑰,以KmsKeyIdentifier便在儲存資料之前對其進行加密。稍後在GetHostedConfigurationVersionStartDeploymentAPI作業期間存取資料時,會使用有關產生之資料金鑰的資訊 AWS AppConfig 解密組態資料。

AWS AppConfig 也為部署的組態資料提供客戶管理的金鑰加密支援。若要加密組態資料,客戶可以提供KmsKeyIdentifier給其部署。 AWS AppConfig 使用此生成 AWS KMS 數據密鑰KmsKeyIdentifier以加密StartDeploymentAPI操作上的數據。

AWS 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" } ] }

呼叫 AWS AppConfig StartDeploymentAPI作業時,身分呼叫StartDeployment需要下列可指派給使用者、群組或角色的IAM原則:

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

呼叫 AWS AppConfig GetLatestConfigurationAPI作業時,身分呼叫GetLatestConfiguration需要下列可指派給使用者、群組或角色的原則:

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

加密內容

加密內容是一組選用的金鑰值對,包含資料的其他相關內容資訊。

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)

您可以使 AWS PrivateLink 用在VPC和之間建立私人連線 AWS AppConfig。您可以 AWS AppConfig 像在您的一樣訪問VPC,而無需使用 Internet 網關,NAT設備,VPN連接或 AWS Direct Connect 連接。您中的執行個體VPC不需要公用 IP 位址即可存取 AWS AppConfig。

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

如需詳細資訊,請參閱《AWS PrivateLink 指南》中的透過 AWS PrivateLink存取 AWS 服務

的注意事項 AWS AppConfig

設定的介面端點之前 AWS AppConfig,請先檢閱AWS PrivateLink 指南中的考量事項

AWS AppConfig 支援透過介面端點對appconfigappconfigdata服務進行呼叫。

為 AWS AppConfig建立介面端點

您可以建立 AWS AppConfig 使用 Amazon VPC 主控台或 AWS Command Line Interface (AWS CLI) 的介面端點。如需詳細資訊,請參閱《AWS PrivateLink 指南》中的建立介面端點

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

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

如果您DNS為介面端點啟用 private,您可以 AWS AppConfig 使用其預設地區DNS名稱提出API要求。例如,appconfig.us-east-1.amazonaws.com.rproxy.goskope.comappconfigdata.us-east-1.amazonaws.com

為您的介面端點建立端點政策

端點策略是您可以附加到介面端點的IAM資源。預設端點策略允許 AWS AppConfig 透過介面端點進行完整存取。若要控制 AWS AppConfig 從您的允許存取VPC,請將自訂端點原則附加到介面端點。

端點政策會指定以下資訊:

  • 可以執行動作 (AWS 帳戶、IAM使用者和IAM角色) 的主參與者。

  • 可執行的動作。

  • 可供執行動作的資源。

如需詳細資訊,請參閱《AWS PrivateLink 指南》中的使用端點政策控制對服務的存取

範例: 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 AWS AppConfig 整合的重要安全性資訊。如需 Secrets Manager 的相關資訊,請參閱什麼是 AWS Secrets Manager?《AWS Secrets Manager 使用者指南》中。

設定由部署的 Secrets Manager 密碼的自動輪替 AWS AppConfig

輪換是定期更新秘密管理員中儲存的密碼的程序。當您輪換秘密時,會更新秘密和資料庫或服務中的憑證。您可以使用更新密碼和資料庫的 AWS Lambda 功能,在 Secrets Manager 中設定自動密碼輪換。如需詳細資訊,請參閱AWS Secrets Manager 使用指南中的旋轉 AWS Secrets Manager 密碼

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

注意

在您的密碼輪替並完全更新到新版本後,部署您的 AWS AppConfig 配置描述檔。您可以決定密碼是否因為狀態從VersionStage變更為而旋AWSPENDINGAWSCURRENT。秘密輪換完成會在 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))