由于微软平台始终在服务器系统业内占有相当大的份额,也因为此,微软的数据库便有得天独厚的先天条件。本章节介绍微软的Access数据库和SQL Server数据库。Access数据库是一种文件型数据库软件,如果你想学习,可以访问我们的Access教程。SQL Server也被称为MSSQL(MS是Microsoft的简称),是一款大型的商用数据库系统,速度快,查询效率高,安全性好,并不断有新版本推出。
一、ACCESS数据库安全
Access作为后台数据库时,安全性是最弱的,因为它是文件型数据库,本身只是作为一个文件存放在服务器上的,所有处理都是通过客户端来进行的,而因为并发锁定的问题,需要具有写权限才能维护锁定文件(ldb或laccdb),因此所有用户都对其具有读写权限。这种情况下如果攻击者知道了文件路径,是非常危险的。因此除了对数据库设置密码(这里强烈建议尽量使用新版本的Access,现在对于mdb格式的数据库,密码破解工具满天飞,设不设密码都一个样,而accdb格式的数据库密码现在还没有听说被谁破解)。那我们该如何应对,保证ACCESS数据库的安全呢,以下为几点对策:
- 1、不要使用老式的ASP编写网站程序。老式的ASP程序已经过时了,且没有文件保护机制,数据库一旦地址暴露,就很容易被直接下载。可以使用ASP.net技术编写网站程序。
- 2、尽可能的将文件路径和文件名搞的复杂。在数据库新建一个表,表名为<%safe;文件名可以加#作为前后缀,如#name#.mdb,加大下载难度。
- 3、.net程序一定要配置好config文件。machine.config和web.config两个文件要配置好,使得在没有找到文件夹默认文档的情况下,不会列出文件列表,同时,使得access文件所在的文件夹无法被直接访问。
- 4、直接使用数据源 (ODBC)。这样数据库就可以不用在web目录里面,从而彻底防止被下载,但是这样做你必须拥有服务器的管理员权限。
二、SQL Server数据库的安全
SQL Server有2种验证用户身份的方法:一是Windows身份验证。二是SQL Server用户身份认证。Windows身份验证的安全性要高于SQL Server用户身份认证,但由于只适合Intranet局域网应用,注定不成主流。安装SQL Server时,你可以选择SQL实例允许的验证模式。安装完成后你可以在SSMS里的服务器属性对话框里修改这个设置。
SQL Server在安装的时候,就内置了sa登录——sa或系统管理员,登录是为了SQL Server的早期版本的向后兼容性。sa登录映射到sysadmin服务器角色,任何以sa登录到SQL Server的任何人有完全的系统管理员权限,在整个SQL Server实例和所有里面的数据库都有不可撤销的权利。这的确是个“强大的”登录,强大到已经成为了一个实际上的后门。绝不要在应用程序里使用sa登录来访问数据库。如果黑客拿到sa的控制权,就会拿到整个数据库服务器的管理权限。在早期,这是黑入服务器的最简单方法。相反,为每个数据库设置一个自定义的Windows或SQL Server登录来使用,和本教程之前介绍的页面授权机制一样,只给这个登录必须的权限,不必要的权限不要给。
如果可以,我们应该完全禁用sa登录。那样的话攻击者不能使用这个全能登录来控制你的服务器实例,不管你是否设置了强悍的sa密码。
如何为每个数据库设置单独的登录名呢?首先,我们去“SQL Server Management Studio”(老版本是企业管理器)中,利用sa账户登录,然后,在左边的“对象资源管理器”中,展开“安全性-登录名”,然后使用鼠标右键新建一个登录名,在“常规”选项卡里,将“默认数据库”选择为你想控制的单独数据库:
在“用户映射”选项卡里,为这个用户名确定成员“身份”:
然后,再次在左侧“对象资源管理器”中,依次展开“数据库名-安全性-用户”,鼠标右键-属性,在弹出的对话框中,可以为该用户确定默认“架构”。一般选择默认的“dbo”:
这样,我们就可以利用w3xue_dbmaster这个用户单独访问“AutoInfo”这个数据库了。这里,我们提到了2个重要的概念:“身份”和“架构”。它们分别是什么意思呢?
“身份”,又被称为“角色”,是一个数据库操作者的权限定位,不同的“身份”对应着不同的数据库操作权限,具体说明如下:
- db_accessadmin:可以在数据库里添加和删除Windows登录和组,SQL Server登录。
- db_backupoperator:可以备份数据库。
- db_datareader:可以在数据库里从用户表里查看任何数据。
- db_datawriter:可以在数据库里的用户表里添加,修改或删除数据。
- db_ddladmin:可以在数据库里添加,修改或删除对象。(DDL是数据定义语言(Definition Language)的简称,对数据库做出结构化修改的T-SQL命令集)
- db_denydatareader:在数据库里不能查看任何数据。
- db_denydatawriter:在数据库里不能修改任何数据。
- db_owner:可以进行数据库角色的任何活动,包括维护和配置活动。这个角色包含素有其它角色,对于这个数据库,这个是作为管理员的基础。
- db_securityadmin:可以在数据库里管理角色成员资格和声明,还有对象许可。
在数据库里,固定数据库角色可以简单的分配许可。例如,假设你想一个用户对访问的数据库只能备份。你不想用户能读取数据——只有备份。你可以通过让用户是db_backupoperator和db_denydatareader角色的成员来实现。使用sp_helprole和sp_helprolemember系统存储过程来查看数据库角色的信息。
那么,“架构”是指什么呢?以dbo为例,在每个数据库里dbo是个特殊的用户账号,它映射到sysadmin固定服务器角色。这就是说,如果你是sysadmin角色的成员,你在任何数据里创建了一个对象,那么那个对象的拥有者是dbo,不是你。你不能删除dbo用户,它只映射到sysadmin,不是数据库拥有者(db_owner)。dbo用户和db_owner“角色”毫无关系。
每个数据库也有属于dbo用户的dbo架构,这是dbo用户的默认架构。因此,当你作为sysadmin访问数据库时,不指定任何架构创建一个对象,它的两部分名称会是“dbo.对象名称”。当任何其他用户访问数据时,如果没有指定架构名称的话,dbo架构也是默认的次要架构。如果用用户joe尝试访问名为sales的表,SQL Server首先会检查对于joe用户,在默认架构里是否有sales表,如果没有的话,它会检查在dbo架构里是否有sales表。仅当2个架构里都没有sales表存在,才会有生成找不到对象的错误。因此对于每个访问的对象,最好的做法是指定它的架构名。
对于SQL Server数据库的安全,我们还有如下建议:
- 注意操作系统的安全设置。主要方法有:1)限制不必要的用户,禁用GUEST账号,并为amdinistrator用户账号 更名并增中密码;2)设置系统登录中的各个选项;3)使用NTFS格式分区;4)修改注册表关闭默认共享服备;5)关闭不需要的服务;6)关闭不必要的端口,最好不要使用远程管理软件和不信任的服务器软件等。
- 安装最新SQL Server数据库补丁包。为了保证数据库的安全性,一个常用的、最有效的方法是到微软官方网站上及时更新SQL Server的service pack以及其它已发布的安全更新。
- 修改默认的1433端口,并且将SQL Server隐藏。这样能禁止对试图枚举网络上现有的 SQL Server 客户端所发出的广播作出响应。另外,还需要在TCP/ip筛选中将 1433端口屏蔽掉,尽可能的隐藏SQL Server数据库。这样子一但让攻击创建了SQL Server的账号,也不能马上使用查询分析器远程登陆来进行下一步的攻击。
- 删除有安全问题的SQL过程。SQL INJECTION往往在Web CODE中产生。攻击者一旦确认了网站存在SQL INJECTION漏洞,肯定有一步操作步骤就是测试网站的SQL Server使用者具有多大的权限。一般都会借助SELECT IS_SRVROLEMEMBER('sysadmin'),或者SELECT IS_MEMBER('db_owner'),SQL Server 就会提示了错误信息,从该信息中即可知道一些敏感信息)等语句进行测试。
- 删除危险函数。SQL Server为了方便操作Excel、Access、远程服务器等数据库,增加了OPENDATASOURCE和OPENROWSET 等函数,正是这些函数增加了数据库的危险性。黑客可以利用该函数进行数据库挂马,从而获得数据库,以及服务器的控制权限。如OPENDATASOURCE 的用法:SELECT*FROM OPEN-DATASOURCE ('SQLOLEDB', 'Data Source=ServerName; User ID=。MyUID; Password = MyPass') .Northwind.dbo.Categories黑客完全可以用此语句获得注入数据库的库名、表名、列名、字段值的所有信息。
- 删除不安全的扩展存储过程。xp_cmdshell是一个非常危险的扩展存储过程,它可执行dos命令,危险的不只是这个,还有Xp_regaddmulti-string 、Xp_regdeletekey、Xp_regdeletevalue等都是删除的对象。由于在sql server 2008中sp_dropextendedproc 不能删除系统扩展存储过程,所以直接禁用常见危险存储过程。具体可根据实际情况来操作,因为有些存储过程是正常需要的。对于一般账户而言,根本没有执行这些高危存储过程的权限,而对于SA账户来说,以上所有的操作都是可恢复的,个人觉得SA账户被入侵之后的关键控制点在于合理配置数据库服务运行账号的权限。
- 定期进行数据备份。在数据库日常管理过程中,进行数据备份为首要的工作。当服务器或SQL Server数据库系统发生崩溃时,其原先的数据很难恢复,因为SQL Server数据库不像Visual Foxpro等数据库可以直接拷贝数据库文件,前者必须要有备份策略才能安全恢复。因此,数据库应该安装在所属单位内部网的安全区域中,不要直接连接到 Internet。另外,在处理异常故障时应实施异机备份策略,采用适当有效的备份措施,保护数据安全。
- 必要时对数据库进行加密。数据库加密要求数据库密码系统将明文数据加密成密文数据,数据库中存储密文数据,查询时将密文数据取出解密得到明文信息,即便硬件存储失窃也不会泄漏数据,这样就大大提高了数据库系统的安全性,当然成本也随之提高。对于网络层面上的攻击,数据库主要采用安装防火墙、进行入侵检测等方式来提高其安全性能。防火墙阻挡来自外部的不可信连接。入侵检测系统一般部署在防火墙后,通过网络截包解析或者分析日志来检测网络中和主机上的异常。
- 限制可以访问数据库的IP。一般可以通过安全策略里面的ipsec或者windows防火墙来限制。
- 修改日志审核策略。将登录审核修改为“开启登录成功和失败的日志”,这样方便数据库被入侵之后,对日志的查看。
- 数据库服务运行账号。数据库需要往磁盘写文件,或者通过存储过程执行命令的权限由数据库服务器的运行账户权限决定,使用NETWORK SERVICE账户来运行数据库服务器是较安全的。
- 磁盘权限的合理配置。合理配置数据库运行,账户在磁盘上的权限,一定不要随意给写权限,特别是网站目录及数据库存储目录以外的位置,这样即使是SA也不能往磁盘写文件。
最后,我们推荐一个系列文章:http://www.cnblogs.com/woodytu/category/779788.html
转载本站内容时,请务必注明来自W3xue,违者必究。