实现 SQL Server 代理安全性

适用于: SQL Server Azure SQL 托管实例

重要

Azure SQL 托管实例目前支持大多数(但不是所有)SQL Server 代理功能。 有关详细信息,请参阅 Azure SQL 托管实例与 SQL Server 的 T-SQL 区别

SQL Server 代理使数据库管理员能够在一个安全上下文中运行每个作业步骤,这个安全上下文只具有执行该作业步骤所需的权限,这是由 SQL Server 代理程序代理决定的。 若要为某个特定的作业步骤设置权限,可以创建一个具有所需权限的代理,然后将该代理分配给该作业步骤。 一个代理可以指定给多个作业步骤。 对于需要相同权限的作业步骤,可以使用同一个代理。

下面的内容将解释必须为用户授予什么样的数据库角色,他们才能使用 SQL Server 代理创建或执行作业。

授予访问 SQL Server 代理的权限

若要使用 SQL Server 代理,用户必须是下列一个或多个固定数据库角色的成员:

  • SQLAgentUserRole

  • SQLAgentReaderRole

  • SQLAgentOperatorRole

这些角色存储在 msdb 数据库中。 默认情况下,任何用户都不是这些数据库角色的成员。 必须显式授予这些角色中的成员身份。 作为 sysadmin 固定服务器角色成员的用户可以完全访问 SQL Server 代理,不需要成为这些固定数据库角色的成员便可以使用 SQL Server 代理。 如果某个用户既不是这些数据库角色的成员,也不是 sysadmin 角色的成员,那么当他们使用 SQL Server Management Studio 连接到 SQL Server 时,不能访问 SQL Server 代理节点。

这些数据库角色的成员可以查看和执行它们所拥有的作业,还可以创建作为现有代理帐户运行的作业步骤。 有关与每个这些角色关联的特定权限的详细信息,请参阅 SQL Server 代理固定数据库角色

sysadmin 固定服务器角色的成员具有创建、修改和删除代理帐户的权限。 sysadmin 角色的成员具有创建未指定代理的作业步骤的权限,但却作为 SQL Server 代理服务帐户运行,该帐户是用于启动 SQL Server 代理的帐户。

指南

遵循下列指导原则可以提高 SQL Server 代理实现的安全性:

  • 专门为代理创建专用的用户帐户,并且只使用这些代理用户帐户来运行作业步骤。

  • 只为代理用户帐户授予必需的权限。 只授予运行分配给给定代理帐户的作业步骤所需的那些权限。

  • 不要使用作为 Windows Administrators 组成员的 Microsoft Windows 帐户运行 SQL Server 代理服务。

  • 代理仅具有与 SQL Server 凭据存储区相同的安全性。

  • 如果用户写入操作可对 NT 事件日志进行写入,则用户可通过 SQL Server 代理引发警报。

  • 请不要将 NT 管理帐户指定为服务帐户或代理帐户。

  • SQL Server 和 SQL Server 代理有权互相访问资产。 这两项服务共享一个进程空间,并且 SQL Server 代理是 SQL Server 服务的 sysadmin。

  • TSX(目标服务器) 使用 MSX(主服务器)进行登记时,MSX sysadmins 将获得对 SQL Server 的 TSX 实例的完全控制权。

  • ACE 是一个扩展插件,不能调用自身。 Chainer ScenarioEngine.exe(也称为 Microsoft.SqlServer.Chainer.Setup.exe)调用 ACE。 其他主机进程也可以调用 ACE。

  • ACE 取决于 SSDP 拥有的以下配置 DLL,因为这些 DLL 的 API 是由 ACE 调用的:

    • SCO - Microsoft.SqlServer.Configuration.Sco.dll,包括针对虚拟帐户的新 SCO 验证

    • Cluster - Microsoft.SqlServer.Configuration.Cluster.dll

    • SFC - Microsoft.SqlServer.Configuration.SqlConfigBase.dll

    • Extension - Microsoft.SqlServer.Configuration.ConfigExtension.dll

链接服务器

在某些情况下(例如使用 Azure SQL 托管实例时),若要通过链接服务器在远程服务器上运行执行 Transact-SQL (T-SQL) 查询的 SQL 代理作业,需要将本地登录映射到远程服务器上的登录。

使用 sp_addlinkedsrvlogin 在本地服务器上的登录与具有执行 T-SQL 查询所需权限的远程服务器上的登录之间创建映射。 当 SQL 代理作业通过链接服务器连接到远程服务器时,会在远程登录的上下文中执行 T-SQL 查询。

下表介绍如何根据 Azure SQL 托管实例中的 SQL 代理作业所有者映射登录:

SQL 代理作业所有者 如何映射登录
不是 sysadmin 的用户 将拥有 SQL 代理作业的本地用户映射到远程登录。
sysadmin 通过将参数 NULL 设置为 @locallogin,将所有本地用户映射到远程登录。

注意

在本地服务器为 Azure SQL 托管实例时,需要在远程服务器上为 SQL 代理作业创建登录。 用户映射有误可能会导致错误,例如以下示例:

  • Windows logins are not supported in this version of SQL Server
  • Linked servers cannot be used under impersonation without a mapping for the impersonated login