实现 SQL Server 代理安全性
重要
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 代理节点在使用 SQL Server Management Studio 连接到 SQL Server 时不可用。
这些数据库角色的成员可以查看和执行其拥有的作业,并创建作为现有代理帐户运行的作业步骤。 有关与每个角色关联的特定权限的详细信息,请参阅 SQL Server 代理固定数据库角色。
sysadmin 固定服务器角色的成员有权创建、修改和删除代理帐户。 sysadmin 角色的成员拥有创建不指定代理的作业步骤的权限,而这些步骤将作为 SQL Server 代理服务帐户运行,该帐户用于启动 SQL Server 代理。
指引
遵循以下准则,提高 SQL Server 代理实现的安全性:
专门为代理创建专用用户帐户,并仅使用这些代理用户帐户来运行作业步骤。
仅向代理用户帐户授予必要的权限。 仅授予运行分配给给定代理帐户的作业步骤所需的权限。
不要在作为 Windows 管理员 组成员的 Microsoft Windows 帐户下运行 SQL Server 代理服务。
代理仅与 SQL Server 凭据存储一样安全。
如果用户写入操作可以写入 NT 事件日志,则可以通过 SQL Server 代理触发警报。
不要将 NT 管理员帐户指定为服务帐户或代理帐户。
SQL Server 和 SQL Server 代理有权访问彼此的资产。 这两个服务共享单个进程空间,SQL Server 代理是 SQL Server 服务上的 sysadmin。
当 TSX(目标服务器) 使用 MSX(主服务器)登记时,MSX 的系统管理员能够完全控制该 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 验证
群集 - Microsoft.SqlServer.Configuration.Cluster.dll
证监会 - Microsoft.SqlServer.Configuration.SqlConfigBase.dll
扩展 - Microsoft.SqlServer.Configuration.ConfigExtension.dll
关联服务器
在某些情况下(例如,使用 Azure SQL 托管实例)运行通过链接服务器在远程服务器上执行 Transact-SQL(T-SQL)查询的 SQL 代理作业,需要将本地登录名映射到远程服务器上的登录名。
使用 sp_addlinkedsrvlogin 在本地服务器上的登录名与具有执行 T-SQL 查询所需权限的远程服务器上的登录名之间创建映射。 当 SQL 代理作业通过链接服务器连接到远程服务器时,它会在远程登录的上下文中执行 T-SQL 查询。
下表介绍如何根据 Azure SQL 托管实例中的 SQL Agent 作业所有者映射用户登录:
SQL 代理作业所有者 | 如何映射登录 |
---|---|
不是 系统管理员 的用户 | 将本地用户 (拥有 SQL 代理作业的用户)映射到远程登录名。 |
系统管理员 | 通过将 @locallogin 参数设置为 NULL ,可以将所有本地用户 映射到远程登录。 |
注意
当本地服务器是 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