如何声明SqlCommand以尽可能低的权限运行?

时间:2015-02-20 16:32:21

标签: asp.net sql-server security least-privilege

我正在保护在MS SQL之上运行的ASP.NET / MVC Web应用程序。作为其中的一部分,我有不同的数据库连接,以在网站中执行不同的事情。

编辑 - 当然,由DBA和Ops人员来决定如何访问数据以及如何托管应用程序,但是他们不能对一个不够精细的应用程序做很多事情来为他们提供控制权。需要把事情搞定。

系统仅使用没有动态SQL的存储过程。一些存储过程会改变数据,所以我使用概念上不同的连接来调用那些只用于读取的其他数据访问的连接。没有SQL用户有权访问除存储过程之外的任何其他数据库对象。帐户授权具有单独的连接。 Web应用程序的某些部分显示计费信息,网站的其他部分直接计费工作。似乎有一些方法可以将舱壁放在一起,将概念上不同的东西分开。

我正在寻找一种集成测试方法,我对所选择的权限并不过分慷慨。如果开发人员试图在代码中的错误位置使用错误的访问级别,我想要一种在构建服务器上抛出异常的机制,即使错误是所选帐户实际上具有太多权限,这将导致来自数据库的错误。

我一直在创建IDbCommand的实现,它将充当IDbCommand实例的工厂,它基本上使用两个不同的连接在后端向后端发出相同的命令,这些连接使用在SQL Server中具有不同访问权限的不同主体如果较低的特权足够,则抛出。

这种方法有两个问题

  1. 几乎不是优雅的'或者显然完美无缺。我几乎没有想过它,而且已经那么很多代码了。我必须将发生在较低连接上的所有事情排队,然后在更高权限的连接上重放,这对于它的工作方式是不现实的,并且可能导致其他代码出现奇怪的时序问题。我喜欢编写代码,但我也喜欢我的测试值得信赖并且易于理解,并且没有引入一组新的复杂性,这些复杂性会使测试以与测试中的代码不同的方式变得脆弱。也许如果我完全复制所有工作和所有数据并运行单独的数据库,那么构建服务器脚本将是一场噩梦。
  2. 几乎没有资格作为粒度。
  3. 当然,这是一个解决的问题,只是因为运气不好或糟糕的google fu回避了我几个小时的搜索?

0 个答案:

没有答案