Безопасность на уровне столбца

9

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

Роберт
источник
1
Какой номер версии oracle (10.1 / 10.2 / 11.1 / 11.2) и вы используете Enterprise Edition / Standard Edition, а также есть ли у вас какие-либо дополнительные лицензионные опции (например, Oracle Advanced Security)?
Philᵀᴹ
10g R2 Enterprise Edition. Никаких дополнительных лицензированных функций, о которых я знаю.
Роберт

Ответы:

13

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

НАПРИМЕР:

SQL> create user reportuser identified by reportuser;

User created.

SQL> grant create session to reportuser;

Grant succeeded.

SQL> grant create synonym to reportuser;

Grant succeeded.

SQL> select user from dual;

USER
------------------------------
PHIL

SQL> create table basetable
(
  id number primary key,
  viewable varchar2(30),
  secret varchar2(30)
);

Table created.

SQL> insert into basetable values ( 1, 'hello world','this is secret' );

1 row created.

SQL> commit;

Commit complete.

SQL> create view reportview
as
select id, viewable
from basetable;

View created.

SQL> grant select on reportview to reportuser;

Grant succeeded.

SQL> conn reportuser/reportuser
Connected.
SQL> select * from phil.basetable;
select * from phil.basetable
                   *
ERROR at line 1:
ORA-00942: table or view does not exist

SQL> select secret from phil.basetable;
select secret from phil.basetable
                        *
ERROR at line 1:
ORA-00942: table or view does not exist

SQL> select * from phil.reportview;

        ID VIEWABLE
---------- ------------------------------
         1 hello world

SQL>

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

НАПРИМЕР:

SQL> select user from dual;

USER
------------------------------
REPORTUSER

SQL> create synonym basetable for phil.reportview;

Synonym created.

SQL> select * from basetable;

        ID VIEWABLE
---------- ------------------------------
         1 hello world

SQL>

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

Philᵀᴹ
источник
Спасибо за подробный ответ. Вы не знаете, как фильтровать саму таблицу. Это было бы намного более чистым решением для нас, поскольку у нас будет несколько таблиц, для которых это нужно сделать. Ваше решение может работать, хотя.
Роберт
2
Если вы аннулируете разрешения для рассматриваемых таблиц и создаете представления вместе с синонимом для каждого пользователя, имя которого совпадает с именем исходной таблицы, оно должно быть прозрачным.
Philᵀᴹ
Хорошо ... это имеет смысл. Я не думал о создании синонимов для пользователя. Поэтому мне нужно создать пользователя для отчетов, предоставить ему доступ ко всем таблицам, а затем удалить конкретные таблицы, о которых я беспокоюсь. После этого начните создавать представления, чтобы скрыть столбцы.
Роберт
Ага! Еще вопросы, смело возвращайтесь и спрашивайте. Не забудьте протестировать :)
Philᵀᴹ