Как запретить пользователю видеть другие базы данных и таблицы из других баз данных?
Я хочу создать пользователя postgres, который может получить доступ только к одной базе данных на сервере postgres.
В настоящее время мой поток:
create database database1;
create user user1 with password 'pass';
grant all privileges on database database1 to user1;
но user1 все еще может видеть список БД, пользователей, таблиц и т. д. Есть ли способ, чтобы этот пользователь не видел эту информацию? Пользователь должен иметь возможность писать и читать из этой базы данных.
Большое спасибо.
3 ответа
Каждый пользователь может видеть другие базы данных и роли в списке, но никогда не должен видеть таблицы в других базах данных.
Если вы отмените привилегию CONNECT для всех баз данных, кроме выделенной, пользователь не сможет получить доступ к содержимому других баз данных.
Роли и имена баз данных являются глобальными и не могут быть легко заблокированы. Вы можете попробовать предложение Фрэнка Хайкенса о выборочных отзывах в системных таблицах, но вы рискуете сделать это. Разработчики PostgreSQL в списках рассылки usenet препятствуют доступу к системным каталогам.
Psql, среди прочих инструментов, предполагает, что они будут доступны и плохо работают без них.
Почему плохо знать имена других баз данных и ролей?
ОТМЕНИТЕ разрешения SELECT для information_schema и некоторых разделов системного каталога.
По умолчанию любые создаваемые вами объекты создаются в общедоступной схеме. Кроме того, все пользователи, которых вы создаете, имеют права CREATE и USAGE в публичной схеме. Вы должны отозвать CREATE и USAGE для публичной схемы для этого пользователя или изменить уровень доступа по умолчанию. Вам также необходимо переместить базу данных, к которой этот пользователь имеет доступ, в схему пользователя или схему, доступную для пользователя. Смотрите схемы DDL в руководстве Postgres.
Вы можете легко запустить разные серверы PostgreSQL на одной машине (очевидно, на разных портах) - там не будет перекрестной видимости!