Что именно делает использование гранта на схеме?


Я пытаюсь создать в первый раз базу данных Postgres, так что это, вероятно, глупый вопрос. Я назначил основные разрешения только для чтения роли БД, которая должна получить доступ к базе данных из моих PHP-скриптов, и у меня есть любопытство: если я выполняю

GRANT some_or_all_privileges ON ALL TABLES IN SCHEMA schema TO role;

есть ли необходимость выполнить

GRANT USAGE ON SCHEMA schema TO role;

?

С документация:

использование: для схем, позволяет получить доступ к объектам, содержащимся в указанная схема (при условии, что собственные привилегии объектов требований). По существу, это позволяет грантополучателю "поиск" объектов внутри схемы.

Я думаю, что если я могу выбрать или манипулировать любыми данными, содержащимися в схеме, я могу получить доступ к любым объектам самой схемы. Я ошибаюсь? Если нет, то GRANT USAGE ON SCHEMA используется для? И что именно означает документация с "предполагая, что собственные требования привилегий объектов также выполняются"?

2 69

2 ответа:

GRANTs на разных объектах разделены. GRANTing в базе данных не GRANT права на схему внутри. Аналогично,GRANTing на схеме не предоставляет права на таблицы внутри.

если у вас есть права на SELECT из таблицы, но не право видеть его в схеме, которая содержит его, то вы не можете получить доступ к таблице.

тесты прав выполняются по порядку:

Do you have `USAGE` on the schema? 
    No:  Reject access. 
    Yes: Do you also have the appropriate rights on the table? 
        No:  Reject access. 
        Yes: Check column privileges.

ваша путаница может возникнуть из-за того, что public схема имеет значение по умолчанию GRANT всех прав на роль public, членом которого является каждый пользователь/группа. Таким образом, у всех уже есть использование этой схемы.

фаза:

(при условии, что собственные требования привилегий объектов также выполняются)

говорит, что вы должны иметь USAGE на схеме использовать объекты внутри него, но имеющие USAGE на схеме не является его самодостаточным, чтобы использовать объекты внутри схемы, вы также должны быть права на сами объекты.

это как дерево каталогов. Если вы создадите каталог somedir "файл"somefile затем установите его так, чтобы только ваш собственный пользователь мог получить доступ к каталогу или файлу (mode rwx------ on the dir, mode rw------- в файле), то никто другой не может перечислить каталог, чтобы увидеть, что файл существует.

если бы вы предоставили права на чтение мира в файле (mode rw-r--r--), но не измените разрешения для каталога это иметь никакого значения. Никто не мог посмотреть файл для того, чтобы прочитать его, потому что у них нет прав на список каталога.

если вы вместо этого установите rwx-r-xr-x в каталоге, установив его так, чтобы люди могли перечислять и пересекать каталог, но не изменяя разрешения файлов, люди могли список файл, но не может читать это потому, что у них не было бы доступа к файлу.

необходимо указать и разрешения для людей, чтобы иметь возможность просмотреть файл.

то же самое в Pg. Вам нужны обе схемы USAGE права и права объекта на выполнение действия над объектом, например SELECT из таблицы.

(аналогия немного падает в том, что PostgreSQL еще не имеет безопасности на уровне строк, поэтому пользователь все еще может "видеть", что таблица существует в схеме по SELECTing от pg_class напрямую. Они не могут взаимодействовать с ним в любом случае, так что это просто " список" что не совсем то же самое.)

для производственной системы можно использовать следующую конфигурацию:

--ACCESS DB
REVOKE CONNECT ON DATABASE nova FROM PUBLIC;
GRANT  CONNECT ON DATABASE nova  TO user;

--ACCESS SCHEMA
REVOKE ALL     ON SCHEMA public FROM PUBLIC;
GRANT  USAGE   ON SCHEMA public  TO user;

--ACCESS TABLES
REVOKE ALL ON ALL TABLES IN SCHEMA public FROM PUBLIC ;
GRANT SELECT                         ON ALL TABLES IN SCHEMA public TO read_only ;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO read_write ;
GRANT ALL                            ON ALL TABLES IN SCHEMA public TO admin ;