尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Terraform AWS Provider `aws_kms_secrets` 数据源详解:批量解密 KMS 加密敏感配置

Terraform AWS Provider `aws_kms_secrets` 数据源详解:批量解密 KMS 加密敏感配置 Terraform AWS Provideraws_kms_secrets数据源详解批量解密 KMS 加密敏感配置【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-awsaws_kms_secrets是 Terraform AWS Provider 提供的 KMS 数据源用于一次解密多个由 AWS KMS 服务加密的密文CiphertextBlob并将结果以name - 明文的映射形式暴露给配置引用。本文围绕该数据源在terraform-provider-aws仓库中的官方文档website/docs/d/kms_secrets.html.markdown展开完整覆盖密文获取、Terraform 配置写法、全部参数说明并结合仓库源码secrets_data_source.go讲解底层解密调用链与数据流。读完本文你将掌握如何安全地把 KMS 加密后的数据库口令、应用密钥嵌入 Terraform 配置并批量还原使用。数据源概览与使用场景aws_kms_secrets的核心能力是从使用 AWS KMS 服务加密的数据中解密多个机密Decrypt multiple secrets from data encrypted with the AWS KMS service。典型场景包括为 RDS 集群、应用等资源注入数据库主密码/主用户名而无需在.tf文件中直接书写明文将同一份加密载荷复用到多个配置文件中密文可安全入库、入仓明文只在 plan/apply 时于内存中还原。需要特别强调的是官方文档给出的安全提示该数据源只是帮你把敏感数据藏在资源定义里并不会保护这些数据在 Terraform 的所有日志与 state 输出中的安全。plaintext属于敏感属性但 state 中仍可能残留解密结果因此除使用该数据源外还应对 Terraform 日志、state 文件等采取额外保护措施如加密存储 state、开启日志脱敏等。准备加密载荷使用 AWS CLI 生成 CiphertextBlob如果手头还没有 KMS 加密后的CiphertextBlob可以先用 AWS CLI 的aws kms encrypt命令生成。前提是本地 AWS CLI 已正确配置凭证并将示例中的--key-id替换为你自己的 KMS 密钥 ID。% echo -n master-password plaintext-password % aws kms encrypt --key-id ab123456-c012-4567-890a-deadbeef123 --plaintext fileb://plaintext-password --encryption-context foobar --output text --query CiphertextBlob AQECAHgaPa0J8WadplGCqqVAr4HNvDaFSQNaiwIBhmm6qDSFwAAAGIwYAYJKoZIhvcNAQcGoFMwUQIBADBMBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDILoLdvYv8l41OhAAIBEIAfx49FFJCLeYrkfMfAw6XlnxP23MmDBdqP8dPp28OoAQ % aws kms encrypt --key-id ab123456-c012-4567-890a-deadbeef123 --plaintext fileb://plaintext-password --encryption-algorithm RSAES_OAEP_SHA_256 --output text --query CiphertextBlob AQECAHgaPa0J8WadplGCqqVAr4HNvDaFSQNaiwIBhmm6qDSFwAAAGIwYAYJKoZIhvcNAQcGoFMwUQIBADBMBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDILoLdvYv8l41OhAAIBEIAfx49FFJCLeYrkfMfAw6XlnxP23MmDBdqP8dPp28OoAQ两个命令的差异在于第二个显式指定了--encryption-algorithm RSAES_OAEP_SHA_256适用于非对称密钥场景对应下文非对称密钥解密一节。除此之外也可以直接用--plaintext master-passwordCLI v1或--plaintext fileb://(echo -n master-password)CLI v2代替从文件读取。命令行操作有两个官方明确提示的易错点换行符陷阱如果文件末尾带有换行符该换行符会原样参与解密导致还原出的密码/值不正确还可能引发 plan 中的非预期变更。多数场景下应使用echo -n避免写入换行符。非对称算法匹配使用非对称密钥时加密与解密必须使用一致的加密算法否则解密阶段会抛出IncorrectKeyException。生成的密文输出可以直接粘贴进 Terraform 配置而不会在配置中暴露明文。Terraform 配置示例对称密钥批量解密加密输出可安全嵌入 Terraform 配置。下面的示例通过两个secret块同时解密主密码和主用户名并把结果喂给aws_rds_clusterdata aws_kms_secrets example { secret { # ... potentially other configuration ... name master_password payload AQECAHgaPa0J8WadplGCqqVAr4HNvDaFSQNaiwIBhmm6qDSFwAAAGIwYAYJKoZIhvcNAQcGoFMwUQIBADBMBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDILoLdvYv8l41OhAAIBEIAfx49FFJCLeYrkfMfAw6XlnxP23MmDBdqP8dPp28OoAQ context { foo bar } } secret { # ... potentially other configuration ... name master_username payload AQECAHgaPa0J8WadplGCqqVAr4HNvDaFSQNaiwIBhmm6qDSFwAAAGIwYAYJKoZIhvcNAQcGoFMwUQIBADBMBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDILoLdvYv8l41OhAAIBEIAfx49FFJCLeYrkfMfAw6XlnxP23MmDBdqP8dPp28OoAQ } } resource aws_rds_cluster example { # ... other configuration ... master_password data.aws_kms_secrets.example.plaintext[master_password] master_username data.aws_kms_secrets.example.plaintext[master_username] }要点解读每个secret块通过name定义导出键名payload提供 Base64 编码的密文若加密时使用了加密上下文Encryption Context解密时必须在context中提供完全一致的键值映射否则解密失败KMS 的加密上下文参与完整性校验数据源输出属性plaintext是映射类型通过plaintext[name]按名取值。这与源码中的解密循环完全对应在 secrets_data_source.go 中Provider 遍历secret集合中的每个元素逐个调用 KMS 的Decrypt操作并把结果写入plaintext[name]。注意plaintext在 Schema 中被标记为Sensitive: truesecrets_data_source.go这是 Provider 在 schema 层面避免其出现在普通日志输出的重要设计。非对称密钥解密示例当密文由非对称 KMS 密钥如 RSA 密钥加密时需要补充encryption_algorithm与key_id两个参数data aws_kms_secrets example { secret { # ... potentially other configuration ... name app_specific_secret payload AQECAHgaPa0J8WadplGCqqVAr4HNvDaFSQNaiwIBhmm6qDSFwAAAGIwYAYJKoZIhvcNAQcGoFMwUQIBADBMBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDILoLdvYv8l41OhAAIBEIAfx49FFJCLeYrkfMfAw6XlnxP23MmDBdqP8dPp28OoAQ # ... Use same algorithm used to Encrypt the payload ... encryption_algorithm RSAES_OAEP_SHA_256 key_id ab123456-c012-4567-890a-deadbeef123 } }官方文档特别提醒这里的encryption_algorithm必须与加密载荷时使用的算法保持一致即Use same algorithm used to Encrypt the payload否则解密阶段会抛出IncorrectKeyException。参数与属性参考Argument Reference数据源参数secret- 必填一个或多个来自 KMS 服务的加密载荷定义详见下面的 Secret 定义块。Secret Definitions每个secret支持的参数参数必填/可选说明name必填该密文在输出属性中导出的键名即plaintext映射的 keypayload必填KMS 加密操作返回的 Base64 编码密文context可选构成该密文 Encryption Context 的可选映射解密时须与加密时一致grant_tokens可选该密文使用的 Grant Token 列表encryption_algorithm可选解密使用的加密算法仅当密文由非对称 KMS 密钥加密时为必填。合法值SYMMETRIC_DEFAULT、RSAES_OAEP_SHA_1、RSAES_OAEP_SHA_256、SM2PKEkey_id可选AWS KMS 用于解密密文的 KMS 密钥仅当密文由非对称 KMS 密钥加密时为必填关于context与grant_tokens更深入的语义可参考 AWS KMS 官方 Concepts 文档此处不再展开外部链接。在源码层面encryption_algorithm的值由enum.Validate[awstypes.EncryptionAlgorithmSpec]()校验secrets_data_source.go与 AWS SDK v2 中的EncryptionAlgorithmSpec枚举保持一致这也印证了文档列出的合法值集合。Attribute Reference导出属性plaintext- 以每个secret的name为键、解密后的明文为值的映射。底层实现一次数据源读取的完整调用链从源码看aws_kms_secrets数据源在 Provider 中的实现位于 internal/service/kms/secrets_data_source.go并已在 service_package_gen.go 中以dataSourceSecrets注册TypeName 为aws_kms_secrets。其读取流程如下读取全部 secret 配置d.Get(secret).(*schema.Set).List()取出所有secret块Base64 解码对每个payload调用inttypes.Base64Decode若解码失败立即返回invalid base64 value for secret ( )错误 secrets_data_source.go构造 Decrypt 请求把context展开为map[string]*string、encryption_algorithm转为awstypes.EncryptionAlgorithmSpec、grant_tokens、key_id依次填入kms.DecryptInputsecrets_data_source.go调用 KMS Decryptconn.Decrypt(ctx, input)逐条解密密文失败时报 decrypting KMS Secret ( ) secrets_data_source.go按名写入结果plaintext[name] string(output.Plaintext)最终通过d.SetId(region)以当前区域作为数据源 IDsecrets_data_source.go。值得注意的是每个secret是相互独立的Decrypt调用而非批量 API因此一次数据源读取包含 N 个 secret 时会产生 N 次 KMS API 请求同时由于密文在读取时实时解密任何payload变更都会反映到plaintext中从而正确驱动 Terraform 的计划与依赖关系。相关实现ephemeral 资源与旧版aws_kms_secret数据源的替代仓库中还包含两个与aws_kms_secrets直接相关的实现理解它们有助于避免踩坑ephemeral 资源Terraform 1.10同名的ephemeral.aws_kms_secrets在 secrets_ephemeral.go 中实现注册于 service_package_gen.go。它使用 Plugin Framework 编写通过Open方法执行同样的逐条Decrypt逻辑但值不会写入 state适合临时密钥注入场景。其测试 secrets_ephemeral_test.go 明确要求 Terraform 版本不低于 1.10.0。旧版aws_kms_secret数据源单数形式的aws_kms_secret已被移除如今其实现仅返回一条指引错误secret_data_source.go提示用户改用aws_kms_secrets并按官方 v2 升级指南迁移。若你的配置仍在使用aws_kms_secret应尽快替换为本文介绍的数据源。测试验证对称与非对称两条主路径仓库的验收测试 secrets_data_source_test.go 覆盖了数据源的两条核心路径可作为配置正确性的参照TestAccKMSSecretsDataSource_basic对称密钥创建aws_kms_key用带EncryptionContextnamevalue的Encrypt生成密文再在数据源中配置context解密最终断言plaintext.%为1且plaintext.secret1等于原始明文my-plaintext-stringsecrets_data_source_test.go。TestAccKMSSecretsDataSource_asymmetric非对称密钥创建customer_master_key_spec RSA_2048的密钥使用RSAES_OAEP_SHA_1算法加密配置中同时给出encryption_algorithm与key_id完成解密secrets_data_source_test.go。可见仓库通过真实 AWS 环境的加密-解密往返验证了对称密钥依赖context与非对称密钥依赖encryption_algorithm/key_id两条配置路径恰好对应本文前两节的两个示例。按此模式组织自己的配置即可获得与官方实现一致的行为预期。小结aws_kms_secrets数据源通过密文入配置、内存中解密、按 name 引用明文的模式为 Terraform 配置中的敏感数据提供了一种不落明文的引入方式。使用时请重点核对三点payload必须是aws kms encrypt输出的 Base64 密文、context必须与加密时一致、非对称密钥场景必须显式指定匹配的encryption_algorithm与key_id同时切记它只是隐藏而非保护明文state 与日志的额外加固仍必不可少。【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表