Privilegio de solo lectura sobre objetos

Por Ronald Vargas Quesada
Publicado en Marzo 2015

El otorgamiento de privilegios sobre objetos de la base de datos, es un tema que siempre se las va a traer consigo.

La mayor parte de las medidas que podemos brindar a nivel de seguridad granular en la base de datos, están asociadas a características de esenciales, que sólo están disponibles en la edición corporativa ( Enterprise Edition ).

En la última revisión liberada del motor de base de datos 12cR1, se cuenta con la disponibilidad de un nuevo privilegio, con el nombre de READ.

El privilegio de objeto READ se introduce en Oracle 12c base de datos (12.1.0.2) para otorgar privilegios de sólo lectura en una tabla a uno o varios usuarios, sin darles la posibilidad de bloquear las filas en la tabla, durante una consulta.

Observemos esta nueva funcionalidad.

Vamos a crear un usuario nuevo en nuestra base de datos de pruebas y luego vamos a asignar privilegios de consulta ( SELECT ) sobre un objeto del esquema SH.

login as: oracle
oracle@10.0.0.1's password:
Last login: Thu Feb  5 12:05:10 2015
[oracle@dbvisit01 ~]$ sqlplus /nolog

SQL*Plus: Release 12.1.0.2.0 Production  on Thu Feb 5 12:06:52 2015

Copyright (c) 1982, 2014, Oracle.  All rights reserved.

SQL> connect / as sysdba
Connected.

SQL> create user usuario_solo_lectura  identified by lectura;

User created.

SQL> grant create session to  usuario_solo_lectura;

Grant succeeded.

SQL> connect sh/sh
Connected.
SQL> create table solo_lectura (id number, descripcion  varchar2(20), constraint pk_solo_lectura primary key (id));

Table created.


Vamos a agregar unos cuantos registros a la nueva tabla.

SQL> insert into solo_lectura
2  select level, 'Descripcion de  '|| level from dual connect by level <= 10;

10 rows created.

SQL> commit;

Commit complete.


Seguidamente necesitamos otorgar privilegios sobre el nuevo objeto del esquema SH, al nuevo usuario usuario_solo_lectura.

SQL>

SQL> grant select on sh.solo_lectura  to usuario_solo_lectura;
Grant succeeded.


Probamos la efectividad del privilegio dado sobre el objeto del esquema SH, pero vamos a agregar a dicha consulta la cláusula FOR UPDATE, que es autorizada para el usuario usuario_solo_lectura, gracias al privilegio SELECT brindado por el dueño de la tabla.

SQL> connect usuario_solo_lectura/lectura
Connected.

SQL> select * from sh.solo_lectura  for update;

        ID DESCRIPCION
---------- --------------------
         1 Descripcion de  1
         2 Descripcion de  2
         3 Descripcion de  3
         4 Descripcion de  4
         5 Descripcion de  5
         6 Descripcion de  6
         7 Descripcion de  7
         8 Descripcion de  8
         9 Descripcion de  9
        10 Descripcion de  10

10 rows selected.


A partir del privilegio de consulta ( SELECT ) sobre la tabla solo_lectura del esquema SH, hemos provocado un serio problema no sólo de seguridad, sino también de rendimiento.

El usuario usuario_solo_lectura no puede actualizar los registros de la tabla solo_lectura, ya que no cuenta con privilegios de UPDATE; pero si logra bloquear el acceso a los datos para aquellos usuarios que en realidad si lo pueden hacer.

[oracle@dbvisit01 ~]$ sqlplus sh/sh

SQL*Plus: Release 12.1.0.2.0 Production  on Thu Feb 5 12:14:34 2015

Copyright (c) 1982, 2014, Oracle.  All rights reserved.

Last Successful login time: Thu Feb 05  2015 12:08:43 -06:00

Connected to:
Oracle Database 12c Enterprise Edition  Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced  Analytics and Real Application Testing options

SQL> update solo_lectura
     2  set id=id
     3  where id =1;



Al intentar actualizar los registros, la sesión de usuario por parte del dueño del objeto, queda en modo de bloqueo.

Si en la sesión que estamos logeados con el usuario usuario_solo_lectura nos salimos del SQL*PLUS el bloqueo es eliminado y se puede continuar con la acción de actualización.

SQL> exit
Disconnected from Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
[oracle@dbvisit01 ~]$

SQL> update solo_lectura
2  set id=id
3  where id =1;

1 row updated.

La solución


Para evitar estos problemas comunes de concurrencia y bloqueos en objetos de la base de datos, podemos revocar los privilegios de “SELECT” y otorgar el privilegio de “READ”.

SQL> revoke select on sh.solo_lectura  from usuario_solo_lectura;
Revoke succeeded.

SQL> grant read on sh.solo_lectura to  usuario_solo_lectura;
Grant succeeded.


Cuando en el código del aplicativo, se encuentre de manera explícita la sentencia “SELECT ... FOR UPDATE” esta dará un error de privilegios insuficientes.

[oracle@dbvisit01 ~]$ sqlplus usuario_solo_lectura/lectura

SQL*Plus: Release 12.1.0.2.0 Production  on Thu Feb 5 12:19:21 2015
Copyright (c) 1982, 2014, Oracle.  All rights reserved.
Last Successful login time: Thu Feb 05  2015 12:12:58 -06:00

Connected to:
Oracle Database 12c Enterprise Edition  Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced  Analytics and Real Application Testing options

SQL> select * from sh.solo_lectura  for update;
select * from sh.solo_lectura for update
*
ERROR at line 1:
ORA-01031: insufficient privileges
 
SQL> select * from sh.solo_lectura;

        ID DESCRIPCION
---------- --------------------
         1 Descripcion de  1
         2 Descripcion de  2
         3 Descripcion de  3
         4 Descripcion de  4
         5 Descripcion de  5
         6 Descripcion de  6
         7 Descripcion de  7
         8 Descripcion de  8
         9 Descripcion de  9
        10 Descripcion de  10

10 rows selected.



Ronald Vargas Quesada: Consultor, Profesor Universitario, Oracle Academy Instructor y Orador. Ronald tiene más de 25 años de experiencia en Oracle DBA. Él reside en Costa Rica y es responsable de la creación de las Centroamericano Oracle Grupos de usuarios. Es un participante activo en OracleMania, Comunidad Oracle Hispana y LAOUC y disfruta ayudando a sus compañeros para encontrar soluciones y respuestas en Oracle Technology. También el director de tecnología para la LAOUC. Fue instructor de la Universidad Oracle desde 2000-2007 y reconocido como uno de los 15 mejores instructores LAD por Oracle University. Se esfuerza por mantener su blog actualizado regularmente y disfruta de compartir sus pensamientos con la comunidad

Este artículo ha sido revisado por el equipo de productos Oracle y se encuentra en cumplimiento de las normas y prácticas para el uso de los productos Oracle.