SQLServer2k安全配置

发表于:2007-05-25来源:作者:点击数: 标签:
SQLServer2000的 安全 配置 数据库是电子商务、 金融 以及ERP系统的基础,通常都保存着重要的商业伙伴和客户信息。大多数企业、组织以及政府部门的电子数据都保存在各种数据库中,他们用这些数据库保存一些个人资料,比如员工薪水、个人资料等等。数据库 服

SQL Server 2000的安全配置
数据库是电子商务、金融以及ERP系统的基础,通常都保存着重要的商业伙伴和客户信息。大多数企业、组织以及政府部门的电子数据都保存在各种数据库中,他们用这些数据库保存一些个人资料,比如员工薪水、个人资料等等。数据库服务器还掌握着敏感的金融数据。包括交易记录、商业事务和帐号数据,战略上的或者专业的信息,比如专利和工程数据,甚至市场计划等等应该保护起来防止竞争者和其他非法者获取的资料。数据完整性和合法存取会受到很多方面的安全威胁,包括密码策略、系统后门、数据库操作以及本身的安全方案。但是数据库通常没有象操作系统和网络这样在安全性上受到重视。 

微软的SQL Server是一种广泛使用的数据库,很多电子商务网站、企业内部信息化平台等都是基于SQL Server上的,但是数据库的安全性还没有被人们更系统的安全性等同起来,多数管理员认为只要把网络和操作系统的安全搞好了,那么所有的应用程序也就安全了。大多数系统管理员对数据库不熟悉而数据库管理员有对安全问题关心太少,而且一些安全公司也忽略数据库安全,这就使数据库的安全问题更加严峻了。数据库系统中存在的安全漏洞和不当的配置通常会造成严重的后果,而且都难以发现。数据库应用程序通常同操作系统的最高管理员密切相关。广泛SQL Server数据库又是属于“端口”型的数据库,这就表示任何人都能够用分析工具试图连接到数据库上,从而绕过操作系统的安全机制,进而闯入系统、破坏和窃取数据资料,甚至破坏整个系统。 

这里,我们主要谈论有关SQL Server2000数据库的安全配置以及一些相关的安全和使用上的问题。 

在进行SQL Server 2000数据库的安全配置之前,首先你必须对操作系统进行安全配置,保证你的操作系统处于安全状态。然后对你要使用的操作数据库软件(程序)进行必要的安全审核,比如对ASP、PHP等脚本,这是很多基于数据库的WEB应用常出现的安全隐患,对于脚本主要是一个过滤问题,需要过滤一些类似 , ‘ ; @ / 等字符,防止破坏者构造恶意的SQL语句。接着,安装SQL Server2000后请打上补丁sp1以及最新的sp2。 
下载地址是 http://www.microsoft.com/sql/downlo...ds/2000/sp2.asp 

在做完上面三步基础之后,我们再来讨论SQL Server的安全配置。 

1、使用安全的密码策略 
我们把密码策略摆在所有安全配置的第一步,请注意,很多数据库帐号的密码过于简单,这跟系统密码过于简单是一个道理。对于sa更应该注意,同时不要让sa帐号的密码写于应用程序或者脚本中。健壮的密码是安全的第一步! 
SQL Server2000安装的时候,如果是使用混合模式,那么就需要输入sa的密码,除非你确认必须使用空密码。这比以前的版本有所改进。 
同时养成定期修改密码的好习惯。数据库管理员应该定期查看是否有不符合密码要求的帐号。比如使用下面的SQL语句: 
Use master 
Select name,Password from syslogins where password is null 

2、使用安全的帐号策略。 
由于SQL Server不能更改sa用户名称,也不能删除这个超级用户,所以,我们必须对这个帐号进行最强的保护,当然,包括使用一个非常强壮的密码,最好不要在数据库应用中使用sa帐号,只有当没有其它方法登录到 SQL Server 实例(例如,当其它系统管理员不可用或忘记了密码)时才使用 sa。建议数据库管理员新建立一个拥有与sa一样权限的超级用户来管理数据库。安全的帐号策略还包括不要让管理员权限的帐号泛滥。 SQL Server的认证模式有Windows身份认证和混合身份认证两种。如果数据库管理员不希望操作系统管理员来通过操作系统登陆来接触数据库的话,可以在帐号管理中把系统帐号“BUILTINAdministrators”删除。不过这样做的结果是一旦sa帐号忘记密码的话,就没有办法来恢复了。 
很多主机使用数据库应用只是用来做查询、修改等简单功能的,请根据实际需要分配帐号,并赋予仅仅能够满足应用要求和需要的权限。比如,只要查询功能的,那么就使用一个简单的public帐号能够select就可以了。 

3、加强数据库日志的记录。 
审核数据库登录事件的“失败和成功”,在实例属性中选择“安全性”,将其中的审核级别选定为全部,这样在数据库系统和操作系统日志里面,就详细记录了所有帐号的登录事件。如图: 


请定期查看SQL Server日志检查是否有可疑的登录事件发生,或者使用DOS命令。 
findstr /C:"登录" d:Microsoft SQL ServerMSSQLLOG*.* 

4、管理扩展存储过程 
对存储过程进行大手术,并且对帐号调用扩展存储过程的权限要慎重。其实在多数应用中根本用不到多少系统的存储过程,而SQL Server的这么多系统存储过程只是用来适应广大用户需求的,所以请删除不必要的存储过程,因为有些系统的存储过程能很容易地被人利用起来提升权限或进行破坏。 
如果你不需要扩展存储过程xp_cmdshell请把它去掉。使用这个SQL语句: 
use master 
sp_dropextendedproc 'xp_cmdshell' 
xp_cmdshell是进入操作系统的最佳捷径,是数据库留给操作系统的一个大后门。如果你需要这个存储过程,请用这个语句也可以恢复过来。 
sp_addextendedproc 'xp_cmdshell', 'xpsql70.dll' 

如果你不需要请丢弃OLE自动存储过程(会造成管理器中的某些特征不能使用),这些过程包括如下: 
Sp_OACreate Sp_OADestroy Sp_OAGetErrorInfo Sp_OAGetProperty 
Sp_OAMethod Sp_OASetProperty Sp_OAStop 
去掉不需要的注册表访问的存储过程,注册表存储过程甚至能够读出操作系统管理员的密码来,如下: 
Xp_regaddmultistring Xp_regdeletekey Xp_regdeletevalue Xp_regenumvalues 
Xp_regread Xp_regremovemultistring Xp_regwrite 
还有一些其他的扩展存储过程,你也最好检查检查。 
在处理存储过程的时候,请确认一下,避免造成对数据库或应用程序的伤害。 

5、使用协议加密 
SQL Server 2000使用的Tabular Data Stream协议来进行网络数据交换,如果不加密的话,所有的网络传输都是明文的,包括密码、数据库内容等等,这是一个很大的安全威胁。能被人在网络中截获到他们需要的东西,包括数据库帐号和密码。所以,在条件容许情况下,最好使用SSL来加密协议,当然,你需要一个证书来支持。 

6、不要让人随便探测到你的TCP/IP端口 
默认情况下,SQL Server使用1433端口监听,很多人都说SQL Server配置的时候要把这个端口改变,这样别人就不能很容易地知道使用的什么端口了。可惜,通过微软未公开的1434端口的UDP探测可以很容易知道SQL Server使用的什么TCP/IP端口了(请参考《深入探索SQL Server网络连接的安全问题》)。 不过微软还是考虑到了这个问题,毕竟公开而且开放的端口会引起不必要的麻烦。在实例属性中选择TCP/IP协议的属性。选择隐藏 SQL Server 实例。如果隐藏了 SQL Server 实例,则将禁止对试图枚举网络上现有的 SQL Server 实例的客户端所发出的广播作出响应。这样,别人就不能用1434来探测你的TCP/IP端口了(除非用Port Scan)。 

7、修改TCP/IP使用的端口 
请在上一步配置的基础上,更改原默认的1433端口。在实例属性中选择网络配置中的TCP/IP协议的属性,将TCP/IP使用的默认端口变为其他端口。如图: 



9、拒绝来自1434端口的探测 
由于1434端口探测没有限制,能够被别人探测到一些数据库信息,而且还可能遭到DOS攻击让数据库服务器的CPU负荷增大,所以对Windows 2000操作系统来说,在IPSec过滤拒绝掉1434端口的UDP通讯,可以尽可能地隐藏你的SQL Server。 

10、对网络连接进行IP限制 
SQL Server 2000数据库系统本身没有提供网络连接的安全解决办法,但是Windows 2000提供了这样的安全机制。使用操作系统自己的IPSec可以实现IP数据包的安全性。请对IP连接进行限制,只保证自己的IP能够访问,也拒绝其他IP进行的端口连接,把来自网络上的安全威胁进行有效的控制。 
关于IPSec的使用请参看 http://www.microsoft.com/china/tech...ty/ipsecloc.asp 

上面主要介绍的一些SQL Server的安全配置,经过以上的配置,可以让SQL Server本身具备足够的安全防范能力。当然,更主要的还是要加强内部的安全控制和管理员的安全培训,而且安全性问题是一个长期的解决过程,还需要以后进行更多的安全维护。


SQL Server 2000中全文检索的使用引言 

微软的SQL Server数据库是一个在中低端企业应用中占有广泛市场的关系型数据库系统,它以简单、方便、易用等特性深得众多软件开发人员和数据库管理人员的钟爱。但SQL Server 7.0以前的数据库系统由于没有全文检索功能,致使无法提供像文本内容查找此类的服务,成为一个小小的遗憾。从SQL Server 7.0起,到如今的SQL Server 2000终于具备了全文检索功能,使用户可以高效地检索存储在数据库char、varchar、text、ntext、nchar、nvarchar等数据类型列中的文本数据。 

建立全文索引 

在进行全文检索之前,必须先建立和填充数据库全文索引。为了支持全文索引操作,SQL Server 7.0新增了一些存储过程和Transact-SQL语句。使用这些存储过程创建全文索引的具体步骤如下(括号内为调用的存储过程名称): 

1. 启动数据库的全文处理功能(sp_fulltext_ 

database);; 

2. 建立全文检索目录(sp_fulltext_catalog); 

3.在全文检索目录中注册需要全文索引的表(sp_fulltext_table); 

4. 指出表中需要全文检索的列名(sp_fulltext_ 

column);; 

5. 为表创建全文索引(sp_fulltext_table);; 

6. 填充全文检索目录(sp_fulltext_catalog)。 

下面举例说明如何创建全文索引,在本例中,对Test数据库Book表中Title列和Notes列建立全文索引。 

use test //打开数据库 

//打开全文索引支持,启动SQL Server的全文搜索服务 

execute sp_fulltext_database ‘enable’ 

//建立全文检索目录ft_test 

execute sp_fulltext_catalog ‘ft_test’, ‘create’ 

为Title列建立全文索引数据元,pk_title为Book表中由主键所建立的唯一索引,这个参数是必需的。 

execute sp_fulltext_table ‘book’,‘create’, ‘ft_test’,‘pk_title’ 

//设置全文索引列名 

execute sp_fulltext_column ‘book’, ‘title’, ‘add’ 

execute sp_fulltext_column ‘book’,‘notes’, ‘add’ 

//建立全文索引 

execute sp_fulltext_table ‘book’, ‘activate’ 

//填充全文索引目录 

execute sp_fulltext_catalog ‘ft_test’, ‘start_full’ 

至此,全文索引建立完毕。 

进行全文检索 

SQL Server 2000提供的全文检索语句主要有CONTAINS和FREETEXT。CONTAINS语句的功能是在表的所有列或指定列中搜索:一个字或短语;一个字或短语的前缀;与一个字相近的另一个字;一个字的派生字;一个重复出现的字。 

CONTAINS语句的语法格式为: 

CONTAINS({column | *}), 
_condition>) 
其中,column是搜索列,使用“*”时说明对表中所有全文索引列进行搜索。Contains_search_ 

condition 说明CONTAINS语句的搜索内容,其语法格式为: 

{

}[{{AND|AND NOT|OR}}] [...n] 

下面就simple_term和prefix_term参数做简要说明: 

simple_term是CONTAINS语句所搜索的单字或短语,当搜索的是一个短语时,必须使用双引号作为定界符。其格式为: 

{‘word’|“ phrase”} 

prefix_term说明CONTAINS语句所搜索的字或短语前缀,其格式为: 

{“word*” | “phrase*”} 

例如,下面语句检索Book表的Title列和Notes列中包含“database”或“computer”字符串的图书名称及其注释信息: 

select title, notes 

from book 

where contains(tilte, ‘database’) or contains(notes,‘database’) 

or contains(title,‘computer’) or contains(notes,‘computer’) 

FREETEXT语句的功能是在一个表的所有列或指定列中搜索一个自由文本格式的字符串,并返回与该字符串匹配的数据行。所以,FREETEXT语句所执行的功能又称做自由式全文查询。 

FREETEXT语句的语法格式为:FREETEXT({column | * },‘freetext_string’) 

其中,column是被搜索列,使用“*”时说明对表中的所有全文索引列进行搜索。Freetext_string参数指出所搜索的自由文本格式字符串。 

例如,下面语句使用FREETEXT语句搜索Book表中包含“Suclearcase/" target="_blank" >ccessful Life”字符串的数据行: 

select title, notes 

from book 

where freetext(*,‘Successful Life’) 

SQL语句简介-给初学者运用数据库管理是ASP的最引以自豪的功能正是由于它在运行数据库上的强大的优势,才使得的人们相信CGI是可以代替的,当然要在数据库上做文章,不知道SQL是不可能的,在ASP中无论何时访问一个数据库,都要用SQL语句,因此掌握好SQL对ASP编程是非常重要的(不好了...臭鸡蛋过来了.....成龙赶紧闪........) 
在ASP中我们最最常用的是SQL的数据查询语言和数据*作语言 
那就先介绍数据查询吧 

1.一般的数据查询的格式如下:(对单个表的查询*作) 
select 字段 from 表 where 查询条件 
举例说明:我从student表中取出name字段为"成龙"的学生,显示的时候只显示name字段,可以用如下语句: 
select name from student where name='成龙' 

2.*作多个表就显得稍微麻烦了,声名:*作多个表的时候一定要写出各个表的关联的字段,否则,取出多个表的记录的时候,将以排列组合的方式显示的,这样的查询在大多数的情况下是没有任何意义的,除非你刻意去这样做. 
举例:数据库pubs中有三个表titleauthor,titles 和authors,titleauthor是用来将titles和authors表关联在一起的,可以写如下的查询语句: 
select au_name,title from author 
where authors.au_id=titles_id and 
titles.title_id=titleauthor.title_id 

如果还有别的约束条件可以继续添加and或者or语句,如果查询*作的表是2个,而事先知道2个表中的字段是"多对多"的关系,就得用第3个表来关联了,如果2个表只存在"一对一"或者"一对多"的关系,可以利用公共字段对他们进行关联! 
大家好我是成龙,上次介绍完了SQL语句的查询,这次该介绍SQL语句的*作了 
其实*作语言也不难,包括insert,update,delete分别对表中的数据进行添加,修改和删除 

1.插入数据语法如下: 

insert into mytable(mycolumn) values('somevalue') 
举例说明一个student表有中的两个字段name和sex要插入数据记录为"成龙""男性" 
insert into student(name,sex) values('成龙','男性') 

2.删除记录的语法如下: 

delete from mytable where some_lolunm='somevalue' 
举例说明:将student表中name字段为"成龙"的记录删除 
delete from student where name='成龙' 

3.更新记录语法如下: 
update mytable set first_colum='some_value' 
where second_cloum='someother_value' 
举例说明:将student 表中name字段为"成龙"的记录中的sex字段中的"男性"改为"男"(前提条件:没有把这个记录删除!) 
update student set sex='男' 
where name='成龙' 

总结:SQL是一门非常强大的面向集合的数据库语言,想将它灵活运用并不是一件容易的事,需要你在以后的日子里不断的摸索推敲,当然,运用在ASP中的SQL语句都是相对简单的.

原文转自:http://www.ltesting.net