Проблема
Я пытаюсь настроить Хашикорп хранилище и Postgres в Google Cloud.
Я использую 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
я смогу пройти, это не поможет.
Текущие вопросы
Неужели владельцем должен быть группа cloudqlsuperuser, а не временный владелец?
Есть ли способ сделать это по умолчанию вместо того, чтобы убедиться, что все мои таблицы созданы с нужным владельцем?
Реплицировать с локальным экземпляром докера
Команда 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, имитирующего пользователя хранилищасоздание
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"