Seguridad para desarrolladores de aplicaciones que realizan trabajo PL / SQL en Oracle

13

¿Cómo maneja la falta de privilegios de nivel de esquema en Oracle? La arquitectura de seguridad de Oracle funciona bien para aplicaciones que solo necesitan privilegios a nivel de objeto y funciona bien para DBA que necesitan pocas restricciones. Sin embargo, parece haber un gran vacío en la arquitectura para los programadores que realizan desarrollo con una aplicación front-end y PL / SQL en múltiples esquemas. Estas son algunas de mis opciones con sus desventajas:

  1. Haga que cada programador desarrolle en su propio esquema. El DBA otorgará privilegios a nivel de objeto a los programadores que los necesiten. Cualquier desarrollo de paquetes debe ser realizado por un DBA. El principal inconveniente es que los programadores usarán la base de datos como un cubo de bits en detrimento del rendimiento de la base de datos. Quiero que los programadores se desarrollen en la base de datos, pero este método lo desalentaría enormemente.

  2. Dé a cada programador el nombre de usuario / contraseña para la docena de esquemas que necesitan para desarrollar. Otorgue permiso a estos esquemas de aplicación para crear procedimientos, tablas, etc. Algunas de las desventajas de este enfoque son que los programadores tienen que mantener múltiples inicios de sesión y son rara vez iniciaron sesión como ellos mismos. El desarrollo de esquemas cruzados también es difícil.

  3. Otorgue a los programadores privilegios de autenticación de proxy en cada esquema para el que necesiten desarrollar. Esto los mantiene conectados como ellos mismos sin tener que otorgarles privilegios distintos del privilegio proxy. Las desventajas incluyen que los programadores tienen que mantener conexiones separadas para cada esquema que utilizan como proxy, el desarrollo de esquemas cruzados es más engorroso ya que las conexiones tienen que cambiar constantemente y los paquetes que usan enlaces de bases de datos públicas con autenticación aprobada no se compilarán dentro de las conexiones proxy.

  4. Otorgue a cada programador privilegios de DBA. - La desventaja aquí es la seguridad. Ningún programador de esquemas puede mantenerse fuera de ningún esquema y cualquier programador puede hacerse pasar por otro programador (DBA).

Parece que falta una opción para otorgar a cada programador SELECT / INSERT / CREATE / etc. privilegios sobre el esquema en el que necesitan desarrollar. Se conectan como ellos mismos para hacer su trabajo usando una conexión. Los nuevos objetos en el esquema al que tienen acceso están disponibles de inmediato.

¿Me estoy perdiendo de algo? ¿Cómo manejan los programadores de aplicaciones que realizan desarrollo PL / SQL?

Leigh Riffel
fuente
3
Gran pregunta +1: esto, junto con la falta de control de fuente integrado, es un problema importante con Oracle en un entorno de desarrolladores múltiples.
ScottCher

Respuestas:

11

En los días en que trabajaba en una tienda de Oracle, teníamos un servidor 'dev' (desarrollo) específico, que tenía diferentes restricciones de seguridad que el servidor 'prod' (producción). Los desarrolladores podían hacer lo que necesitaran, y luego entregaríamos los scripts necesarios al DBA para aplicarlos al servidor de producción.

En el caso de nuestros sistemas críticos (SCT Banner, para el seguimiento de clases y estudiantes, y Oracle Financials), también había servidores de 'prueba' y 'semilla'. La prueba fue para la prueba de aceptación del usuario antes de que las cosas migraran de dev a prod; 'seed' era una instalación estándar del software, por lo que si encontramos un error, podríamos verificar si fue algo que habíamos introducido o provenido de SCT o del software de Oracle.

Joe
fuente
+1 Con nuestra base de datos de uso general, los desarrolladores trabajan en proyectos muy diversos, por lo que el principio de menor privilegio no les daría acceso completo ni siquiera al servidor de desarrollo. ( en.wikipedia.org/wiki/Principle_of_least_privilege )
Leigh Riffel
@Leigh - Probablemente debería haber aclarado ... el servidor de desarrollo cayó en lo que tenías como # 1 en su mayor parte, no # 4
Joe
1
Recuerdo haber clonado bases de datos DEV de Production, luego complejas concesiones para permitir a los desarrolladores trabajar sin restricciones. Al final, fue más fácil dar a cada desarrollador su propia base de datos y acceso a DBA. Luego alimentaría los cambios en Dev mediante un ciclo de lanzamiento. Debería ser más fácil ahora con la virtualización.
Sumnibot
@Sumnibot - ¡Es más fácil instalar, mantener, hacer copias de seguridad, etc., una base de datos separada para cada desarrollador que otorgarles permisos! Además del tiempo requerido para mantener cada uno de estos actualizados, parecería que los costos de licencia serían considerables o ¿no les dio la versión empresarial?
Leigh Riffel
1
No contiene una respuesta concreta para mí.
Michael-O
3

Use roles para asociar colecciones de objetos, luego otorgue acceso a los roles

La declaración GRANT permite que el DBA:

Privilegios de objeto para un objeto particular para usuarios, roles y PUBLIC. La Tabla 18-2 enumera los privilegios de objeto y las operaciones que autorizan.

Como se pueden otorgar privilegios de objeto a un rol, es relativamente fácil otorgar acceso a un rol a todas las tablas de un esquema:

sql> spool privs.sql
sql> select 'grant select on scott.' || nombre_tabla || ' a role_select; ' de dba_tables donde owner = 'SCOTT';
sql> @ privs.sql
sql> grant role_select a john, sam, peter;

Esto, combinado con el problema GRANT CREATE TABLEemitido por el usuario de esquema apropiado para el rol, significa que los desarrolladores pueden seleccionar y crear tablas. No es perfecto, ya que una tabla creada requiere que el script se ejecute nuevamente, pero WITH GRANT OPTIONsugiere que cada desarrollador puede otorgar acceso a la tabla que creó para el rol apropiado.

Esto sugiere que puede crear activadores de nivel DDL que puedan ejecutar el proceso de concesión apropiado, aunque obviamente serán necesarias cantidades significativas de pruebas, debería ser posible hacer que la declaración de creación de tabla otorgue automáticamente los permisos apropiados a los roles apropiados.

Editar -

Según GRANT , el CREATE TABLEprivilegio:

Cree una tabla en el esquema del concesionario.

Por lo tanto, al darles la tabla de creación, la tabla de alteración, etc. del usuario correcto, deberían poder acceder al esquema de ese usuario como si fueran el usuario apropiado.

Brian Ballsun-Stanton
fuente
He visto que la metodología a la que hace referencia intentó sin mucho éxito; Sin embargo, creo que tiene razón en que podría hacerse con pruebas exhaustivas. El problema es que esto solo permite a los desarrolladores seleccionar el acceso a las tablas. Otorgar crear tabla directamente o mediante un rol solo les da privilegios de crear tabla en su propio esquema. Todavía no pueden crear tablas, procedimientos, paquetes, desencadenantes ni ningún otro objeto en ningún esquema, excepto el suyo, o ¿es su punto de vista que solo deberían crear objetos en su propio esquema incluso en el desarrollo?
Leigh Riffel
@Leigh Actualizado con detalles.
Brian Ballsun-Stanton
Así no es cómo funciona Oracle. Pruebe esto: cree el usuario u1 identificado por "ThisIsMy1Password"; crear usuario u2 identificado por "ThisIsMy1Password"; concede dba a u1; conceder conectarse a u2; connect u1 / "ThisIsMy1Password" @db; concede crear tabla a u2; connect u2 / "ThisIsMy1Password" @db; crear la tabla u1.t1 (c1 varchar2 (10)); El último paso falla con privilegios insuficientes.
Leigh Riffel