Seguridad de nivel de columna


9

Necesito una solución para ocultar columnas específicas en una tabla. Tenemos personas que necesitan crear informes con esta base de datos y específicamente algunas de estas tablas con información confidencial, pero no se les permite ver elementos como salario o SSN. ¿Es posible filtrar columnas específicas para los usuarios?


1
¿Qué número de versión de Oracle (10.1 / 10.2 / 11.1 / 11.2) y está utilizando Enterprise Edition / Standard Edition, además, ¿tiene alguna opción adicional con licencia (Oracle Advanced Security, por ejemplo)?
Philᵀᴹ

10g R2 Enterprise Edition. No hay características adicionales con licencia que yo sepa.
Robert

Respuestas:


13

Puede hacer esto con una vista normal, siempre y cuando los usuarios involucrados no tengan acceso a la tabla base.

P.EJ:

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>

Si revoca los permisos en las tablas en cuestión y crea las vistas, junto con un sinónimo para cada vista de usuarios que tenga el mismo nombre que la tabla original, debe ser transparente.

P.EJ:

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>

También puede hacer esto con Virtual Private Database , pero creo que es una opción costosa con licencia adicional. Utiliza DBMS_RLS para configurar las políticas de seguridad relevantes que necesita.


Gracias por la respuesta detallada. De ninguna manera es consciente de filtrar en la tabla en sí. Esta sería una solución mucho más limpia para nosotros, ya que vamos a tener varias tablas para hacer esto. Sin embargo, su solución podría funcionar.
Robert

2
Si revoca los permisos en las tablas en cuestión y crea las vistas, junto con un sinónimo para cada usuario que tenga el mismo nombre que la tabla original, debe ser transparente.
Philᵀᴹ

Ok ... eso tiene sentido. No estaba pensando en crear sinónimos para el usuario. Por lo tanto, necesito crear un usuario de informes, otorgarles acceso a todas las tablas y luego eliminar las tablas específicas que me preocupan. Después de eso, comience a crear las vistas para ocultar las columnas.
Robert

¡Sip! Cualquier otra pregunta, no dudes en responder y preguntar. No te olvides de probar :)
Philᵀᴹ
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.