Terraform 存储库上有许多关于此问题的 Git 问题,其中有很多有趣的评论,但截至目前我仍然没有看到此问题的解决方案。
Terraform 将纯文本值(包括密码)存储在 tfstate 文件中。
大多数用户都需要远程存储它们,以便团队可以在同一基础设施上同时工作,其中大多数用户将状态文件存储在 S3 中。
那么如何隐藏你的密码呢?
这里有人使用 Terraform 进行生产吗?您是否以纯文本形式保存密码?
您是否有特殊的工作流程来删除或隐藏它们?当你运行时会发生什么terraform apply
then?
我考虑过以下选项:
- 将它们存储在领事中 - 我不使用领事
- 从状态文件中删除它们 - 这需要每次执行另一个进程,我不知道 Terraform 将如何使用空/不可读/不起作用的密码处理资源
- 存储一个默认密码,然后更改(因此 Terraform 将在 tfstate 文件中具有无效密码) - 与上面相同
- 使用 Vault 资源 - 听起来这还不是完整的工作流程
- 使用 git-repo-crypt 将它们存储在 Git 中 - Git 也不是一个选项
- 对 S3 存储桶进行全局加密 - 如果人们能够以“经理”级别访问 AWS,这不会阻止人们看到纯文本密码,但这似乎是迄今为止最好的选择
从我的角度来看,这是我希望看到的:
- 状态文件不包含密码
- 状态文件已加密
- 状态文件中的密码是指向其他资源的“指针”,例如“vault:backend-type:/path/to/password”
- 每次 Terraform 运行都会从指定的提供程序收集所需的密码
这只是一个愿望。
但回到这个问题 - 如何在生产中使用 Terraform?
我想知道如何实现最佳实践,但让我分享一下我的案例,尽管这是 AWS 的一种有限方式。基本上我不使用 Terraform 管理凭据。
-
为RDS设置一个初始密码,忽略与生命周期钩子的差异,稍后更改。忽略差异的方法如下:
resource "aws_db_instance" "db_instance" {
...
password = "hoge"
lifecycle {
ignore_changes = ["password"]
}
}
IAM 用户由 Terraform 管理,但 IAM 登录配置文件(包括密码)则不是由 Terraform 管理。我认为IAM密码应该由个人管理,而不是由管理员管理。
应用程序使用的 API 密钥也不由 Terraform 管理。它们使用AWS KMS(密钥管理服务)进行加密,加密后的数据保存在应用程序的git存储库或S3存储桶中。 KMS加密的优点是解密权限可以由IAM角色控制。无需管理解密密钥。
虽然我还没有尝试过,但最近我注意到aws ssm put-parameter --key-id
可以用作支持 KMS 加密的简单键值存储,因此这也可能是一个不错的选择。
我希望这可以帮助你。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)