向Web服务连接授予数据​​库权限的良好做法是什么?

时间:2019-06-07 12:34:27

标签: sql-server security web-applications permissions entity-framework-core

我一直在寻找文章和SQL脚本示例,以演示如何安全便捷地解决最常见的情况之一-从基于.Net Core Entity Framework的Web应用程序连接到SQL数据库。

但是无论如何,我无法从信誉良好的来源中找到任何连贯的分步指南。

我们假设以下内容:

  • 我不能在连接字符串中使用集成的Windows身份验证,而必须使用基于用户名和密码的身份验证(因为托管在Linux服务器上,而数据库位于其他Windows服务器上)

  • Web服务将需要您通常的最低权限集-连接数据库,读取数据,写入数据,删除数据,执行存储过程

在阅读许多教程的同时,我发现有多种方法可以管理连接权限。为避免这个问题过于笼统,我将在理解后列出我当前的选择(如果我遗漏了一些东西,请纠正我)。

用户和登录名:

  • 创建数据库的登录名和用户
  • 创建一个没有登录名的纯数据库用户(不知道这是否适用于Web应用程序和连接字符串,但这仍然是我使用过的功能)

分配权限:

  • 为用户分配一些固定的SQL角色(db_datareader,db_datawriter,并且还必须授予EXECUTE权限)
  • 授予所有固定权限
  • 创建具有所需权限的自定义角色(例如db_web_apps)

SQL DBA建议使用哪种选择更好(通常更安全,更易于管理)?

我认为每个数据库管理员都应该有一个方便的模板脚本,以便在开发人员每次为其闪亮的新Web应用程序请求新连接时,以最少的必需权限快速添加新用户。

如果您知道一个很好的,可靠的教程或GitHub / Gist示例,该示例解释了这样做的原因和原因,或者您自己使用了多年的脚本在生产环境中没有任何问题,那么如果您能在此工作,我将不胜感激可以分享。

1 个答案:

答案 0 :(得分:1)

在数据库中创建一个角色,然后为该角色分配所需的特权。不要使用固定的数据库角色。相反,如有必要,直接将权限授予对象,模式或整个数据库。像这样:

create role trusted_app_role
grant select, insert, update, delete, execute 
  on schema::dbo to trusted_app_role

这将为角色授予默认dbo模式中所有对象的完全DML权限。因此,如果您有任何表或过程,而您不希望应用程序访问它们,则只需在不同的架构中创建它们,例如admin。这样,您添加对象时就不必摆弄权限。固定的数据库角色早于基于模式的权限,并且实际上不再需要。

对于应用程序的身份,将Active Directory或Azure Active Directory(Azure SQL)身份添加到该角色,或者,如果不能,则将SQL用户添加到该角色。

如果使用Azure SQL,通常应使用没有登录名的数据库用户。在SQL Server上,如果启用Partial Database Containment,则只能添加“包含数据库的用户”。您可以执行此操作,但是与变更跟踪和变更数据捕获不兼容,因此这是一个折衷。

因此,通常对于SQL Server,您仍然会创建一个登录名并将用户映射到该登录名。 EG:

create login web_service_user with password = '5X+jeuAB6kmhw85R/AxAg'
create user web_service_user for login web_service_user

然后将该用户添加到您的角色

alter role trusted_app_role add member web_service_user