Cuestiones sobre concesión de permisos y seguridad en Oracle

Cuestiones sobre concesión de permisos y seguridad en Oracle Carlos 24 Febrero, 2010 - 18:34

Abro este tema a propósito del artículo Grants with grant option, la propiedad transitiva en la concesión de permisos para comentar cualquier cuestión sobre el mismo, o temas relacionados con la seguridad, los roles y la concesión de permisos en Oracle.

q pasa si qiero dar los rpivilegios pero no solo a una tabla si no a todas a la ves

En respuesta a por Carlos

Buenas tardes,

 

En Oracle 10, desde el usuario "aplicacion1" ejecuto el comando  --> grant SELECT_ANY_TABLE to aplicacionadmin ;

Y me devuelve:

ORA-01919: el rol 'SELECT_ANY_TABLE' no existe

 

La idea es que desde aplicacionadmin se pueda realizar tareas de mantenimiento sobre todas las tablas de aplicacion1 y aplicacion2 asi como poder importar y exportar el esquema de cada uno de ellos teniendo su contenido en un tablespace en comun (TB_APLICACION)

 

¿Como puedo hacer esto?

 

Gracias

Hola, necesito crear una tabla en una session, donde esta tabla hace referencias a otras tablas que estan en otra session, me tira un error: previlegios insuficientes

En respuesta a por Anonimo (no verificado)

Seguramente es porque el usuario User1 que quiere crear la tabla TabA no tiene permisos asignados sobre la tabla TabB del otro esquema User2 a la que se hace referencia.

Para solucionarlo deberías conectarte con el User2 o un usuario de sistema y asignar los permisos necesarios al User1:

GRANT SELECT ON User2.TabA TO User1;

Carlos Fernández

Analista de sistemas

En respuesta a por Carlos

buen dia,

necesito de su colaboracion con los siguiente,

tengo tres usuarios y uno de ellos es un esquema (usuario1, usuario2, esq_usuario3),

como hago para crear roles y dar los siguientes privilegios:

1- el usuario1 puede consultar, actualizar, borrar, alterar, crear tablas o vistas en esq_usuario3

2- el usuario2 solo puede consultar las tablas y vistas del esquema esq_usuario3 tanto las actuales como las que se vayan creando, pero el usuario2 no puede actualizar, borrar, alterar ni crear tablas o vistas en esq_usuario3

3- el usuario1 no puede actualizar, borrar, alterar, crear tablas o vistas en ningun otro esquema diferente a esq_usuario3

En respuesta a por Anonimo (no verificado)

Sobre el punto 1, en principio, con Oracle no puedes dar a un usuario permisos de creación sobre un esquema del que no es propietario, o crea tablas en su propio esquema, o le das permisos para crear tablas en todos los esquemas.

Lo que te podría servir es utilizar el sistema de autenticación proxy que permite a un usuario autenticarse, pero obteniendo los permisos de otro usuario. Es decir, podrías dar al usuario1 permisos para autenticarse con los permisos del propietario de esq_usuario3 con una sentencia como esta:

ALTER USER usuario3 GRANT CONNECT THROUGH usuario1;

Entonces, al conectar con usuario1 tendrías permisos para crear tablas en el esquema del que usuario3 es OWNER.

 

Sobre el punto 2, ya sea con permisos directos o creando roles, que yo sepa no puedes definir en una sola sentencia que un usuario tenga sólo permisos de SELECT sobre todas las tablas y vistas de otro esquema, tienes que asignar los permisos específicamente para cada tabla o vista. No es complicado, pero te obliga a actualizar los permisos cada vez que se crea un objeto nuevo en el esquema, que es lo que entiendo que querías evitar.

Aqui comentábamos ya este tema, pero igualmente te copio un script para creación de un rol con permisos para los objetos de un usuario concreto que también te puede ser útil para la asignación de permisos. Recuerda revisarlo y adaptar los permisos para tus necesidades, como por ejemplo dejar sólo permisos de consulta para las tablas:

CREATE ROLE schem_b_user;

BEGIN
  dbms_output.enable(1000000);

    FOR x IN ( SELECT owner,
                      object_name,
                      DECODE(object_type, 'TABLE' ,   'select, insert, update, delete',
                                          'SEQUENCE', 'select',
                                          'VIEW',     'select',
                                                      'execute') AS privs,
                      DECODE (owner, 'USERA', 'SCHEMA_B_USER' ) AS app_user
                 FROM dba_objects
                WHERE object_type IN ('TABLE',    'PACKAGE', 'PROCEDURE',
                                      'FUNCTION', 'SEQUENCE', 'VIEW')
                  AND owner       IN ('USERA' ))
    LOOP
      BEGIN
         EXECUTE IMMEDIATE 'grant ' || x.privs       || ' on ' || x.owner ||
                           '.'      || x.object_name || ' to ' || x.app_user   ;
--        EXECUTE IMMEDIATE 'create or replace synonym '|| x.app_user||'.'||x.object_name||
--                           ' for ' ||x.owner||'.'||x.object_name ;
      EXCEPTION
        WHEN others THEN
          dbms_output.put_line('Bad owner = '||x.owner||';  Bad app_user='||x.app_user||
                               ';  Bad object_name='||x.object_name);
      END;
    END LOOP;
END;
/
GRANT schema_b_user TO userb;

 

El punto 3 ya lo tienes resuelto si sólo asignas los permisos especificos sobre objetos a cada usuario.

 

Gracias por el comentario.

 

Quisiera añadir que para que que 'U_CONSULTA' pueda trabajar sobre la VISTA sin que la base de datos le devuelva un ORA-00942, este procedimiento también daría resultado: 

   U_DATOS:
   SQL> GRANT SELECT ON TABLA TO U_VISTA WITH GRANT OPTION;

   U_VISTA:
   SQL> GRANT SELECT ON VISTA TO U_CONSULTA;

   U_CONSULTA:
   SQL> SELECT * FROM VISTA;

 

Se elimina por tanto la sentencia de concesión de permisos de U_VISTA a U_CONSULTA sobre el objeto U_DATOS.TABLA:

--   U_VISTA:
--   SQL> GRANT SELECT ON U_DATOS.TABLA TO U_CONSULTA;

 

Con este procedimiento, se restringe aún mas los permisos del usuario U_CONSULTA, ya que este sólo podría realizar una consulta a la vista VISTA y no a la tabla TABLA.
 

Saludos!

 

como podria crear un usuario  y brindarle el privilegio de crear tablas e indices

dentro del usuario system a otro usuario dentro de su sesion?

y que el primer usuario creado al dar privilegios al usuario que creara lo haga con with grant option

por que me marca error que solo con admin option

gracias de antemano

En respuesta a por Ryusaki (no verificado)

Ryusaki, creo que me he perdido, tendrás que explicarte mejor.
A lo mejor lo que quieres hacer es más complicado, pero de momento asegúrate de que al crear el usuario le asignas estos roles para poder conectarse y crear objetos en su propio esquema:
GRANT "CONNECT" TO "APP";
GRANT "RESOURCE" TO "APP";

En respuesta a por Carlos

 disculpa tienes razon tampoco me entendi muy bien,

pues en system debo crear a un usuario con privilegios restringidos

solo crear tablas, vistas e indices con la opcion with grant option, y dentro de ese usuario 

crear otro que tambien pueda crear vistas e indices,

pero me marca error que solo con with admin option o que no tengo suficientes

privilegios. 

gracias de antemano

En respuesta a por Ryusaki (no verificado)

Creo que el problema que tenemos es de nomenclatura. No se puede crear un usuario dentro de otro usuario. A los usuarios se les asigna un tablespace por defecto, que es donde se crean todos sus objetos, si no se especifica lo contrario.

Por lo que dices yo entiendo que quieres crear un primer usuario que pueda crear objetos en el tablespace del usuario SYSTEM. Lo que ya no me queda tan claro es cómo quieres crear el segundo, a lo mejor te sirve simplemente crear otro que también pueda crear objetos en el mismo tablespace.

Comentarte también que no es muy habitual ni recomendable que un usuario cree objetos en el tablespace de SYSTEM, este espacio se suele reservar para objetos del sistema, a menos que esté muy justificado lo que quieres hacer, yo lo haría sobre otro tablespace.

Te recomiendo echarle un vistazo al post Cómo crear un nuevo esquema en Oracle paso a paso, y si sigues teniendo problemas, concretando ya con tablespaces y usuarios seguro que nos terminamos de aclarar.

En respuesta a por Carlos

Saludos.

gracias de nuevo por tu respuesta.

y pues lo del usuario dentro de otro usuario es condicion para mi tarea, asi k no tengo opcion.

y lo peor de todo es que no puedo dar privilegios de system al primer usuario con with grant option

de crear tablas o vistas, y eso tambien es una condicion indispensable para entregar mi tarea,

y ademas tengo que validar que cada usuario creado solo pueda insertar datod dentro de  

una tabla (por ejemplo proyectos) pero que solo

pueda crear proyectos del departamento al que pertenece el usuario, como podria hacer eso? 

con trigger, procedimientos, funciones?

En respuesta a por Ryusaki (no verificado)

 Insisto en que no se puede crear un usuario dentro de otro usuario, puedes asignar a un usuario los mismos privilegios o los mismos roles que a otro, o que compartan el mismo tablespace, o que puedan hacer determinadas acciones sobre los mismos objetos, pero no hay usuarios dentro de otros.

Lo que sí hay, y a lo mejor te refieres a eso es que con la opción WITH GRANT OPTION puedes hacer que el usuario al que concedes privilegios sobre determinados objetos pueda a su vez concederlos a otros usuarios.

Por lo que comentas, seguramente lo que necesitas es conceder permisos de sistema en lugar de privilegios sobre objetos, y para ello, si quieres que el usuario 'autorizado' pueda a su vez conceder estos permisos has de utilizar la opción WITH ADMIN OPTION.

 

Sobre el control de los datos que un usuario inserta en una tabla, si se tratara de un control sencillo podrías utilizar un CHECK, pero por lo que comentas creo que lo más apropiado sería crear un TRIGGER del tipo BEFORE INSERT asociado a esta tabla que antes de cada INSERT haría la comprobación de que el usuario pertenezca al departamento.

buenas tardes yo voy hacer una base de datos en un solo computador q sentencia utilizo para q el resto de las computadoras tengan acceso a ella y poder ver todas las tablas como tambien agregar,eliminar y modificar registro?

gracisas

Saludos.
Deseo dar privilegios a un usuario para que pueda acceder y modificar los datos y la estructura de los objetos de un esquema. Como puedo hacer esto sin necesidad de ejecutar un grant individual por cada objeto del esquema?

Gracias de antemano por la ayuda.

En respuesta a por Reynaldo (no verificado)

Si quieres darle los privilegios sólo para un esquema creo que no te queda otro remedio que hacerlo objeto por objeto. La alternativa más parecida que se me ocurre es aplicar al usuario un grant de sistema, pero estos permisos los tendría para todos los esquemas:

SQL> GRANT SELECT ANY TABLE TO usuario;

 

De todas maneras, puedes utilizar el diccionario para crearte un script y 'automatizar' la concesión de permisos.

 

Puedes crear sinónimos para todos los objetos, para que el usuario no tenga que acceder con el formato 'esquema.tabla' a las tablas:

SELECT 'create public synonym ' || table_name || 
       ' for Esquema.' || table_name || ' to usuario;'
FROM dba_tables WHERE owner = 'Esquema';

 

Y sacar las sentencias de asignación de los permisos:

SELECT 'grant select, insert, update on Esquema.' 
       || table_name || ' to usuario;'
FROM dba_tables WHERE owner = 'Esquema';

 

En respuesta a por Carlos

Buenos Dias.
Soy nuevo en oracle y estube creando algunos roles especificamente para la creacion de objetos tales como tablas vista, secuencias entre otros mas y no consigo cual es el privilegio para crear  los COMMENT en las tablas. agradeseria su maximo apoyo en esto.

En respuesta a por Frank (no verificado)

Hola Frank

Si el usuario que utilizas es el propietario de las tablas no necesita ningún privilegio especial para crear comentarios en ellas.
Si, por ejemplo, el usuario miusuario ha creado la tabla mitabla podrás ejecutar sin problemas la sentencia:

COMMENT ON COLUMN mitabla.nombre IS 'mi comentario sobre el campo nombre';

Si el usuario que utilizas no es el owner de la tabla o vista que quieres comentar necesitará tener el privilegio COMMENT ANY TABLE y si se tratara de comentar en un índice necesitaría el COMMENT ANY INDEXTYPE.

Para concedérselo, con un usuario con privilegios de DBA (System, por ejemplo) ejecuta la sentencia:

GRANT COMMENT ANY TABLE TO miusuario;

 

Si me puede colaborar con lo siguiente

Desde un usuario con rol de administrador llamado “hr”  el cual es propietario de dos tablas llamadas “employess” y “departments” he creado un usuario llamado “usuario1” y he creado un rol llamado “palma” con privilegios para hacer select a las dos tablas mencionadas, para crear vistas, para crear tablas y para crear sesión, este rol se lo he dado a “usuario1”, además he creado un sinónimo público para cada una de las tablas, las siguientes son las sentencias

 

Créate user usuario1 identified by clave

create role palma

 

grant select on employees to palma

grant select on departments to palma

grant create view to palma

grant create table to palma

grant create session to palma

 

grant palma to usuario1

create or replace public synonym departments

for hr.departments

 

create or replace public synonym employess

for hr.employess

 

Mi problema es que al iniciar sesión con “usuario1” y tratar de crear una vista llamada “vista1” con la siguiente sentencia, me dice que no tengo privilegios suficientes para crear la vista.

 

create or replace view vista1 as

select * from employees

 

le agradezco si me puede ayudar con este inconveniente.

 

 

 

Las sentencias son exactamente como las escribes? Porque al sinónimo le llamas 'employess', y la vista la creas sobre 'employees'

De todas maneras, para no liarte con el sinónimo puedes crear la vista haciendo referencia directa a la tabla, en lugar del sinónimo:

create or replace view vista1 as select * from hr.employees

 

Hola!! Tengo una duda acerca de el otorgar privilegios, necesito crear un usuario que pueda consultar todas las tablas menos 1 (cliente por ejemplo) le hago el grant select any table to usuario1 pro no se como quitarle el permiso a esa unica tabla?? gracias!!

buenas tardes Señores, Tengo un dilema , les escribo por si me pueden ayudar, tengo una tabla el cual hago un select en pl y muestra correctamente los registros, sin embargo si este select lo ato un reporte, me genera un error de tabla o vista no existe. He chequeado los permisos, sinonimos y nada.. De antemano agradezco su colaboración. Saludos!

hola necesito ayuda para hacer una modificacion de character set
estoy utilizando Oracle 11 y mi schema ya esta en producción
trato de alterar la tabla:

ALTER TABLE ESCOLARIDAD CHARACTER SET utf8;
pero me manda el siguiente error :
Informe de error:
Error SQL: ORA-01735: opción ALTER TABLE no válida
01735. 00000 - "invalid ALTER TABLE option"
pense que eran los privilegios del usuario pero ya tiene todos los privilegios hacia una tabla
y gracias de antemano =)

Hola a todos, tengo el siguiente problema, al iniciar la implementacion de un aplicativo sobre oracle 11g ,se le dio permisos de dba a un usuario, ahora la auditoria solicita quitar estos permios de dba, los quite pero empezaron a salir mensajes en el aplicativo al ejecutar algo como "no existen privilegios en tablespace USERS",revisé y hay muchas tablas creadas en el tablespace "users" por este usuario, pero el usuario tiene un tablespace asignado llamado PALMA. Q instruccion debo ejecutar para darle privilegios sobre este tablespace especificamente a esas tablas Y Puedo cambiar estas tablas al tablespaces Palma?

Sobre los permisos, los usuarios tienen un tablespace definido por defecto, pero los permisos se definen más bien sobre las tablas, no sobre los tablespaces. Puede que el problema sea que al quitarle los privilegios de DBA necesites asignar algún permiso genérico. Te enlazo un artículo en el que se comenta cómo crear un nuevo esquema de usuario desarrollador de Oracle para que puedas revisar si tu usuario tiene los permisos básicos para trabajar.

Sobre mover las tablas a otro Tablespace, enlazo otro post en el que se explica cómo unificar tablespaces en Oracle 10g, ojo con esta operación, que no es complicada, pero es delicada, si lo haces prepáralo bien y te recomiendo que hagas antes una prueba con una tabla que no utilice nadie.

 

Hola,
Desde hace un par de dias que estoy leiendoel foro, y hoy he pensado participar,
Un saludo.

Buenas tardes solicito su ayuda mi problema es el siguiente:
Desde el usuario system@xe; connect Normal, trato de compilar un pck que tiene en uno de sus cursores la vista v$process, pero obtengo como error: La tabla o vista no existe, pensé que era por permisos de administrador, pero me sigue saliendo el mismo error. Necesito compilar el pck pero con conexión Normal, porque en SYSDBA no me aparece este error, pero las tablas que se encuentran en el pck y otros prc, los tengo creados en modo de conexión normal, y al pasar a conexión SYSDBA las tablas creadas aparecen que no existen.

Prueba a poner delante de los objetos el nombre del propietario. Como SYSDBA has de tener acceso a todo, pero si la tabla la ha creado otro usuario y no hay ningún sinónimo público definido sobre la misma has de indicar delante de la misma el usario propietario.

Por ejemplo: SELECT * FROM usuario.tabla

hola buenas, tengo este codigo para generar dos tablas y me da error el crearlas, me podrias decir en q fallo?

CREATE TABLE DIRECCIN(
IDDIRECCION NCHAR(7) NOT NULL CONSTRAINT PK_IDDIRECCION PRIMARY KEY,
CALLE VARCHAR2(30) NOT NULL,
NUMERO NCHAR(4),
PISO NCHAR(2),
LETRA CHAR(2),
CP NCHAR(5),
POBLACION NCHAR(15) NOT NULL
);

Buenas, Me gustaría que pudieran ayudarme con un problema. Tengo creadas unas tablas ya con sus respectivos synonimos y con los privilegios asignados. Sin enbargo cuando intento jalar esa tabla desde APEX, éste no puede ver las tablas que he creado!! Que debo hacer para que las tablas puedan ser vistas por APEX???

hola carlos un favor soy nuevo en esto de los permisos mira este es mi problema

 

tengo un usuario 'sisalman' con varias tablas, lo que me piden es crear otro usuario 'basico' el cual pueda ver todas las tablas del usuario 'sisalman' pero que solo pueda ejecutar sentencias select, para esto estoy usando Oracle 10G y Toad 9, te agradesco mucho

Hola a todos

Quisiera pedirles su apoyo.

Tengo una funcion que levanta un concurrente en oracle. Si la ejecuto en el esquema apps funciona bien pero si lo hago desde apex no levanta el concurrente.

 

Ya le di permisos al esquema para que vea la funcion, ya no me marca error en cuanto a que no la ve pero sigue sin levantar el concurrente.

 

Hay algo mas que deba hacer para apex pueda levantar el concurrente en oracle?

 

Saludos y gracias

buen dia, necsito de su colaboracion con los siguiente, tengo tres usuarios y uno de ellos es un esquema (usuario1, usuario2, esq_usuario3), como hago para crear roles y dar los siguientes privilegios:

1- el usuario1 puede consultar, actualizar, borrar, alterar, crear tablas o vistas en esq_usuario3

2- el usuario2 solo puede consultar las tablas y vistas del esquema esq_usuario3 tanto las actuales como las que se vallan creando, pero el usuario2 no puede actualizar, borrar, alterar ni crear tablas o vistas en esq_usuario3

3- el usuario1 no puede actualizar, borrar, alterar, crear tablas o vistas en ningun otro esquema diferente a esq_usuario3;

Buenas, Quisiera que me ayudara sobre un problema que tengo.

La Version de Oracle que uso es la versión 11.2.0.4. y bueno de lo que se trata el problema es que hay usuarios que no tienen permisos de actualización (update) sobre una determinada tabla pero al intentar el usuario hacer un “select for update” sobre esa tabla por más que le haya salido mensaje de que no tiene permisos, aun así logra bloquear la tabla y varios usuarios que si tienen permisos de update no puedan actualizar la tabla porque esta bloqueada debido al usuario que no tiene permisos de update y bloqueo la tabla y lo que se quiere es que por mas que intente hacer un "select for update", aparte de que no pueda hacerlo se desea que tampoco bloquee la tabla y no ocasione el problema.

He estado revisando y encontre una solución pero para la version 12c y no para la 11g en la que a un usuario se le quita los privilegios de select y se le otorga 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.

Como podria otorgar permisos de lectura a un usuario para una determinada tabla para que no ocasione esos problemas mas o menos como el privilegio READ en la version 12c.

 

Gracias de Antemano.

Buenas tengo una duda con un script en oracle 12c soy nuevo utilizado oracle Como genero un script que me autogenere el bloqueo de todos los usuarios de la base de datos excluyendo SYS - SYSTEM