在Oracle中进行PL / SQL工作的应用程序开发人员的安全性


13

您如何处理Oracle中缺少架构级别特权的问题?Oracle的安全体系结构适用于只需要对象级特权的应用程序,并且适用于几乎不需要限制的DBA。但是,对于使用前端应用程序和多种模式的PL / SQL进行开发的程序员而言,体系结构中似乎存在很大的漏洞。这是我的一些缺点:

  1. 使每个程序员都按照自己的模式进行开发。DBA将向需要它们的程序员授予对象级别的特权。任何软件包开发都必须由DBA完成。主要缺点是程序员会像使用存储桶一样使用数据库,从而损害数据库性能。我希望程序员在数据库中进行开发,但是这种方法会大大不利于它。

  2. 为每个程序员提供他们需要进行开发的十几种模式的用户名/密码。向这些应用程序模式授予创建过程,表等的权限。这种方法的一些缺点是程序员必须维护多个登录名,并且必须很少自己登录。跨模式开发也很困难。

  3. 向程序员授予开发所需的每个模式的代理身份验证特权。这使他们可以自己登录,而不必授予他们代理权限以外的其他权限。缺点包括程序员必须为其代理的每个模式维护独立的连接,跨模式开发更加麻烦,因为连接必须不断更改,并且使用带有已通过身份验证的公共数据库链接的程序包无法在代理连接内部进行编译。

  4. 给每个程序员DBA特权。–这里的缺点是安全性。不能将任何模式程序员挡在任何模式之外,并且任何程序员都可以模仿任何其他程序员(DBA)。

似乎缺少一个选项来授予每个程序员SELECT / INSERT / CREATE / etc。他们需要在其中进行开发的模式具有特权。他们使用一个连接以自己的身份登录以完成工作。他们有权访问的架构中的新对象将立即可用。

我想念什么吗?您如何处理进行PL / SQL开发的应用程序程序员?


3
+1重大问题-加上缺乏集成源代码控制,这是Oracle在多开发人员环境中的主要问题。
ScottCher 2011年

Answers:


11

当我在Oracle商店工作时,我们有一台特定的“开发”(开发)服务器,该服务器具有与“生产”(生产)服务器不同的安全限制。开发人员可以执行他们所需的任何操作,然后我们将必要的脚本交给DBA以应用于生产服务器。

在我们的关键系统(用于跟踪班级和学生的SCT Banner和Oracle Financials)的情况下,还有“测试”和“种子”服务器。测试是在用户从开发人员迁移到产品之前进行用户验收测试。“种子”是软件的常规安装,因此我们应该找到一个错误,我们可以验证它是否是我们引入的或者来自SCT或Oracle的软件。


+1使用我们的通用数据库,开发人员可以处理非常多种多样的项目,因此,最小特权原则将使他们甚至无法完全访问开发服务器。(en.wikipedia.org/wiki/Principle_of_least_privilege
利Riffel

@Leigh-我可能应该澄清一下...开发服务器在大多数情况下都属于#1,而不是#4
Joe

1
我记得从生产中克隆了DEV数据库,然后进行了复杂的拨款以使开发人员能够不受限制地工作。最后,为每个开发人员提供他们自己的数据库和DBA访问更加容易。然后将通过发布周期将更改输入Dev。现在通过虚拟化应该会更容易。
Sumnibot 2011年

@Sumnibot-与为每个开发人员授予权限相比,更容易为每个开发人员安装维护,备份等单独的数据库!除了保持每个更新所需的时间外,许可费用似乎还很可观,或者您没有给他们提供企业版吗?
Leigh Riffel

1
没有为我提供具体答案。
Michael-O

3

使用角色关联对象的集合,然后授予对角色的访问权限

GRANT语句允许DBA:

用户,角色和PUBLIC对特定对象的对象特权。表18-2列出了对象特权及其授权的操作。

由于可以向角色授予对象特权,因此授予角色对模式中所有表的访问权限相对容易:

sql>假脱机privs.sql
sql>选择“在斯科特上授予许可”。|| table_name || 角色选择;' 来自dba_tables,其中owner ='SCOTT';
sql> @ privs.sql
sql>将role_select授予john,sam,peter;

结合GRANT CREATE TABLE适当的模式用户发布给角色的信息,意味着开发人员可以选择和创建表。由于创建的表需要再次运行该脚本,因此它并不完美,但是WITH GRANT OPTION建议每个开发人员可以将对他们创建的表的访问权限授予适当的角色。

表明您可以创建可以执行适当的授予过程的DDL级别触发器,尽管显然需要进行大量测试,但应该可以使create table语句自动将适当的权限授予适当的角色。

编辑-

根据GRANTCREATE TABLE特权:

在被授予者的模式中创建一个表。

因此,通过为他们提供来自正确用户的create table,alter table等,他们应该能够像访问适当用户一样访问该用户的模式。


我已经看到您引用的方法没有成功。但是,我相信您可以通过大量测试来完成。问题在于,这仅允许开发人员选择对表的访问。直接或通过角色授予创建表的权限仅赋予他们根据自己的架构创建表的权限。他们仍然不能在除自身之外的任何模式中创建表,过程,程序包,触发器或任何其他对象,或者您是要指出的是,即使在开发时,他们也只能在自己的模式中创建对象?
Leigh Riffel

@Leigh更新了详细信息。
Brian Ballsun-Stanton

这不是Oracle的工作方式。尝试以下操作:创建由“ ThisIsMy1Password”标识的用户u1;创建由“ ThisIsMy1Password”标识的用户u2;将dba授予u1;授予连接到u2的权限;连接u1 /“ ThisIsMy1Password” @db; 将创建表授予u2;连接u2 /“ ThisIsMy1Password” @db; 创建表u1.t1(c1 varchar2(10)); 最后一步由于特权不足而失败。
Leigh Riffel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.