如何在Google云中設置保險庫和 Postgres 以獲得正確的權限?
問題
我正在嘗試在 Google Cloud中設置Hashicorp 保險庫和 Postgres。
我正在使用 liquibase 來管理架構,當它進行遷移時,它會從保管庫中檢索使用者名/密碼,然後在該使用者下執行以執行遷移。
但是,預設的 postgres 使用者或任何其他嘗試使用該表的使用者不能並接收
ERROR: permission denied for relation
.如果我理解正確,使用者是在以
postgres
. 這一切都在本地工作,但Google云的東西似乎以一種截然不同的方式設置。以下是一些輸出,可查看數據庫設置為:
\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"
簡短的摘要
您必須
REASSIGN OWNED BY "$VAULT_USERNAME" TO "cloudsqlsuperuser"
在表/序列/函式創建過程之後執行一個重新分配回公共角色的過程。更長的答案
Postgres 9.6
CREATE TABLE
預設會在使用者角色下創建表。因為保管庫使用者被設計為臨時憑證,所以我們還需要確保在臨時角色下創建的對像被重新分配回某種通用角色。在我在 Google Cloud 中概述的特定情況下,我們將重新分配回cloudsqlsuperuser
.我發現可以使用的一個命令是該
REASSIGN OWNED BY current_user to "cloudsqlsuperuser"
命令將獲取該臨時使用者擁有的所有對象並將其分配回該公共角色。獎勵:liquibase 配置
我正在使用 liquibase 進行遷移,這是在我的更改日誌中,用於在每次執行遷移時修復權限:
<databaseChangeLog> <changeSet author="elindblom" id="fix-permissions" context="" logicalFilePath="fix-permissions" runAlways="true" runOrder="last"> <sqlFile path="baselines/sql/fix-permissions.sql" splitStatements="false" relativeToChangelogFile="true" stripComments="false"/> </changeSet> ... rest of your change logs after ... </databaseChangeLog>
SQL 如下所示:
REASSIGN OWNED BY current_user TO "cloudsqlsuperuser";
一切都完成後執行,
changeSet
每次執行。非常重要的位是runAlways
和runOrder
元素。