SQL 策略管理
策略管理是SQL Server 2008 中的一个新特性,用于管理数据库实例、数据库以及数据库对象的各种属性。在这种管理下,用户基于策略管理获取两个方面是应用:有效评估、监视以及管理应用。而在有效的管理应用条件下,安全是最为重要的,下面针对策略管理的安全性进行实战。
管理策略的安全性
属于Policy Administrator Role 的成员才可以制定和修改策略定义,这个角色的成员是必须要小心控制的,因为恶意用户可以通过制定苛刻的策略来达到类似于拒绝服务攻击的效果,这个方面与其他数据库相类似
打开management studio → 管理 → 策略管理
从图中可以看到,策略管理中包含三个节点:策略、条件、方面。
方面:
就是策略要应用的对象,包括:服务器、表、触发器、视图、存储过程这些方面对象都是系统定义好了的,仅供瞻仰不可更改。双击具体的某一个方面可以查看该方面的属性,在定义条件时即可对这些属性进行判断,如图为存储过程方面的属性。
条件:
条件就是一个布尔表达式判断策略是否为真。
策略:
策略就是在条件为假的情况下要执行的操作,即评估模式。策略中的评估模式有
4 种:按需、按计划、更改时记录和更改时禁止。对于这4 种模式,定义如下:
按需:当用户直接指定这种模式时,它可对策略进行评估。
更改时: 禁止:这种自动模式使用DDL 触发器来防止违反策略。
更改时: 仅记录:当发生相关更改并违反日志策略时,这种自动模式使用事件通知对策略进行评估。
按计划。这种自动模式使用SQL Server 代理作业定期对策略进行评估。此模式记录违反策略的情况。
其中按需是手动操作的,其他三个则可以自动完成。按计划是使用SQLServer 代理
来定时检查策略,另外两个是在更改时由DDL 触发器触发。
策略管理创建及应用
A、基于策略管理的常规配置步骤为:
DEMO1:要求所创建的存储过程必须加密
--1、创建条件
打开management studio → 管理 → 策略管理 → 条件 → 右键 → 新建条件
定义创建条件的名称/该条件针对的对象(方面)/表达式
在此我们需要要求创建存储过程时强制加密,表达式为:
@Isencrypted = true
--2、创建一个策略
打开management studio → 管理 → 策略管理 → 策略 → 右键 → 新建策略
定义策略的名称/所检查的条件
--3、启用该策略
策略创建好之后,默认是没有启用的。我们必须通过菜单进行启用
--4、测试,创建一个不加密的存储过程
create proc pr_name
as
print ‘hello‘
go
--返回结果:
“SQLSERVER:\SQL\SQL2008\DEFAULT\Databases\mydb\StoredProcedures\dbo.pr_name‖已违反策略
―proc_encryption‖。
此事务将回滚。
策略条件:―@IsEncrypted = True()‖
策略说明:―‖
其他帮助:―‖:―‖
语句:―
create proc pr_name
as
print ‘hello‘
‖。
消息3609,级别16,状态1,过程sp_syspolicy_dispatch_event,第65 行
事务在触发器中结束。批处理已中止。
创建一个加密的存储过程:
create proc pr_name
with encryption
as
print ‘hello‘
go
--返回:命令已成功完成。
--5、使用评估功能
可对所创建的存储过程进行评估,是否满足条件选择创建好的存储过程 → 右键 → 策略 → 评估勾选策略,点击评估。
若满足条件:返回如下结果查看详细信息:
若不满足条件,返回如下结果:查看详细信息:
--6、策略的导出及导入
导出策略:
选中创建好的策略,点击右键,选择导出策略:
导入策略:
在策略管理下,的策略选项上,点击右键,选择导入策略选择需导入的文件:
DEMO2:创建一个策略,要求MYDB 数据库中创建的所有存储过程命名均是以pc_开头
--1、创建条件
输入“条件”的名称:“proc_name”,然后字段列表中选择@Name,运算符为LIKE,值为‘pc[_]%‘。也就是判断存储过程的名字LIKE‘pc[_]%‘,也就是以“pc_”开头的SQL 表达。
这里字段和值都可以使用变量和函数,如果允许“PC_”、“Pc_”等开头的存储过程,则可以将字段运用小写函数,改写为“Lower(@Name)”,然后单击“确定”按钮,创建“条件”完成
--2、创建策略
右击“策略”节点,在右键菜单中选“新建策略”选项,系统将打开新建策略窗口,输入策略名“proc_name”,在检查条件的下拉列表中选择刚创建的条件“proc_name”,系统将根据选择的检查条件列出针对目标,默认情况下是对每个数据库的每个存储过程进行检查,由于这里我们只希望检查MYDB 数据库,所以需要新建数据库的条件,如图:选择新建条件:
由于仅针对于mydb 数据库,此处方面选择“数据库”,表达式中,字段选择“@Name”,运算符选择“=”,值则定义为“mydb”数据库
单击“确定”按钮回到新建策略窗口,针对目标变成了对MYDB 数据库的每个存储过程。
这里若要强制实现这个策略,则选择评估模式为“更改:禁止”并选中“已启用”复选框表示启用该策略。
单击“说明”选择页,可以在其中选择策略的类别、在违反策略时给出的友好说明。最后单击“确定”按钮即可完成策略的创建工作。
--3、测试,创建一个命名以pr_开头的存储过程:
create proc pr_na
with encryption
as
print ‘hello‘
go
--返回结果:
“SQLSERVER:\SQL\SQL2008\DEFAULT\Databases\mydb\StoredProcedures\dbo.pr_na‖已违反策略―proc_name‖。
此事务将回滚。
策略条件:―@Name LIKE ‘pc[_]%‘‖
策略说明:―‖
其他帮助:―‖:―‖
语句:―--ENCRYPTED--‖。
消息3609,级别16,状态1,过程sp_syspolicy_dispatch_event,第65 行
事务在触发器中结束。批处理已中止。
创建一个命名以pc_开头的存储过程
create proc pc_na
with encryption
as
print ‘hello‘
go
--返回结果:
命令已成功完成。