Создавайте безопасные виды на снежинку - PullRequest
0 голосов
/ 21 ноября 2019

У меня есть таблица AAA , и я создал защищенное представление BBB поверх него с определением: create or replace secure view BBB as select * from AAA

Я предоставил право выбора на BBB на роль RRR .

, когда я выполняю select * from BBB, используя RRR , бросает SQL compilation error: Failure during expansion of view 'BBB': SQL compilation error: Object 'AAA' does not exist or not authorized.

сейчасКогда я предоставляю право выбора на AAA на роль RRR ,

, тот же запрос работает нормально. Это как безопасное представление должно работать? Потому что в этом случае таблица все еще доступна, и все ограничения, которые накладывает представление ограничения, могут быть отброшены путем прямого доступа к таблице. Это не звучит безопасно вообще.

Что мне здесь не хватает ???

Ответы [ 2 ]

1 голос
/ 21 ноября 2019

В дополнение к привилегии SELECT для представления вам необходимо предоставить USAGE для базы данных и схемы, содержащей представление:

grant usage on database <yourdb> to role RRR;
grant usage on schema <yourschema> to role RRR;

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

0 голосов
/ 21 ноября 2019
USE ROLE SECURITYADMIN;
--CREATE ROLE ADMIN_ROLE
CREATE ROLE IF NOT EXISTS ADMIN_ROLE;
GRANT USAGE ON WAREHOUSE ADMIN_WH TO ROLE ADMIN_ROLE;
GRANT ROLE ADMIN_ROLE TO ROLE SYSADMIN;

GRANT USAGE ON DATABASE EXISTING_DB TO ADMIN_ROLE;
GRANT USAGE ON SCHEMA EXISTING_DB.EXISTING_SCHEMA TO ADMIN_ROLE;
GRANT SELECT ON TABLE EXISTING_DB.EXISTING_SCHEMA.MYTABLE TO ADMIN_ROLE;

--CREATE DATA ROLES
CREATE ROLE IF NOT EXISTS USER_ROLE;
GRANT USAGE ON WAREHOUSE USER_WH TO ROLE USER_ROLE;

--USE NEW_DB DATABASE
USE DATABASE NEW_DB;
USE ROLE ADMIN_ROLE;
CREATE SCHEMA IF NOT EXISTS NEW_SCHEMA
GRANT USAGE ON DATABASE NEW_DB TO USER_ROLE;
GRANT USAGE ON SCHEMA NEW_DB.NEW_SCHEMA TO USER_ROLE;
GRANT SELECT ON FUTURE VIEWS IN SCHEMA NEW_DB.NEW_SCHEMA TO USER_ROLE;

CREATE OR REPLACE SECURE VIEW NEW_DB.NEW_SCHEMA.MY_SECURE_VIEW AS SELECT * FROM EXISTING_DB.EXISTING_SCHEMA.MYTABLE

USE ROLE SECURITYADMIN;
GRANT USAGE ON DATABASE EXISTING_DB TO USER_ROLE;
GRANT USAGE ON SCHEMA EXISTING_DB.EXISTING_SCHEMA TO USER_ROLE;
GRANT SELECT ON TABLE EXISTING_DB.EXISTING_SCHEMA.MYTABLE TO USER_ROLE;

REVOKE USAGE ON DATABASE EXISTING_DB FROM ADMIN_ROLE;
REVOKE USAGE ON SCHEMA EXISTING_DB.EXISTING_SCHEMA FROM ADMIN_ROLE;
REVOKE SELECT ON TABLE EXISTING_DB.EXISTING_SCHEMA.MYTABLE FROM ADMIN_ROLE;

CREATE ROLE IF NOT EXISTS TEAM_ROLE;
GRANT ROLE USER_ROLE TO TEAM_ROLE;

USE ROLE TEAM_ROLE;
SELECT * FROM NEW_DB.NEW_SCHEMA.MY_SECURE_VIEW

мой сценарий использования очень близок к этому фрагменту

, если я удаляю

GRANT SELECT ON TABLE EXISTING_DB.EXISTING_SCHEMA.MYTABLE TO ADMIN_ROLE;

Я не могу создать представление, если я удаляю

GRANT SELECT ON TABLE EXISTING_DB.EXISTING_SCHEMA.MYTABLE TO USER_ROLE;

затем

SELECT * FROM NEW_DB.NEW_SCHEMA.MY_SECURE_VIEW

терпит неудачу за исключением

SQL compilation error: Failure during expansion of view 'NEW_DB.NEW_SCHEMA.MY_SECURE_VIEW': SQL compilation error: Object 'EXISTING_DB.EXISTING_SCHEMA.MYTABLE' does not exist or not authorized.

Дайте мне знать, если у подхода есть некоторые основные недостатки ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...