#postgresql #roles #privileges #grant
#postgresql #роли #привилегии #sql-грант
Вопрос:
У меня есть 2 базы данных Postgresql, называемые abc и xyz. Я хочу создать пользователя для каждого, который будет использоваться на веб-сайте, поэтому я создал пользователя с помощью команды типа:
CREATE ROLE abc LOGIN PASSWORD 'abc';
Затем я сделал это, чтобы предоставить им разрешение на доступ к базе данных:
GRANT ALL PRIVILEGES ON DATABASE abc TO abc;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO abc;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO abc;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL on TABLES TO abc;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL on SEQUENCES TO abc;
В этот момент пользователь abc может получить доступ к таблицам, и я полагаю, что любые будущие созданные таблицы.
Я заметил, что пользователь abc может видеть, что база данных xyz существует, и фактически входит в нее и видит схему, таблицы и даже структуру таблиц в pgAdmin.
Я бы хотел предотвратить это и заблокировать пользователя abc, чтобы он как можно больше знал только о базе данных abc.
Где я ошибся в этой конфигурации и каков наилучший способ заблокировать это?
Спасибо!
Ответ №1:
Вам придется запретить пользователю подключения к другой базе данных.
Есть две возможности:
-
Через разрешения базы данных:
-- by default, everybody can connect REVOKE CONNECT ON DATABASE other FROM PUBLIC; -- now you have to grant access to the legitimate users specifically GRANT CONNECT ON DATABASE other TO other_users;
-
Через
pg_hba.conf
.Не добавляйте запись в файл, к которому можно
abc
подключитьсяother
.Поэтому вместо того, чтобы
host all all 0.0.0.0/0 scram-sha-256
есть записи, подобные
host other other_users 0.0.0.0/0 scram-sha-256 host abc abc 0.0.0.0/0 scram-sha-256
Комментарии:
1. Спасибо, ОТЗЫВ / ПРЕДОСТАВЛЕНИЕ имеет смысл и работает хорошо. Я не думал о pg_hba.conf как о решении, но мне тоже нравится эта идея.