我一直在寻找文章和SQL脚本示例,以演示如何安全便捷地解决最常见的情况之一-从基于.Net Core Entity Framework的Web应用程序连接到SQL数据库。
但是无论如何,我无法从信誉良好的来源中找到任何连贯的分步指南。
我们假设以下内容:
我不能在连接字符串中使用集成的Windows身份验证,而必须使用基于用户名和密码的身份验证(因为托管在Linux服务器上,而数据库位于其他Windows服务器上)
Web服务将需要您通常的最低权限集-连接数据库,读取数据,写入数据,删除数据,执行存储过程
在阅读许多教程的同时,我发现有多种方法可以管理连接权限。为避免这个问题过于笼统,我将在理解后列出我当前的选择(如果我遗漏了一些东西,请纠正我)。
用户和登录名:
分配权限:
SQL DBA建议使用哪种选择更好(通常更安全,更易于管理)?
我认为每个数据库管理员都应该有一个方便的模板脚本,以便在开发人员每次为其闪亮的新Web应用程序请求新连接时,以最少的必需权限快速添加新用户。
如果您知道一个很好的,可靠的教程或GitHub / Gist示例,该示例解释了这样做的原因和原因,或者您自己使用了多年的脚本在生产环境中没有任何问题,那么如果您能在此工作,我将不胜感激可以分享。
答案 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