Минимальные права доступа для чтения только одной таблицы в PostgreSQL

10

Ниже приведен список команд, которые, кажется, работают для создания нового пользователя (входа в систему) и предоставления доступа только для чтения к одной указанной таблице в PostgreSQL.

Предположим, что эти команды выполняются при входе в систему с достаточными привилегиями (т.е. при postgresвходе в систему при установке по умолчанию).

CREATE ROLE user_name NOSUPERUSER NOCREATEDB 
NOCREATEROLE NOINHERIT LOGIN PASSWORD 'pwd' VALID UNTIL 'infinity';

Теперь я хочу предоставить selectтаблицу tab_abcна базе данных db_xyz, так что здесь (база данных db_xyzвыбрана текущей через PgAdmin или что-то в этом роде):

grant select on tab_abc to user_name;

Вопрос: достаточно ли этого или должно быть больше грантов (база данных connect, usageможет быть)?

Эти команды, кажется, работают для меня, но моя установка по умолчанию имеет настройки безопасности по умолчанию. Какие дополнительные гранты я должен добавить, если администратор сервера настроил более строгую безопасность?

Похоже, мне не нужно connectни давать, ни usage- не подразумевается ли это при предоставлении select? Это всегда так?

WildWezyr
источник

Ответы:

12

Вопрос: достаточно ли этого или должно быть больше грантов (подключение к базе данных, возможно, использование)?

Безопасность может быть усилена по умолчанию в основном в следующих точках:

  • pg_hba.confФайл. Он фильтрует соединения, прежде чем рассматривается какая-либо привилегия базы данных. Значение по умолчанию относительно открыто для локальных подключений, но оно может быть ограничено явным списком баз данных, имен пользователей и сетевых источников.

  • Разрешения для публики , псевдо-роль, которая есть у каждого. Пользователь может неявно подключиться, только если ему предоставлена ​​привилегия подключения PUBLIC. См. Созданный пользователь может получить доступ ко всем базам данных в PostgreSQL без каких-либо полномочий . База данных может иметь все привилегии, отозванные у общественности. Смотрите REVOKE в документе, чтобы узнать основную версию PostgreSQL, которую вы используете.

  • Существование publicсхемы. Для удобства он создан с базой данных по умолчанию, но это не обязательно. Вместо удаления общедоступных разрешений из publicсхемы администраторам баз данных может иметь смысл просто отбросить publicсхему, когда у новых пользователей вообще не должно быть никаких неявных разрешений.

В случае, если эти значения по умолчанию были удалены, для чтения одной таблицы должен быть предоставлен новый пользователь:

GRANT CONNECT ON DATABASE dbname TO username;

На уровне базы данных:

GRANT USAGE ON SCHEMA schemaname TO username;
GRANT SELECT ON schemaname.tablename TO username;
Даниэль Верите
источник