【发布时间】:2018-06-27 19:30:13
【问题描述】:
问题
我正在尝试在 Google Cloud 中设置 Hashicorp vault 和 Postgres。
我正在使用 liquibase 来管理架构,当它进行迁移时,它会从保管库中检索用户名/密码,然后在该用户下运行以执行迁移。
但是,默认 postgres 用户或任何其他尝试使用该表的用户无法接收到 ERROR: permission denied for relation。
如果我理解正确,用户是在以postgres 的角色登录时创建的。这一切都在本地工作,但谷歌云的东西似乎以一种截然不同的方式设置。
这里有一些输出可以查看数据库的设置:
\du
List of roles
Role name | Attributes | Member of
----------------------------------+------------------------------------
------------------------+---------------------
cloudsqladmin | Superuser, Create role, Create DB,
Replication, Bypass RLS | {}
cloudsqlagent | Create role, Create DB
| {cloudsqlsuperuser}
cloudsqlreplica | Replication
| {}
cloudsqlsuperuser | Create role, Create DB
| {}
postgres | Create role, Create DB
| {cloudsqlsuperuser}
test | Create role, Create DB
| {cloudsqlsuperuser}
v-token-power-watc-p079t4r13s85w | Password valid until
| {cloudsqlsuperuser}
\dt
List of relations
Schema | Name | Type | Owner
--------+-----------------------+-------+------------------------------
public | databasechangelog | table | v-token-power-watc-p079t4r13s85w
public | databasechangeloglock | table | v-token-power-watc-p079t4r13s85w
public | test | table | v-token-power-watc-p079t4r13s85w
保管库创建 SQL 如下所示:
CREATE ROLE "{{name}}" WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}';
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO "{{name}}";
GRANT cloudsqlsuperuser to "{{name}}";"
我尝试过以多种方式玩角色,但似乎我创建的所有新角色总是被放入自己的沙盒中,无法玩任何其他角色。在这一点上,我不知道下一步该做什么,似乎无论我可以通过grant 选项,它都无济于事。
当前问题
是否所有者需要是cloudsqlsuperuser组而不是临时所有者?
有没有办法将其设为默认值,而不必确保我的所有表都是由正确的所有者创建的?
使用本地 docker 实例复制
Docker 命令启动 Postgres 数据库
docker run --rm --name database -v $(pwd)/setup.sql:/docker-entrypoint-initdb.d/setup.sql -e POSTGRES_USER=temp -e POSTGRES_PASSWORD=secret -e POSTGRES_DB=mydb postgres:9.6
setup.sql 的内容
ALTER ROLE postgres RENAME TO cloudsqladmin;
CREATE ROLE cloudsqlsuperuser WITH CREATEDB CREATEROLE;
ALTER DATABASE mydb OWNER TO cloudsqlsuperuser;
CREATE ROLE "postgres" WITH LOGIN CREATEDB CREATEROLE IN ROLE cloudsqlsuperuser;
在postgres下创建用户模拟Vault用户创建
docker exec -ti database psql -U postgres -d mydb -c "CREATE ROLE testuser WITH LOGIN IN ROLE cloudsqlsuperuser"
从 testuser 创建测试表
docker exec -ti database psql -U testuser -d mydb -c "CREATE TABLE test (col1 text)"
尝试选择显示错误的表
docker exec -ti database psql -U postgres -d mydb -c "SELECT * FROM test"
【问题讨论】:
-
是的,我知道如果我将
superuser添加到 postgres 角色中,这将起作用,但是 google-cloud-sql 不允许超级用户访问...
标签: postgresql permissions google-cloud-sql hashicorp-vault