我一直在寻找文章和 SQL 脚本示例,以演示如何安全、方便地解决最常见的场景之一 - 从基于 .Net Core Entity Framework 的 Web 应用程序连接到 SQL 数据库。
但不知何故,我无法从信誉良好的来源找到任何连贯的分步指南。
让我们假设以下情况:
我无法在连接字符串中使用集成 Windows 身份验证,必须使用基于用户名和密码的身份验证(因为托管在 Linux 服务器上,而数据库位于不同的 Windows 服务器上)
Web 服务将需要您通常的最低权限集 - 连接到数据库、读取数据、写入数据、删除数据、执行存储过程
在阅读许多教程时,我发现有多种方法可以管理连接权限。为了避免这个问题过于宽泛,我将根据我的理解列出我当前的选择(如果我遗漏了什么,请纠正我)。
用户和登录:
- 为数据库创建登录名和用户
- 创建一个无需登录的仅数据库用户(不确定这是否适用于网络应用和连接字符串,但我仍然看到有人使用该功能)
分配权限:
- 将用户分配给某个固定的 SQL 角色(db_datareader、db_datawriter 并且还必须授予 EXECUTE 权限)
- 授予所有固定权限
- 创建具有所需权限的自定义角色(例如 db_web_apps)
哪些选择更好(通常更安全且更易于管理)并且是 SQL DBA 推荐的?
我认为每个数据库管理员都应该有一个方便的模板脚本,以便在每次开发人员为其 Shiny 的新 Web 应用程序请求新连接时快速添加具有所需最低权限的新用户。
如果您知道一个好的、可靠的教程或 GitHub/Gist 示例来解释这样做的内容和原因,或者您自己已经使用多年而在生产环境中没有任何问题的脚本,我将非常感激可以分享一下。
最佳答案
在数据库中创建角色并为该角色分配所需的权限。不要使用固定数据库角色。相反,如果需要,可以直接向对象、模式或整个数据库授予权限。像这样:
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,您仍然创建一个登录名并将用户映射到该登录名。例如:
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
关于sql-server - 向 Web 服务连接授予数据库权限有哪些良好做法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56494447/