Как работают привилегии SELECT ANY TABLE в Oracle? - PullRequest
0 голосов
/ 12 ноября 2018

Я хотел бы знать, как привилегия SELECT ANY TABLE работает внутри Oracle.

Это рассматривается как единая привилегия? Или эквивалентно сделать GRANT SELECT ON MyTable TO MyUser для каждой таблицы?

Как пример, я хотел бы знать, если эта работа:

GRANT SELECT ANY TABLE TO PUBLIC;
REVOKE ALL ON MY_TABLE FROM PUBLIC;

Будет ли у меня доступ к MY_TABLE от любого пользователя после этих запросов?

1 Ответ

0 голосов
/ 12 ноября 2018

Да, все пользователи по-прежнему смогут запрашивать MY_TABLE.

Вы смотрите на типы привилегий :

Основные типы пользовательских привилегий:

  • Системные привилегии - Системная привилегия дает пользователю возможность выполнять определенное действие или выполнять действие над любыми объектами схемы определенного типа. Например, системная привилегия CREATE TABLE позволяет пользователю создавать таблицы в схеме, связанной с этим пользователем, а системная привилегия CREATE USER позволяет пользователю создавать пользователей базы данных.
  • Привилегии объекта - Objectprivilege дает пользователю возможность выполнять определенное действие с конкретным объектом схемы. Разные объектные привилегии доступны для разных типов объектов схемы. Привилегия выбирать строки из таблицы EMPLOYEES или удалять строки из таблицы DEPARTMENTS являются примерами привилегий объекта.

SELECT ANY TABLE - системная привилегия, которая позволяет получателю:

Запрос таблиц, представлений или материализованных представлений в любой схеме, кроме SYS. Получите блокировки строк, используя SELECT ... FOR UPDATE.

Когда вы предоставляете это как отдельную привилегию, видимую в dba_sys_privs. Когда Oracle решает, разрешен ли пользователю доступ к таблице, он может сначала посмотреть системные привилегии и продолжить поиск определенных привилегий объекта (видимых в dba_tab_privs), если нет системной привилегии, которая позволяет действию производится.

Системные привилегии не переводятся в индивидуальные привилегии для каждого объекта в базе данных - поддерживать это было бы ужасно, поскольку создание нового объекта должно было бы автоматически определять, кому должны быть предоставлены привилегии на основе системных привилегий; и это будет означать, что вы не сможете определить разницу между этим и индивидуально предоставленными привилегиями. Так, например, если вы явно предоставили select privs для конкретной таблицы, то пользователю было предоставлено SELECT ANY TABLE, а затем у него было отозвано SELECT ANY TABLE - что происходит с предыдущим явным предоставлением?

Ваш сценарий в основном такой же, за исключением того, что вы указали все привилегии для объекта, который нужно отозвать. Если это только две задействованные команды, то PUBLIC не имеет явных привилегий на MY_TABLE, поэтому отзыв на самом деле ничего не делает; но если бы какие-либо явные привилегии для этой таблицы были предоставлены, они были бы отменены. Это не влияет на системную привилегию SELECT ANY TABLE более высокого уровня.

Привилегии накапливаются; отзыв привилегии для определенного объекта не блокирует доступ к этому объекту, он просто удаляет один возможный маршрут доступа.

Кстати, надеюсь, вы использовали надуманный пример, поскольку такие мощные системные привилегии должны предоставляться экономно и только тогда, когда это действительно необходимо . Разрешение любому пользователю запрашивать любую таблицу в вашей базе данных потенциально может привести к большой дыре в модели безопасности. Снова из документов :

Oracle рекомендует предоставлять привилегии ANY только доверенным пользователям

и

Oracle рекомендует не предоставлять системные привилегии PUBLIC.

и подробности в руководстве по безопасности базы данных .

...