对于Web应用程序数据库,从安全角度来看仅,哪些参数与sp唯一解决方案相反,其中app db帐户对表和视图没有权限且只执行exec SPS?
如果有人拦截了app db帐户,那么暴露在攻击中的表面区域就会比没有公开表格和视图时要小得多。非sp解决方案提供(或不提供)的安全优势是什么?我看到使用非sp解决方案有很多好处,但暴露所有表格让我有点担心。
问题是一般的主要数据库供应商产品,特别是sql server 2008。
答案 0 :(得分:13)
仅从安全角度来看,我看不到非SP方法对SP方法的任何优势,因为:
答案 1 :(得分:6)
让我们采用一个需要非常安全的系统,比如贵公司的会计系统。如果你使用procs并仅授予对procs的访问权限,那么除了proc所做的事情之外,用户不能做任何事情。这是一个内部控件,旨在确保系统的任何用户都无法获得系统的业务规则。这是阻止人们购买公司然后批准资金本身打开欺诈之门的原因。这也可以防止组织中的许多人删除帐户表中的所有记录,因为他们没有删除权限,除了从proc授予的权限,一次只允许删除一次。
现在,开发人员必须拥有更多权限才能开发,但如果您想考虑安全性,他们就不应该拥有生产机器上的更多权限。真的,一个开发人员可以编写一个恶意的sp,它会在生产时做坏事。同样的开发人员虽然可以将相同的代码放入应用程序版本中,但是可能会被捕获或者不是因为他们恶意更改了proc。我个人认为proc可能更容易被捕获,因为它可能会被dbas与代码分开,这可能意味着管理员或配置管理人员和dbas有机会只看经理或配置管理人员。我们都知道现实是没有人推动代码生产有时间仔细审查每一部分,因此聘请值得信赖的开发人员至关重要。进行代码审查和源代码控制有助于发现恶意更改或将其回滚到以前的版本,但无论如何使用sps副应用程序代码都会受到开发人员的威胁。
系统管理员也是如此。必须拥有系统的完全权限才能完成工作。他们可能会在没有被抓住的情况下造成很大的伤害。在这种情况下,您可以做的最好的事情是尽可能少地限制这种访问,并尽可能地雇用值得信赖的人。至少如果您拥有此访问权限的人很少,则在问题发生时更容易找到问题的根源。您可以通过异地备份来最小化风险(因此,至少管理员如果转坏,可以在某种程度上修复它们),但是您永远无法完全摆脱这种风险。无论您允许应用程序访问数据的方式如何,这都是正确的。
因此sps的真正用途并不是要消除所有可能的风险,而是为了减少人们对系统的伤害。使用应用程序代码来影响数据库信息本质上是不安全的,我认为不应该允许存储财务信息或个人信息的任何系统。
答案 2 :(得分:5)
不使用存储过程的最大安全优势是清晰度。通过查看对表的访问权限,您可以准确了解帐户可以执行的操作。对于存储过程,情况不一定如此。如果一个帐户具有执行过程X的能力,那么会限制帐户执行该过程而不会触及基础表,但X可以执行任何操作。它可能会删除表,更改数据,删除数据等。
要了解帐户可以对存储过程执行的操作,您必须查看存储过程。每次更新一个sproc时,有人必须查看它的作用,以确保某些东西没有被“意外”放入其中。 sprocs中安全性的真正问题来自组织内部,而不是来自流氓攻击者。
以下是一个例子:
假设您正在尝试限制对employee表的访问。没有存储过程,您只是拒绝访问该表。要获得访问权限,必须要求您授予权限。当然,他们可以让你运行一个脚本来授予访问权限,但是大多数人至少会尝试查看改变数据库模式的脚本(假设脚本没有更新sproc,我将在下面讨论)。
应用程序可能有数百个存储过程。根据我的经验,他们经常更新,在这里添加一个字段,在那里删除一个。对于某人来说,审查更新过程脚本的数量总是令人生畏,并且在大多数组织中,数据库团队开始只是快速查看过程(或者不查看所有过程),并将其移动。这就是真正的问题所在。现在,在这个例子中,如果IT人员中的某个人想要允许访问表,那么该人只需要放入一行代码来授予访问权限或执行其他操作。在一个完美的世界中,这将被抓住。我们大多数人都不在一个完美的世界里工作。
存储过程的真正问题是它们会向系统添加一定程度的混淆。随着混淆带来了复杂性,并且复杂性最终会使理解管理底层系统的工作更多。 IT部门的大多数人都过度劳累,事情也随之消失。在这种情况下,您不会尝试攻击系统以获取访问权限,您可以使用系统负责人来获取您想要的内容。米特尼克是对的,在安全方面人是问题。
对组织的多数攻击来自内部。无论何时将复杂性引入任何系统,都会出现漏洞,事情可能会被忽视。不要相信,想想你的工作地点。完成有关您要求访问系统的人员的步骤。很快你意识到你可以让人们在适当的时候忽视事物。成功地与人参与系统的关键是做一些似乎无害的事情,但实际上是颠覆性的。
请记住,如果我试图攻击系统:我不是你的朋友;我对你的孩子或爱好毫无兴趣;我将以任何必要的方式使用你来获得我想要的东西;如果我背叛你,我不在乎。 “但他是我的朋友,这就是为什么我相信他相信他所做的事情是正确的”,这个想法在事后并不安慰。
答案 3 :(得分:4)
这是传统智慧正确的领域之一:只暴露存储过程可以让您更好地控制安全性。直接访问表格和视图更容易,有时您需要这样做,但它的安全性会降低。
答案 4 :(得分:3)
嗯,我猜你自己确实抓住了问题的核心:如果你不对所有CRUD操作使用存储过程,你必须至少授予特定于应用程序的db用户帐户所有表的SELECT权限。
如果您希望允许db帐户执行更多工作,该帐户可能还需要其他权限,例如能够在某些表上更新和可能删除。
我没有看到非存储过程方法如何具有任何安全性好处 - 它确实打开了更多的门,问题是:你能负担得起吗?您能否足够保护特定于应用程序的数据库帐户,以免影响系统的整体安全性?
一种可能的折衷方案可能是使用视图或表访问来允许SELECT,但使用存储过程处理其他所有内容(UPDATE,DELETE,INSERT) - 半安全,一半方便......
通常情况下 - 这是方便(非sp方法;可能使用ORM)和安全(所有SProc方法;可能更麻烦,但更安全)之间的经典权衡。
马克
答案 5 :(得分:1)
除了传统的存储过程安全分离(程序的EXEC权限,依赖于数据访问的所有权链接),存储过程可以是code signed,从而对任何服务器功能进行非常精细和特定的访问控制,如链接服务器server scoped management views,在用户普通访问之外对stored procedures and even data in other databases的受控访问。
在T-SQL批处理中进行的普通请求,无论多么花哨,代码生成层和ORM的层数是多少,都无法签名,因此无法使用最具特色的 >和强大的访问控制机制。
答案 6 :(得分:1)
这是一个不完美的类比,但我喜欢将DB的“dbo”模式中的表与OO术语中的“私有”数据进行比较,并将“视图和存储过程”与“公共”进行比较。甚至可以将“公共”模式与dbo模式分开,以使区分显式化。如果您遵循这个想法,您将获得安全优势以及可扩展性优势。
一个帐户(不是网络应用程序的帐户)具有dbo访问权并拥有该数据库,并且该网络应用程序使用另一个仅限于面向公众的结构的帐户进行连接。
答案 7 :(得分:0)
唯一可能的反对意见是我遇到了某些语句无法在SP中有效参数化(并且需要动态sql)的情况,这使您可以进行in-SP SQL注入。然而,这确实是一个非常狭隘的考虑因素,这是一种罕见的情况。至少在PostgreSQL中我偶尔会看到一些需要额外审查的案例。
总的来说,即使在这些情况下,我认为SP类型的方法在安全方面给你一个好处,因为它们意味着应用程序可以使用通用的反SQL注入机制,否则它可能是不可能的,并且你的SP可以被许多应用程序使用。此外,如果所有活动都必须通过SP,那么您可以减少sql注入的风险,并集中审核问题。
通常,用户通常可以减少安全性暴露的程度越低。这意味着用户可以用sql注入攻击做的事情越少。
存储过程通常可以提供比没有更好和更细粒度的安全性。
答案 8 :(得分:0)
此处的大多数答案都指明了使用存储过程的安全优势。在不忽视这些优势的情况下,还有一些未提及的大缺点:
数据访问模式有时比正在执行的特定过程重要。我们希望记录/监控/分析/提升访问数据的警报/阻止,何时以及如何访问。使用存储过程时,我们无法始终获取此信息。
某些组织可能拥有大量存储过程。无法审查所有这些内容,并且关注表格可能更有意义(特别是在考虑存储过程可能非常复杂,存在错误并引入其他安全问题时)。
某些组织可能需要将问题分开。数据库管理员(或编写存储过程的任何人)并不总是安全人员的一部分。安全人员有时需要只关注数据,因为他们不负责业务逻辑,而且编写业务逻辑的人员并不完全信任。