Что именно делает использование гранта на схеме?
Я пытаюсь создать в первый раз базу данных 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 ответа:
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затем установите его так, чтобы только ваш собственный пользователь мог получить доступ к каталогу или файлу (moderwx------on the dir, moderw-------в файле), то никто другой не может перечислить каталог, чтобы увидеть, что файл существует.если бы вы предоставили права на чтение мира в файле (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 ;