Postgresql

如何在Google云中設置保險庫和 Postgres 以獲得正確的權限?

  • June 27, 2018

問題

我正在嘗試在 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.6CREATE 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每次執行。非常重要的位是runAlwaysrunOrder元素。

引用自:https://dba.stackexchange.com/questions/208649