对于存储过程情况是一样的。例如,如果它有一个没有被破坏的所有权链,你谨慎地控制哪些用户具有对这个存储过程的EXECUTE 权限,而且你直接拒绝对后台的表的访问。但是这在一些情况下不起作用,例如当这个存储过程的所有权链被破坏了或者执行动态的SQL,要求这个用户执行存储过程具有对后台的表的权限。要实现同样目的的另一个方法是使用EXECUTE AS ,但是这会改变存储过程执行环境的安全上下文。这可能是不希望的,例如,如果你需要在表中记录哪个用户使得这个存储过程运行(需要记录作为这个存储过程参数的用户名称)。
签名代码模块还具有保护证书免于对代码模块的未授权的改动的好处。像其它数字签名的文档一样,当代码改变时证书就无效了。代码不在证书的上下文下执行,所以任何具有对该证书的访问权限的对象将不能被访问到。
为了做到这一点,你可以创建一个证书,将它和一个新的用户关联起来,并使用这个证书来签名这个存储过程。为这个用户授权所有执行这个存储过程所必要的权限。实际上,你将这个用户添加到了这个存储过程的安全上下文中作为第二标识。然后将执行权限授予所有需要执行这个存储过程的用户和角色。下面的代码显示了这些步骤。假设你想签名mySchema.GetSecretStuff 存储过程,而所有引用的对象都已经存在于数据库中了:
以下是引用片段: CREATE CERTIFICATE certCodeSigning -- Sign the stored procedure -- Map a user to the certificate --Assign SELECT permissions to new certUser -- Grant execute permission to the user who will run the code
|
现在只有明确地被授予在存储过程上的EXECUTE权限的用户可以访问这个表的数据。
6. SQL Server 2008中的审查
任何安全解决方案的一个重要部分是具有审查责任和调整遵从性原因的活动的能力。SQL Server 2008具有一些使它可以审查活动的特性。
6.1 所有活动审查
SQL Server 2008具有通过审查对象对审查的支持,这使得管理员可以捕捉数据库服务器中的活动并将它存储在日志中。有了SQL Server 2008,你可以将审查信息存储在以下目的地中:
· 文件
· Windows应用程序日志
· Windows安全日志
为了写到Windows安全日志中去,SQL Server 安全必须被配置为作为本地系统、本地服务、网络服务或一个具有SeAuditPrivilege权限但不是交互的用户的域帐户来运行。
为了创建一个审查对象,你必须使用CREATE SERVER AUDIT语句。这个语句定义了一个审查对象,并将它与一个目的地相关联。这个特定的选项习惯于配置一个依赖于审查目的地的审查对象。例如,下面的Transact-SQL代码创建了两个审查对象;一个记录活动到一个文件