假设我们有一个用.NET编写的网络部署桌面应用程序。我们不希望任何用户(管理员除外)能够操作应用程序之外的数据。例如,普通用户不应该使用SQL Server Management Studio来修改/读取数据。
我知道有3种方法可以对SQL Server进行身份验证,但对于这种情况,哪种方法最安全?
1)Windows身份验证(可信连接) - 身份验证基于Windows用户帐户完成,这意味着我们无法仅限制对应用程序的访问。任何具有数据库权限的Windows用户都可以使用SSMS。
2)SQL Server身份验证(用户/密码) - 我们可以为应用程序创建一个与任何特定用户无关的登录,但是用户名/密码必须由应用程序存储和使用,我理解,要完全保护它们很困难(也许是不可能的)。
3)使用Approle - 与#2有同样的问题,因为密码必须由应用程序存储。
对于这种情况,这三种中哪一种最安全,还是有另一种选择更好?
答案 0 :(得分:3)
#1是最安全的方法。
答案 1 :(得分:1)
基本上有两种管理安全性的方法。您可以允许应用程序执行特定功能并使用单个用户(域,本地计算机,SQL)或应用程序连接的应用程序角色。这样,没有任何个人用户对SQL Server拥有任何权限,也无法与SSMS连接。
这假设您只想连接应用程序,并且所有功能都通过应用程序进行管理。
或者,如果您希望指定的用户具有与所有其他用户不同的特定权限,那么您可以将各个用户(希望是域用户)分配给sql server角色并根据角色设置权限(您可能不希望单独管理用户的管理负担,因此sql角色或域组减轻了管理负担。然后,您的应用程序使用Windows身份验证连接(例如,正在使用该应用程序的用户的上下文)。这为您提供了为个人用户授予数据库内不同权限的选项。但是,确切的事情也可以通过精心设计的应用程序来完成。
使用SQL角色的另一种方法是,您可以将域用户放在Windows AD组(例如会计管理器)中,并将该域组分配给sql角色或授予其特定权限(数据读取器,编写器,dbo等) ...)您甚至可以将其一直带到特定的数据库对象(例如,只有会计经理可以执行“DELETE ENTRY”存储过程)。您甚至可以删除直接表访问的所有权限,以便当用户连接到数据库时(例如通过SSMS),他们无法直接删除数据,并且只能通过执行“DELETE”存储过程(如果它们在组中)来执行此操作有权执行该存储过程。
此外,如果你真的想保护你的数据不被删除,你会在表格中带一个标志,表明记录处于活动或非活动状态,即使在所谓的删除操作中,你也不会真正删除记录,而是你只会将其标记为有效或无效。
在任何情况下,为了回答具体问题,限制用户通过SSMS和仅通过应用程序连接,这可以通过多种方式完成,绝不是限制。
答案 2 :(得分:0)
我是Alex的第二个。如果您想要偏执,您还可以为每个应用程序池(在IIS中)或每个应用程序ID(Windows / Web应用程序)设置权限。我认为win auth足够好了。