我正试图正确设置我的基础设施,没有密码或密钥铺设左右。AWS RDS提供了一个选项来执行此操作,方法是允许用户(应用程序)使用生成的令牌进行身份验证。
然而,在文档中,其中一个步骤(this one)需要在Postgres数据库中运行一个查询来创建一个用户并授予他特定的权限:
CREATE USER test_rds WITH LOGIN;
GRANT rds_iam TO test_rds;
字符串
我想用Terraform配置整个堆栈。我查找了一些在RDS示例化后运行查询(here)的“技巧”,可以使用:
resource "null_resource" "db_setup" {
depends_on = ["aws_db_instance.your_database_instance", "aws_security_group.sg_allowing_external_access"]
provisioner "local-exec" {
// run shell commands to manually psql into the db
型
或者:
resource "aws_instance" "web" {
provisioner "remote-exec" {
inline = [
// run shell commands to manually psql into the db
型
但它们都需要创建主密码并以某种方式在“脚本”内传递它。
有没有可能用Terraform干净地做到这一点,没有硬编码的密码被传递?
我很乐意配置数据库,只允许特定的EC2/ECS示例使用正确的permissions来访问它,在我的git存储库中没有任何密码。
4条答案
按热度按时间vwoqyblh1#
要预配RDS数据库用户以进行IAM身份验证,可以添加以下terraform配置:
字符串
上面的代码使用了cyrilgdn/postgresql提供程序。如果使用aws_db_instance属性配置提供程序的连接参数,如下所示,则会强制执行正确的依赖顺序。
型
RDS User Guide现在包括以下内容:
对于PostgreSQL,如果将IAM角色(rds_iam)添加到主用户,则IAM身份验证优先于密码身份验证,因此主用户必须以IAM用户身份登录
nhjlsmyf2#
这里涉及的几个组件对您所要求的内容缺乏适当的支持,即:
rds_iam
角色的示例的方法但是,我们可以在两者之间进行工作。
需求
我假设运行terraform的机器有:
如何实现网络连接(将示例暴露到互联网,在ec2上运行terraform,代理...)和AWS身份(访问密钥,AWS SSO,ec2上的默认角色...)取决于您和您的上下文。
我个人使用AWS CLI命名的配置文件与AWS SSO,所以你会到处出售
--profile
,随时删除它们。配置
字符串
说明
在这两种情况下,我们都通过使用AWS cli来解决缺乏第一方支持的问题。
这个配置应该允许您完全引导一个RDS示例,没有任何类型的长期秘密!
希望能帮上忙。
pxiryf3j3#
为了完成我之前的回答,postgresql提供程序实际上对RDS IAM身份验证提供了本机支持。因此,我们可以简化这一部分,只保留用于初始设置的provisionner:
字符串
zsbz8rwp4#
为RDS数据库用户/角色启用IAM身份验证后,将无法再对该用户/角色使用基于密码的身份验证。
这意味着您可以使用安全性较低的密码,甚至可以生成一个随机密码(使用
random_id
resource),用于设置主密码并首先用于身份验证,以便您可以向主用户和您创建的任何其他用户授予rds_iam
权限。虽然这个密码最终会出现在状态文件中(即使是随机生成的),但正如前面提到的,一旦应用了
rds_iam
授权,您就不能使用这个密码登录数据库了。