sysadmin 角色的成员当然可以在任何子系统中做任何他们想要做的。为了授权给任何其他的用户以使用子系统,要求至少创建一个代理帐户,它可以授权给一个或多个子系统。图7显示一个代理帐户MyProxy怎样被分配到多个主体上,这里是一个用户和一个角色。这个代理帐户使用一个凭证,这个凭证将它链接到一个帐户,通常是一个域帐户,它要具有操作系统执行子系统所要求的所有任务所必需的权限。每一个代理可以有一个或多个相关联的子系统,这些子系统授予主体以运行这些子系统的能力。
图 7:用于多个子系统的SQL Server Agent代理帐户
下面的代码显示了执行图7所示的scheme所必需的Transact-SQL代码。它一开始创建了一个凭证,一个提供了对具有执行子系统中想要的活动的权限的操作系统帐户的链接的数据库对象。然后它添加一个代理帐户——MyProxy,这只是一个用于凭证的友好名称。然后,它将这个代理分派到两个首要角色上,在这里是一个SQL Server登陆和一个定制角色。最后它将这个代理和四个SQL Server Agent子系统的每一个相关联。
以下是引用片段: CREATE CREDENTIAL MyCredential WITH IDENTITY = ''MyDOMAIN\user1'' sp_grant_proxy_to_subsystem @proxy_name = ''MyProxy'', |
SQL Server管理套件提供了对创建凭证和代理的充分支持,如图8所示。它创建了与之前的代码相同的代理。
图 8:在SQL Server管理套件中的一个新的SQL Server Agent代理
一个代理不是操作系统中围绕安全的一个方式。如果和代理一起使用的凭证没有在Windows中的权限,例如写到网络上的一个目录中,那么代理也没有这个权限。你还可以使用一个代理来授予有限的执行权限给xp_cmdshell ,因为它是攻击者所喜爱的一个工具,一旦他们危及一个SQL Server计算机他们就能扩展他们在网络中的范围。这个代理提供了这个保护,因为即使主体具有在网络上的无限的权限,例如域管理员,但是通过代理执行的任何命令只具有凭证帐户所具有的有限的权限。
4.6 执行上下文
SQL Server 很久以来就支持所有权链接作为一个确保管理员和应用程序开发人员对访问数据库的入口检查其权限而不是对所有访问的对象的权限进行检查的概念。只要调用模块(存储过程或函数)或者视图的用户具有对这个模块的执行权限,或者具有对视图的选择权限,并且这个模块或视图的所有人是访问对象的所有人(一个所有权链),那么就不会检查对基本对象具有的权限,而调用者会得到请求的数据。
如果所有权链接由于代码的所有者不拥有引用的对象的原因而被破坏了,那么SQL Server将对调用者的安全上下文检查权限。如果调用者具