大多数人都会遇到为开发人员跨多个数据库创建数据库用户的问题(不允许使用公共用户(。我们在AWS上有大约90个DB和200-250个dev。每天都有人需要访问数据库,这是一项手动且重复的任务。
我正在寻找一种自动化用户管理端到端生命周期的解决方案,编写脚本或创建地形模块是我脑海中已经有的解决方案,但其他组织如何大规模管理DB用户?
我确实查看了AWS IAM身份验证,但我不确定如何使用IAM角色授予细粒度访问权限。
干杯,有趣的学习
我做这件事的方式是(高级(;
- 创建RDS Terraform配置/模块
- 与用户&需要拨款创作
- 创建一个部署terraform的包装脚本,然后连接到该脚本以部署用户创建的SQL文件
- 您的包装脚本需要使用Terraform Outputs来获取新创建的RDS Endpoint以连接到|假设您在Terraform plan/config中创建了一个名为
rds_endpoint
的输出。。。这就是在bashterraform output rds_endpoint
中获取它的方式 - 假设您的新RDS数据库不可公开访问,那么您的包装脚本将需要通过堡垒或其他可公开访问数据库的实例进行隧道传输。示例:
ssh -oStrictHostKeyChecking=no -p 22 -i ~/.ssh/bastion-host-key.pem -C -N ec2-user@$bastion_ip -L 3306:$rds_endpoint:3306 &
- 您的包装脚本将需要使用RDS用户&您使用terraform创建的用于运行SQL文件的密码
事实上,IAM身份验证可能是实现这一点的关键。
事实上,你所能做的就是用地形创建所有的数据库。不要忘记通过terraform模块启用iam身份验证。
一旦所有数据库都是通过teraform创建的,你就必须在所有这些数据库中创建本地角色(要么通过使用SQL脚本的teraform,要么仍然通过使用允许你创建用户/角色的模块的terafform,对于postgresql,你可以使用这个模块(,iam的数据库角色(例如使用postgresql,其名称为"rds_iam"(
iam身份验证的问题是,你的所有开发者都可以使用他们的帐户连接到aws,并请求一个将用作密码的令牌(用户名将是你之前创建的角色(,通过这样做,你只创建了一个角色,但每个身份验证都由每个开发者帐户进行。
如果你的公司真的需要你为每个开发人员创建角色(即使角色完全相同,这也没有意义,因为根据定义,我们假设一个角色,所以任何人都可以扮演一个角色。这并不可怕(,然后你可以在所有数据库中为你的所有开发人员创建一个本地数据库用户(而不是一个角色(,方法是使用你的terraform将执行的SQL脚本。
当然,不要忘记将rds_iam现有角色授予将由所有开发人员使用的唯一角色(如果您选择此解决方案(,或者授予您之前创建的所有数据库用户。
您必须为所有这些用户管理IAM策略,以确保安全性(或在策略中使用*,让您的所有开发人员连接到您的所有数据库用户lol(
然后,您的开发人员将能够使用aws-rds命令生成auth令牌,并连接到具有正确权限的本地db用户。
这里有一堆信息和精确性:https://aws.amazon.com/premiumsupport/knowledge-center/users-connect-rds-iam
在aws 上度过一段美好的旅程