我正在设置保管库和在AWS RDS中运行的Postgres实例之间的集成。我的策略如下:
数据库注册
a。使用RDS主凭据创建一个名为server_admin的角色:
CREATE ROLE server_admin WITH LOGIN PASSWORD '${password}' CREATEROLE CREATEDB
b。使用server_admin postgres角色(python hvac库)向Vault注册数据库:
vault.write("database/config/{0}".format(database_identifier),
plugin_name=plugin_name,
connection_url=connection_url,
allowed_roles="*")`
c。接下来,创建用于管理的库角色(模式创建):
vault.write("database/roles/{0}".format(role_name),
db_name=database_identifier,
creation_statements='"CREATE ROLE \"{{name}}\" WITH LOGIN INHERIT PASSWORD '{{password}}' IN ROLE SERVER_ADMIN;"',
default_ttl="10000h")
模式注册
a。使用保管库获取具有server_admin角色的用户。b。创建模式
CREATE SCHEMA IF NOT EXISTS ${schema_name} AUTHORIZATION server_admin
c。创建3个保管库角色(read_only,read_write,admin)
应用程序初始化
a。从具有管理员角色的库中获取数据库用户,然后运行飞行迁移]
b。从库中以read_write角色获取数据库用户以进行正常操作
我的问题是,在由我的应用程序(flyway)进行初始架构初始化期间,表归动态生成的用户所有。下次我尝试迁移时,我(具有库角色)获得了一个新用户(通过保管库),但该用户无权访问第一个用户创建的表。
与PostgreSQL结合使用保管库时,数据库/模式/表所有权的推荐策略是什么?
我一直在努力解决相同的问题,最后,我实现了本文描述的解决方案。 (相关部分以“使用Liquibase”结尾)https://www.jannikarndt.de/blog/2018/08/rotating_postgresql_passwords_with_no_downtime/
Vault可通过使用Vault静态角色如上所述来轮换角色。在这种情况下,用户名保持不变,密码由保管箱轮换和管理。 https://learn.hashicorp.com/vault/secrets-management/db-creds-rotation
我使用蓝色/绿色设置,将未使用的角色设置为NOLOGIN并在需要时进行切换。
通过使角色名称保持静态,可以避免新角色不继承前一角色的权限的问题。