Web应用程序的数据库, 只从安全的角度看,有什么论据反击的点的SP只有在应用数据库帐户对SPS表和视图,只有高管没有任何权利的解决方案?
如果有人拦截应用数据库帐户,暴露在攻击面要少得多然后当表和视图不被暴露。 哪些安全优势将非SP解决方案提供(或不)? 我看到许多优点,以使用非SP解决方案,但暴露的所有表让我有点担心。
现在的问题是主要的数据库供应商一般产品,但具体而言,SQL Server 2008中。
Web应用程序的数据库, 只从安全的角度看,有什么论据反击的点的SP只有在应用数据库帐户对SPS表和视图,只有高管没有任何权利的解决方案?
如果有人拦截应用数据库帐户,暴露在攻击面要少得多然后当表和视图不被暴露。 哪些安全优势将非SP解决方案提供(或不)? 我看到许多优点,以使用非SP解决方案,但暴露的所有表让我有点担心。
现在的问题是主要的数据库供应商一般产品,但具体而言,SQL Server 2008中。
从只有安全的角度来看,我看不出任何优势的非SP的方法将有超过一个SP的方法,因为:
我们认为,需要真正安全的系统,说公司的会计制度。 如果您使用特效,并只授予对特效的访问,那么用户就无法做得比PROC做什么其他事情,永远。 这是一个内部控制的设计,以确保该系统的业务规则不能被周围由系统中的任何用户得到。 这是阻止人们做出购买公司,然后自己批准开放的大门诈骗的资金。 这也使许多人在组织中的删除所有记录在账目表,因为他们没有,除了从PROC授予那些删除权限将只允许一个同时删除。
现在,开发人员必须有为了开发更多的权利,但如果过你要考虑安全性,他们不应该有一个生产机器上更多的权利。 真正的开发人员可以编写的恶意SP投入PROD时做坏事。 这同开发商虽然可以把相同的代码到应用程序的版本,并为可能被捕获或者不causght仿佛他们恶意更改PROC。 我个人认为,PROC可以通过这可能意味着经理或配置管理人员和数据库管理员有机会来看看它的副不仅仅是经理或配置管理人员数据库管理员可以更容易捕捉,因为它可能会从代码分开reveiwed。 我们都知道的现实是,没有人推代码督促有权审查每一件往心里去时间,所以雇用值得信赖的开发商是至关重要的。 有代码审查和源代码控制到位可以帮助找到恶意更改或回滚到以前的版本,但使用SPS副应用程序代码都在开发商的风险不管是什么。
这同样适用于系统管理员正确的。 在必须以做好本职工作的充分权利的制度。 他们有可能造成很大的伤害没有被抓住。 你可以在这种情况下,做的最好的是限制这种访问尽可能少的人能够做最好的,你可以在雇用值得信赖的人。 至少如果你有几个人有这种机会,很容易在其发生时找到问题的根源。 您可以通过具有异地备份最大限度地降低风险(所以至少是管理员休息,如果他们转坏,可以固定在一定程度上),但是你永远不能完全摆脱这种风险。 再次,这是真的不管你允许应用程序访问数据何种方式。
所以真正使用SPS的不是消除所有可能的风险,但做起来很更少的人可以破坏系统。 使用应用程序代码的影响数据库的信息本质上是不安全的,在我看来不应该在任何系统中存储的财务信息或个人信息被允许。
最大的安全优势,以不使用存储过程的透明度。 你确切地知道一个账户可以做,通过观察它有什么对表的访问。 使用存储过程,这不是必然的情况。 如果一个帐户具有执行程序X的能力,这并不帐户限制为执行这一点,不打一个基础表,但X可以做任何事情。 它可以删除表,更改数据,删除数据等。
要知道一个账户可以与你必须看看存储过程的存储过程做。 每一个存储过程被更新时,会有人来看看它做什么,以确保事情没有得到“意外”摆在那。 在存储过程的安全性,真正的问题来自于组织内部,而不是流氓攻击。
下面是一个例子:
比方说,你想限制访问的职员表。 如果没有存储过程,你只是拒绝访问该表。 要访问一个人非常有公然要求您授予权限。 当然,他们可以让你运行一个脚本来授予访问权限,但大多数人至少试着回顾脚本改变数据库模式(假设脚本不更新一个存储过程,我将谈论下文)。
有可能数以百计的应用程序存储过程。 根据我的经验,他们得到相当频繁更新,在这里添加一个字段,删除一个人也没有。 对于其他人检查更新程序脚本数量所有的时间变得艰巨,而且在大多数组织数据库团队开始只迅速看过程(或不看它全部),并沿其移动。 这是真正的问题用武之地。现在,在这个例子中,如果有人对IT人员希望允许访问一个表,这个人只是需要一行代码滑倒授权访问或者做一些事情。 在一个完美的世界,这将被逮住。 我们大多数人不会在一个完美的世界而努力。
使用存储过程的真正问题是,他们混淆的水平添加到系统中。 随着混淆自带的复杂性,并与复杂性来自最终更多的工作来了解一个管理金融底层系统。 大多数人在IT超负荷工作和事情漏网之鱼。 在这种情况下,你不要试图攻击系统获取,使用人负责制,以得到你想要的。 米特尼克是正确的,在安全的人的问题。
对一个组织的大多数攻击都来自内部。 您介绍的复杂性到任何系统中的任何时候,孔出现,事情可能会被忽视。 不信的话,想想你在哪里工作。 通过对谁你会问到可以访问系统中的所有步骤。 很快你意识到你可以让人们在适当的时候忽略的东西。 关键成功穿透系统,参与的人是做一些事情,这似乎无伤大雅,但确实是颠覆性的。
请记住,如果我试图攻击系统:我不是你的朋友; 我对你的孩子或爱好不感兴趣; 我会用你得到我想要的任何必要的方式; 如果我背叛你,我不在乎。 的想法“但他是我的朋友,这就是为什么我相信他相信他在做什么是正确的”,是在事后不舒适。
这是传统的智慧是正确的一个领域:刚刚露出的存储过程为您提供了更安全的控制。 给人以表和视图直接访问更容易,并且有你需要做的是时间,但它将会是不太安全。
嗯,我猜你真正抓住了问题你自己的核心:如果你不使用存储过程的所有CRUD操作,你必须给予至少一个应用程序特定的数据库用户帐户中的所有表至少SELECT权限。
如果你想允许DB帐户做更多的工作,该帐户可能还需要其他权限,如能更新和某些表可能删除。
我没有看到一个非存储PROC方针如何有任何保障福利 - 它打开大门更加公正一点,真正的问题是:你能负担得起? 你能保证特定应用程序,数据库帐户足够的,所以它不会破坏系统的整体安全性?
一个可能的折衷方案可能是使用视图或访问表允许SELECT,但应付一切使用存储的特效(更新,删除,插入) - 半安全,便捷的一半...
因为它往往是 - 这是方便之间的经典折衷(非SP的方法;使用ORM可能)和安全性(所有存储过程的方法,可能更麻烦,但是比较安全)。
渣
除了与存储过程的传统安全分离(EXEC权限的程序,依靠所有权链接数据访问)存储过程可以是代码签署 ,导致非常细致和具体的访问控制像链接服务器的任何服务器功能, 服务器范围的管理视图 ,受控访问存储过程和其它数据库中的数据,即使用户通常存取的外部。
在T-SQL批生产的,无论多么花哨,以及如何在代码生成和ORM层的许多层是它的背后,根本无法进行签名,因此不能使用可用的最具体和最强大的访问控制机制的一个普通请求。
这是一个不完美的比喻,但我喜欢表中的DB的“DBO”模式比作“私人”数据OO术语,视图和存储的特效为“公开”。 人们甚至可以做一个“公”的模式从dbo架构做出区分明确分开。 如果你按照这个想法,你会得到一个安全优势以及可扩展性的优势。
一个帐户(而不是Web应用程序的帐户)具有DBO访问和拥有数据库,Web应用程序使用限于面向公众的结构,另一个帐户连接。
对唯一可能的论点是,我遇到了这里特定的陈述不能有效地在SP参数(并且需要动态SQL)的情况下,这给你-SP SQL注入的可能性。 这是真的但是一个非常狭窄的考虑,这是一个罕见的情况。 至少在我的PostgreSQL中看到了一些情况下,这一点也受到额外的审查,而有一次。
综合来看,即使在这种情况下,我认为,SP类型的方法给你的好处安全明智的,因为它们意味着应用程序可以使用通用的防SQL注入机制,它可能否则是不可能的,并且可以使用你的SP许多应用程序。 此外,如果所有的活动都必须通过SP的,那么你可以减少你暴露于SQL注入和集中审计的问题。
在一般情况下,较少的用户可以做到少保曝光一般是有。 这意味着更少的用户可以使用SQL注入攻击做。
存储过程通常提供更好的和更细粒度的安全比你也离不开谁。
大部分的答案在这里指定使用存储过程的安全性优势。 如果没有忽视这些优势,有没有提到的几大缺点:
数据访问模式有时比正在做一个具体的程序重要得多 。 我们希望记录/监视/分析/加注谁访问数据,何时以及如何报警/块。 使用存储过程时,我们不能总是得到这样的信息。
有些组织可能有万吨的存储过程 。 这是不可能的审查所有的人,这可能更有意义专注于表(特别是考虑到存储过程可能是非常复杂的时候,有错误,并引入其他安全问题)。
有些组织可能需要关注点分离 。 数据库管理员(或谁写存储过程的人)并不总是安全的个人的一部分。 这有时是必要的安全个人只专注于仅仅因为他们是不负责的业务逻辑和做编写业务逻辑的球员的数据,不能完全信任。