浅谈数据库服务器的安全性
随着因特网的日益扩大、数据库技术的成熟。网络数据库的安全性问题显得日益重要。当今的网络数据库更多是互联的、多级的,不同安全级别的数据库,因此,数据库的安全性不仅涉及到数据库之间的安全性,更多的是涉及到一个数据库中多功能的安全性。理想数据库的安全性主要从几个方面来考虑:
一 通过典型的网络防御设计方案-------背靠背模型来防止***数据库,
二 服务器载体的安全性,
三 服务器配置的安全性 。
 一 网络外层防御设计的安全性
   外层的安全性威胁最主要是来自病毒的侵犯,对此,采用防、杀、管相结合的综合管理办法,采用***技术构建数据库系统访问的虚拟专用网来保证网络接入的安全性和数据传输的安全性,通过软硬件防火墙技术,实现网间隔离和网段隔离,从而确保系统免受病毒等的非法***。
 二服务器载体的安全性
   操作系统是数据库系统运行的平台,为数据库系统提供一定程度的安全保护。目前操作系统平台大多数是Windows server 2003和unix,安全级别都很好,平台的安全性主要体现在操作系统安全策略、安全管理策略、数据安全等。其中操作系统安全包括密码策略、用户锁定策略、审核策略、ipsec 、用户权限指派、加密数据的恢复代理等等。
 三服务器配置的安全性
  (一)    用户的访问控制
     在SQL2000中只能通过SQL SERVER验证和SQL SERVER 、Windows验证,而SQL2005中在SQL2000的基础上新增了密码策略,更好的实现了用户访问的安全性。
   1通过增强密码的强度来保证安全性
 在beijing服务器上创建一个Windows 用户登录
     Create login [beijing\mary] from windows with default_database=master
     创建一个强制实施密码策略的SQL用户
     Create login mary with password=’Ccjsj1200’ must_change,default_database=master,check_expiration=on, check_policy=on
 通过下面的SQL语句可以查看所有登陆的口令策略:
   Select name , is_policy_checked , is_expiration_checked from sys.sql_logins
 执行结果如下:

 
Is_policy_checked中的值为1表示该列上使用强制策略,is_expiration_checked的值为1表示使用了强迫口令过期
  若想使刚创建的用户使用复杂性口令,但不强迫口令有过期时间,可使用:alter login zhangsan with check_expiration=off
  若强迫口令过期,可使用: alter login zhangsan with check_expiration=on
   2 禁用一些不常用的账户
    如果SQL SERVER账户被***用来***数据库实例,那么禁用该账户就可以防止***通过该账户进行***,如禁用zhang san ,可以使用:alter login zhangsan disable
   3限制指定用户对数据库的访问权限
      (1)如指定用户mary 对ITET数据库只有select 权限
       在命令提示符下创建用户:net user mary Ccjsj1200 /add
        然后在服务器上限制访问
       Create login [Beijing\mary] with password=’Ccjsj1200’ from windows with default_database=master
       Use itet
       Create user mary from login [Beijing\mary]
       Grant select on itet to mary
     (2) 通过创建角色来管理用户的访问权限
        A 创建角色: create role 角色名
        B 在角色中添加用户:sp_addrolemember 角色名,用户名       
C显示角色中用户的信息:sp_helprolemember 角色名
        D 分配权限: grant delete on 角色名 to 用户名
        E 删除角色中的用户:sp_droprolemember 角色名,用户名
        F  删除角色:drop role 角色名
   (二)数据存储的安全性
        数据库的存储安全主要体现在数据的备份和恢复,数据库的备份有分为两种:硬件级的和软件级的。硬件级的备份是指通过添加硬件设备来冗余而保证系统的连续运行,软件级的备份是将数据保存到其他介质中。
     软件级的备份:使用命令进行备份:
      创建备份的设备exec 数据库名.dbo.sp_addmpdevice @devtype=’disk’, @logicalname=’itetbak’,@physialname=’c:\sql2005\itet.bak’
     或者是 sp_addmpdevice ‘disk’,’itetbak’,’c:\sql2005\itet.bak’
     1完全备份
Backup databse 数据库名 to 备份目的地
     2 还原
Restore database 数据库名from 备份目的地
     3 差异备份
Backup database 数据库名 to备份目的地 with differential
  4 查看备份状态
Restore headeronly from 备份设备
     5 事务日志备份
Backup log 数据库名 to 备份目的地
硬件级的备份:通过数据库群集、数据库镜像、数据库复制、数据库日志传送等发式来达到数据库的正常运行。
   (三)通过对数据的加密来确保数据传输的安全性
       1口令加密:是个简单的数据加密技术,也是最弱的一种,它采用用户提供的口令字符串进行加密
       2 对称加密::使用单一的密钥对数据进行加密和解密,我们也可理解为一个“暗号”
       3非对称加密:它是最强的一种加密技术,因为它采用不同的密钥进行加密和解密,结合证书来实现。在一般情况下不使用这种加密技术对数据量大的数据进行加密,除非传输的数据安全性比操作数据的性能。
  创建非对称密钥的语法如下:
Create asymmetric key asym_key_name
 [authorization database_principal_name]
 {
  From<asym_key_source>
  |
  WITH ALGORITHM = {RSA_512 | RSA_1024 | RSA_2048}
}
ENCRYPTIONBY PASSWORD = ‘PASSWORD’
<asym_key_source>:: =
  File =’path_to_strong-name_file’
  |
  Executable file =’path_to_executable_file’
  |
Assembly assembly_name
 从语法中可以看出,一般可以采用指定加密算法的方法来创建非对称密钥,也可以采用从夫已经存在的文件中加载的方法创建非对称密钥,可以使用的加密算法有512位的RSA、1024位的RSA、2048位的RSA算法。
下面我们创建一个名为BBS的非对称密钥
Use itet
Go
Create asymmetric key bbs
With algorithm = rsa_512
Encryption by password = ‘fe34&*$PO2hs’

可以从视图sys.asymmetric_keys中查到该非对称密钥:
Select * from sys.asymmetric_keys

 
也可从SQL SERVER Management studio 对象浏览器中依次展开【数据库】\【itet】\【安全性】\【非对称密钥】中看到非对称密钥

        
在创建非对称密钥之后,我们来看看如何用该密钥对bbs进行加密。在SQL2005中使用Encryptbyasymkey()加密和Decryptbyasymkey()解密数据
语法如下:
   Encrybyasymkey ( asym_key_id, {‘cleartext’ | @cleartext})
   Dncrybyasymkey(asym_key_id, {‘ciphertext’ | @ciphertext} [ ,’asym_key_password’])
  其中:asym_key_id 是数据库中非对称密钥的id
        Cleartext:是使用非对称密钥加密的数据字符串
        @cleartext 可以是类型为varchar 、char、 nvarchar、nchar、wchar等变量,包含了非对称密钥的加密数据
        Ciphertext 是使用非对称密钥加密的数据字符串
        @ciphertext 可以是类型为varchar、char、nvarchar、nchar、wchar等变量
         Asym_key_password: 是用于加密数据库中非对称密钥的密码
不管是加密还是解密都用到了asym_key_id这个参数,即非对称密钥的id,这个可以通过asymkey_id()产生。语法如下:
  Asymkey_id(‘asym_key_name’) 通过非对称密钥的名字来返回非对称密钥的id  
下面我们就以员工的工资来测试
   加密:
      Intsert into yuangong values (1,’zhanglijie’,’gongchengbu’,
encryptbyasymkey(asymkey_id(‘bbs’),’5000’))
 
解密:
 
   select id,uname,bumen,convert(varchar(20),
decryptbyasymkey(asymkey_id('bbs'),gongzi,
cast('fe34&*$PO2hs'as nvarchar))) as gongzi from dbo.yuangong
where id=1
    
三 防止SQL注入
   SQL注入主要是指***或恶意用户在应用程序不知道的情况下通过应用程序来对SQL数据库执行恶意代码来侵害数据库从而达到他们想要的结果。如对数据库的增、删、改等操作,我们可通过对命令
 Or 1=1--、having 1=1--等命令的封锁来减少危害。