sql-server - 向 Web 服务连接授予数据​​库权限有哪些良好做法?

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

我一直在寻找文章和 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/

相关文章:

javascript - 如何在 Web 应用程序中采用 MVC?

SQL Server 2008链接服务器连接字符串设置

sql-server - SQL Server 架构命名约定

PHP 表单 : prevent outside posters with tokens

java.security.AccessControlException : access denied ("java.net.SocketPermission" "smtp.gmail.com" "resolve")

java - 使用 TLS 的 Grizzly - 握手问题

sql-server - SQL求最大值然后判断哪个名字的值最大

sql - 唯一标识符 (GUID) 上的聚合函数

apache-flex - 基于 FLEX 的应用程序的自动化测试

java - Hibernate + Spring = Java Web 应用程序的最先进技术?