SQL Server 2005安全特性概述

默认的安全设置: 减少攻击表面-->部分非必须功能默认关闭  数据库引擎和SQL Agent粒度权限  元数据的可见性   安全性配置工具-->基于功能的表面配置  基于服务和连接的表面配置
如何使用外围配置工具启用xp_cmdshell呢?
20031784
通过开始--程序--Microsoft SQL Server 2005--配置工具--选择SQL Server 外围应用配置器来打开它  在配置外围应用localhost里面按功能的外围应用配置器--展开Database Engine--按xp_cmdshell--把启用xp_cmdshell沟上  按确定  这样数据库引擎就支持这个功能了
20031785
通过开始--程序--Microsoft SQL Server 2005--选择SQL Server Management Studio来打开它  按新建查询--在里面输入EXEC xp_cmdshell "dir c:\"按执行  看到了吧?  可以看到把C盘根目录下的所有信息都列出来了
强制密码策略: 强制登录的密码符合本地的密码策略  实现功能-->新的密码口令检测API  在验证过程中可以设置和重设口令  对于Win2k上,只支持SQL本地的密码复杂性  管理选项-->默认对所有登录进行策略检查  可以为每个登录独立设置密码策略检测
基于端点的身份验证(1): 端点(Endpoint)-->访问实例的入口点  绑定到相应的承载协议 
      Transport Protocol                                                  Payloads
                   Named pipes                   Shared Memory                 TDS           SOAP          SSB
                     TCP              HTTP              VIA                                   Database Mirroring
基于端点的身份验证(2): 默认的端点-->TCP,Named Pipe,Shared Memory  必须显示创建的端点-->HTTP,Service Broker,数据库镜像端点  默认没有任何权限  使用端点的好处-->基于端点进行访问控制  可以单独启动、关闭和禁用某一个端点
增强的身份验证过程: 对于标准的SQL登录验证的增强-->验证通道使用服务器生成的证书进行加密  不需要预先配置SSL证书  类似使用SSL的访问过程  可以禁用标准的SQL登录   对于应用程序是一个透明的过程   兼容旧的SQL客户端
20031786
打开Microsoft SQL Server Management Studio--展开SQL--安全性--对着登录名右键--选择新建登录名--登录名就叫做user1吧  选择SQL Server身份验证--把强制实施密码策略、强制密码过期、用户在下次登录时必须更改密码都沟上  然后在密码里面输入123按确定  为什么还能创建user1这个用户呢? 不是已经把强制实施密码策略沟上了吗  那是因为本地安全策略的密码策略里面的密码必须符合复杂性要求没有启用
20031787
通过开始--程序--管理工具--选择本地安全策略来打开它  展开账户策略--按密码策略--双击密码必须符合复杂性要求--选择已启用  按确定
20031788
我再来创建一个登录名叫做user2的用户  选择SQL Server身份验证--在密码里面输入123--按确定  看到了吗?  现在不能创建user2这个用户了  为什么呢?  因为我刚才启用了本地安全策略里面的密码必须符合复杂性要求  所以提示密码有效性验证失败。该密码不够复杂,不符合Windows策略要求。此时你必须输入一个复杂的密码 
20031789
其实我们还可以对单个用户去关闭使用强制实施密码策略  这样它就不会对本地的安全策略进行检查了  把强制实施密码策略的沟去掉  按确定  此时你会发现user2这个用户是可以被成功创建的
20031791
我现在使用user1这个用户登录数据库引擎  按文件--按新建--选择数据库引擎查询  在身份验证里面选择SQL Server身份验证  输入用户名(user1)和密码  按连接  此时你会发现它会出现一个更改密码的提示  那么这也是SQL Server 2005对客户端所提供的功能  可以在连接的过程中就修改成自己使用的密码  然后输入新密码  按确定就能连接到数据库引擎了
层次化的权限模型: 层次化的权限-->服务器级别  数据库级别  架构级别  对象级别   权限会继承到子对象
SQL 2005用户与架构分离: 在数据库中可以包含多个架构  每个架构都有一拥有者(数据库用户或角色)  每个用户有一个默认的架构  数据库对象由架构进行组织  可以在架构上授予权限  数据库对象的拥有链基于对象的拥有者 
用户与架构的分离: 用户删除时只需重新设定架构的拥有者
如何实现用户与架构的分离呢?
20031792
展开本地计算机名称(SQL-SERVER2005)--对着数据库右键--选择新建数据库  数据库名称就叫做adb吧  按确定
20031793
展开adb这个数据库--安全性--对着架构右键--选择新建架构  架构名称就叫做alice吧  架构所有者就叫做adb吧  按确定
20031794
在adb这个数据库下对着用户右键--选择新建用户--用户名、登录名、默认架构都叫做alice吧  在拥有的架构里面把alice沟上  按确定 这样alice这个用户就拥有alice这个架构了  然后可以使用它来创建一些数据库对象了 
20031795
在adb这个数据库下对着表右键--选择新建表--在列名里面输入Des--在右边的架构里面选择alice  按保存表键--表名称就叫做Table_1吧--按确定    
20031796
现在可以看到在表里面可以看到一个叫做alice.Table_1的表了  如果直接在用户里面把alice这个用户删除掉的话会发生什么结果呢?  对着alice右键--选择删除--在删除对象里面按确定  此时会提示删除失败的  可以看到在其他信息里面是数据库主体在该数据库中拥有架构,所以无法删除  此时怎么样才能把alice这个用户删除掉呢?  其实也很简单的  我们可以把架构所有者修改成另一个名称就可以了
20031797
在adb这个数据库下的架构里面对着alice右键--选择属性--我现在把架构所有者alice修改成dbo吧  按确定
20031798
此时对着alice这个用户右键--选择删除--按确定  你会发现alice这个用户可以成功被删除掉了
EXECUTE AS: 让用户以指定的上下文权限运行  使用REVERT语句跳出指定的上下文  和SETUSER的区别-->普通用户可以使用  可以进行上下文嵌套
20031799
我现在是使用alice这个用户登录数据库引擎的  我在刚才创建的adb数据库里面创建一张叫做dbo.table1的表  1.在查询里面输入数据库表dbo.table1的语句--把它们全选--按执行来创建数据表  2.全选EXECUTE AS USER = 'alice' --按执行--全选PRINT USER--按执行  此时可以看到显示为alice这个用户  全选SELECT * FROM sys.tables  ---查看metadata,得到有限的信息--按执行之后可以看到列出一张表  3.选定REVERT--按执行--选定PRINT USER--按执行之后可以看到显示为dbo了  因为首先我是使用dbo去连接用户的  所以当然是显示为dbo  然后执行SELECT * FROM sys.tables  ---查看metadata,得到所有tables的信息这条语句  这个时候可以看到列出二张表的信息  因为dbo拥有数据库的完全控制权限  所以它在查metadata的时候可以得到数据表的信息
20031800
我现在以dbo的身份创建删除表dbo.table1的存储过程  这个有什么用呢?  就是删除我在最前面创建的那一张表  但是这个存储过程跟以前不同之处就是使用WITH EXECUTE AS OWNER  就是说存储过程在执行的时候是以存储过程的拥有者身份运行的  不管是谁调用它 只要它能够调用 它就以OWNER来运行  4.全选以dbo的身份创建删除表dbo.table1的存储过程语句--按执行  5.授予alice这个用户可以执行dbo.drop_tables 就是刚才那个存储过程  全选授予alice执行该存储过程的权限语句--按执行  6.选定EXECUTE AS USER = 'alice'--按执行--选定PRINT USER--按执行之后可以看到显示为alice这个用户  然后选定DROP TABLE dbo.tables1--按执行  此时你会发现这张表是无法直接删除的  因为我没有权限去删除这张表  但是我现在以alice的身份执行EXEC dbo.drop_tables这样的一个存储过程  因为我刚才授予了alice的权限了  选定EXEC dbo.drop_tables--按执行之后会发现查出表的内容同时把这张表删除了  所以说通过EXECUTE AS可以帮助我们有效地控制权限  让用户能够执行一些预定义的操作  但不要授予它太高的权限                                                                
Execute AS CALLER: 语句以当前调用方的权限执行模块,默认行为 
  Execute AS "UserName": 语句以指定的用户上下文执行模块  访问断开的拥有权链
  Execute AS SELF: 以创建或更改模块的用户上下文执行 
  Execute AS OWNER: 当前所有者的上下文中执行模块中的语句 
  SQL Server 2005对加密的内建支持: 内建对加密解密支持-->完整的密钥体系结构  使用DDL创建密钥和证书  加密、解密函数  支持众多加密算法   数据保护方法-->使用对称密钥、非对称密钥、数字证书加密数据  使用证书对数据库中的模块进行数字签名  对称密钥、私钥都在SQL中加密存储 
加密层次和体系: 服务主密钥  数据库主密钥  非对称密钥  数字证书  对称密钥  -->见下图:
20031790
20031801
使用数据库加密的过程: 1.全选创建数据库主密钥的语句--按执行之后就可以创建数据库主密钥了  2. 数据库主密钥创建完成之后就可以使用数据库加密的功能了  全选创建存放加密数据的表语句--按执行之后就发现创建了一张叫做dbo.SecTable的表了 待会我就在这张表上存放加密的数据 3.创建数字证书  全选创建数字证书,数字证书的私钥被数据库主密钥加密语句--按执行之后就创建一张证书了  4.创建证书以后就可以去创建一个对称密钥了  其实我们也知道在大多数情况下对数据加密的时候都应该使用对称加密的方法  为什么呢? 因为对称加密的算法速度很快并且占用系统的资源少  如果是使用公钥和私钥这种方式加密的话  它的加密对系统的资源占用非常大的 而且它的时间也比较长  因此我们都是使用对称密钥对数据进行加密的  按创建对称密钥,被用证书对其进行加密语句--按执行  我现在就是使用刚才生成的aliceCert证书进行加密的 
20031802
  5.使用对称密钥对数据进行加密  在使用对称密钥之前首先把对称密钥打开  因为它是被证书保护起来的  所以使用权限把对称密钥打开  执行OPEN SYMMETRIC KEY Sym_Tom DECRYPTION BY CERTIFICATE aliceCert这条语句把它打开  打开了以后就对刚才创建的表中去插入一些数据  数据是什么呢?  就是'alice'这个字符串  对这个字符串进行加密  使用EncryptByKey这个函数来使用我们刚才打开的对称密钥对这个字符串进行加密  然后再把这个值存放在刚才创建的表中 全选
INSERT INTO SecTable (DATA) VALUES(EncryptByKey(Key_GUID('Sym_alice'), N'alice1'))
INSERT INTO SecTable (DATA) VALUES(EncryptByKey(Key_GUID('Sym_alice'), N'alice2'))
INSERT INTO SecTable (DATA) VALUES(EncryptByKey(Key_GUID('Sym_alice'), N'alice3'))这三条语句  按执行之后就插入三行数据了  数据插入完成之后需要执行CLOSE SYMMETRIC KEY Sym_alice这条语句把对称密钥关闭掉
  6.查看被加密的数据内容  执行SELECT * FROM dbo.SecTable这条语句之后可以查看表的内容  其实这张表的内容是看不到的  它是被加密的  你看到的是乱码
7.使用证书解开对称密钥,解密数据表中的数据,完成后关闭对称密钥  怎么样去查看真正的内容呢?  可以使用刚才创建的对称密钥把它打开  执行OPEN SYMMETRIC KEY Sym_Tom DECRYPTION BY CERTIFICATE TomCert这条语句之后就可以把它打开了  打开以后再使用DecryptByKey这个函数对数据进行解密  执行SELECT ID, CAST(DecryptByKey(Data) AS NVARCHAR) FROM dbo.SecTable这条语句之后就可以看到刚才插入的数据了-->alice1  alice2  alice3  最后执行CLOSE SYMMETRIC KEY Sym_Tom这条语句把对称密钥关闭掉 
访问审核: 数据库引擎默认记录失败的登录尝试  支持对分析服务的审核  Profiler工具支持更多的审核事件  用DDL和DML触发器定制数据库变更的审核
20031803
默认情况下AdventureWorks下的可编程性里面的数据库触发器是被禁用的  如果想使用数据库触发器的话是需要执行几条语句的  1.启用数据库触发器  执行
USE AdventureWorks
GO
ENABLE TRIGGER ddlDatabaseTriggerLog ON DATABASE
GO  这条语句  展开数据库--AdventureWorks--可编程性--数据库触发器--对着ddlDatabaseTriggerLog右键--按编写数据库触发器脚本为--按CREATE到--选择新查询编辑器窗口就可以看到数据库触发器的内容了 
2.  执行
CREATE TABLE dbo.table_1
(ID INT PRIMARY KEY,
Des VARCHAR(20))
Go  这条语句之后在消息里面就可以看到CREATE_TABLE = dbo.table_1
3.其实在这个过程中ddl触发器已经被触发而且把相应的日志记录到数据库中的日志数据表了  执行
SELECT TOP 1 * FROM dbo.DatabaseLog ORDER BY DatabaseLogID DESC  这条语句之后就可以查看所有的信息了  可以看到创建一张叫做table_1的表 
SQL Server 2005技术资源-->http://www.microsoft.com/china/technet/prodtechnol/sql/2005/default.mspx
  TechNet SQL Server 2005技术中心-安全-->http://www.microsoft.com/technet/prodtechnol/sql/themes/default.mspx

你可能感兴趣的:(sql,数据库,server,特性,概述)