2.6 高级安全主题
数据库必须具有坚固的安全系统,才能控制可以执行的活动及可以查看和修改的信息。无论用户如何获得对数据库的访问权限,坚固的安全系统都可确保对数据进行保护。
实例067 数据文件安全
本实例可以提高数据库安全性
实例说明
SQL Server的所有数据都保存在数据库中,数据库通过文件保存数据,一旦数据库文件被非法获取,将会导致数据外泄。本实例介绍保护数据文件安全的方法。
技术要点
SQL Server的数据库文件可以存放在FAT或者NTFS文件系统上,但不能放在压缩文件系统中,建议把数据库文件放在NTFS分区上,这样可以使用NTFS的文件加密功能对数据库文件进行加密,同时也可以使用NTFS分区的权限管理功能控制对数据文件的访问权限。
在SQL Server中,创建数据库、为数据库添加数据文件、备份与还原数据库、使用某些扩展存储过程等,都免不了与文件或者网络设备打交道。对于SQL Server而言,决定用户能否在SQL Server中进行这些操作是通过用户权限控制的。对于操作系统而言,是否允许SQL Server访问某个文件或者网络备份,则是由MS SQL Server服务的启动用户决定。
注意:Windows 98或者Windows Me系统不支持Windows服务,SQL Server模拟SQL Server和SQL Server代理服务,不要求为这些模拟服务创建用户账户。因为在Windows 98或者Windows Me系统中不存在启动用户决定访问权限的问题。
实现过程
(1)使用本地系统账户。
本地系统账户不要求密码,没有Windows NT 4.0和Windows 2000的网络访问权限,同时限制SQL Server安装与其他服务器交互。
(2)使用域用户账户。
域用户账户使用Windows身份验证,既用于连接操作系统的用户名称和密码,也用于连接SQL Server。一般情况下都使用域用户账户,因为许多服务器之间的活动只能使用域用户账户才能执行,例如下面的操作。
● 远程过程调用。
● 复制。
● 备份到网络驱动器。
● 涉及远程数据源的异类连接。
● SQL Server代理邮件功能和SQL邮件。如果使用Microsoft Exchange则受此限制。大多数其他邮件系统同样要求用户端(SQL Server和SQL Server代理服务)运行具有网络访问权限的账户。
多台运行SQL Server的服务器可以共享同一用户账户。设置复制时,建议发布服务器及其所有订阅服务器共享SQL Server服务的同一服务账户。
如果使用域用户账户,则该账户必须满足如下要求。
● 具有访问和更改SQL Server目录(\Program Files\Microsoft SQL Server\Mssql)的权限。
● 具有访问和更改.mdf、.ndf及.ldf数据库文件的权限。
● 允许作为服务登录。
● 读写在以下位置的注册表键值。
对于默认实例,代码设置如下:
HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer HKEY_LOCAL_MACHINE\System\CurentControlset\Services\MSSQLServer HKEY_LOCAL_MACHINE\Software\Microsoft\winsows NT\CurrentVersion\perflib
对于任何命名实例,代码设置如下:
HKEY_LOCAL_MACHINE\Software\Microsoft\ Microsoft SQL Server HKEY_LOCAL_MACHINE\System\CurentControlset\Services\MSSQL$Instancename HKEY_LOCAL_MACHINE\Software\Microsoft\winsows NT\CurrentVersion\perflib
另外,域用户账户必须能读写下面这些服务的相应注册表键值:
SQLAgent$InstanceName、MSSearch和MSDTC。
除了上述要求外,如果要求某功能使用,则还需要域用户账户具有额外的权限,具体内容如表2.4所示。
表2.4 要求额外权限的功能
如果分配给MS SQL Server服务的启动账户不是本地Administrators组的成员,或者BULTIN\Administrators已经从SQL Server登录中删除,则必须将用于MS SQL Server服务或SQL Server Agent服务的启动账户添加到SQL Server系统管理员角色中。为[Domain\NTaccount]用户授予SQL Server登录。
实例068 安全配置
本实例可以提高数据库安全性
实例说明
本实例主要介绍实际应用中的常规安全配置的方法。
技术要点
下面是管理SQL Server实例中的一些常规安全配置建议。
(1)不使用多协议Net_Library,而是根据实际需要,仅保留必需的Net_Libeary。这通过服务器网络实用工具进行配置。
(2)如果数据重要,应该使用Net_Library加密,由于不建议使用多协议Net_Library,所以建议在必要的时候使用安全套接字层加密,SSL加密允许配置为强制所有客户端使用SSL,或者允许客户端有选择性地使用SSL,这样就容易在性能与安全之间找到平衡点。
(3)如果使用TCP/IP连接,建议隐藏服务器,以禁止对试图枚举网络上现有的SQL Server实例的客户端所发出的广播做出响应,同时,修改默认的TCP端口为自定义的TCP端口,减少被攻击的可能。
(4)禁止Windows身份验证。
(5)注意guest用户。
所有未与数据库关联的登录都将与数据库中的guest用户关联,如果不需要,应该删除所有用户数据库中的guest用户,如果确实需要使用它,应该给予最小的权限。
(6)注意public角色。
由于public角色捕获数据库中用户的所有默认权限,且无法删除,因此应授予public角色最小权限。
(7)注意sa用户。
系统管理员(sa)是为向后兼容而提供的特殊登录。默认情况下,它指派给固定服务器角色sysadmin,并且不能更改。由于sa是内置的固定管理员登录,很容易被猜测和攻击,所以不应使用它,而应该建立专门的系统管理员,并使用它们自己的方式来登录SQL Server。当其他系统管理员不可用或忘记了密码时才使用sa。
安装期间,如果选择使用混合模式身份验证,应该指定密码以防止使用sa登录未授权访问SQL Server实例。如果安装期间选择Windows身份验证,则安装之后立即为sa指定密码,然后将模式更改为混合模式身份验证,此时sa登录具有密码。
(8)使用指定的域用户账户启动MS SQL Server服务,将数据库放在安全的NTFS分区。
使用指定的域用户账户启动MS SQL Server服务,一方面可以控制SQL Server实例对系统设备和网络设备的使用权限,另一方面可以配合NTFS分区的权限管理和文件加密功能实现数据文件的安全。
使用NTFS分区的权限管理时,SQL Server本身不需要什么配置,只需在NTFS分区对应的文件夹中,为MS SQL Server服务的启动用户设置对应权限即可。如果设置了数据库文件目录的加密属性,而且加密时设置“将更改应用于文件夹、子文件夹和文件”,那么数据文件亦会被自动加密,以后创建在该目录中的数据文件也会被自动加密。
(9)按需要创建数据库角色和安全账户,防止登录访问非授权的数据。
(10)为所有的登录、应用程序角色设置强密码。
强密码使未经授权的用户更难于破解密码,入侵系统。强密码至少有7个字符长,包含字母、数字和符号,不能是词典单词、命令名称、人名或系统用户名。为确保安全,应该定期修改密码。
(11)管理好备份文件,对备份集和媒体集设置密码,以防止数据库备份被非法获取后,通过还原备份获取数据。
为备份集和媒体集设置密码,需要通过BACKUP与RESTORE实现,企业管理器没有提供相应的接口。
例如,下面的代码备份数据库pubs,并且设置备份集和媒体集的密码,还原数据库的时候,也必须指定相应的密码才能从备份设备中还原。
--备份的时候,设备备份集密码 BACKUP DATABASE pubs TO DISK='C:\pubs.bak' WITH FORMAT PASSWORD='备份集密码' MEDIAPASSWORD='媒体集密码'—两个密码可以只设置一个 --恢复的时候必须指定密码 RESTORE DATABASE pubs FROM DISK='C:\pubs.bak' WITH REPLACE, PASSWORD='备份集密码', MEDIAPASSWORD='媒体集密码'—如果备份时只指定了其中一个密码,还原时只需要指定其中一个
注意:如果只为备份集设置密码,那么只能防止对备份的未授权访问,但不能阻止重写备份集,如果设置了媒体集密码,那么在从媒体集还原或者往媒体集追加备份都必须提供媒体集密码,命名用FORMAL选项可以格式化有密码的媒体集。
实现过程
下面介绍安全的TCP/IP配置方法和禁止使用Windows身份验证的方法。具体操作步骤如下。
● 安全的TCP/IP配置方法。
(1)依次选择“开如”→“程序”→“Microsoft SQL Server”→“服务器网络实用工具”命令。
(2)打开“SQL Server网络实用工具”对话框,如图2.32所示。在“禁用的协议”列表中,选择“TCP/IP”选项,单击“启用”按钮。
图2.32 “SQL Server网络实用工具”对话框
(3)在打开的图2.33所示的对话框中的“启用的协议”中选中“TCP/IP”选项,单击“属性”按钮,打开“MRGCT-TCP/IP”对话框,在此选择“隐藏服务器”复选框。在“默认端口”文本框中输入一个自定义的端口号,这里输入2000,然后单击“确定”按钮,如图2.34所示。
图2.33 启用TCP/IP协议
图2.34 隐藏服务器并设置端口号
(4)单击“确定”按钮,重新启动MS SQL Server服务使设置生效。
● 禁止Windows身份验证。
SQL Server不支持单独的SQL Server身份验证(在Windows 98与Windows Me上运行的SQL Server实例除外),如果不想使用Windows身份验证,可以按如下方法操作。
注意:禁用Windows身份验证只能防止通过登录SQL Server实例来访问数据,并不能阻止直接对数据文件的访问。
(1)打开企业管理器,依次展开“服务器组”→“数据库服务器”→“安全性”。
(2)将所有类似的“Windows用户”和“Window组”的登录设置为“拒绝访问”,或者直接删除它们。具体的操作参考实例050和实例051中的相关说明。
(3)展开一个服务器组,右键单击数据库服务器,如MRGCY(Windows NT),在弹出的快捷菜单中选择“编辑SQL Server注册属性”命令,如图2.35所示。
图2.35 选择“编辑SQL Server注册属性”命令
(4)打开“已注册的SQL Server属性”对话框,在“连接”选项组中选择“使用SQL Server身份验证”单选按钮,在“登录名”文本框中输入企业管理器中登录SQL Server实例的登录名,然后选择“总是提示输入登录名和密码”复选框,如图2.36所示。这样,在企业管理器中操作SQL Server实例时,只要提供有效的密码,才能访问数据库。
图2.36 使用SQL Server身份验证
实例069 使用安全套接字层(SSL)加密
本实例可以提高数据库安全性
实例说明
启用SSL加密可以提高在SQL Server实例和应用程序之间通过网络交换的数据的安全性。通过网络发送的数据进行加密,可以防止未授权的用户使用如网络探测器一类的工具读取明文。本实例介绍使用安全套接字层(SSL)加密的方法。
技术要点
Microsoft SQL Server 2000可使用安全套接字层(SSL)加密在应用程序计算机和数据库计算机上的SQL Server实例之间传输的所有数据。SSL加密在超级套接字Net-Library(Dbnetlib.dll和Ssnetlib.dll)内执行,并应用于SQL Server 2000支持的所有计算机间协议。当激活SSL加密时,超级套接字Net-Library在执行以下操作前执行SSL加密。
● 调用Windows套接字2API传输TCP/IP套接字或NWLink IPX/SPX套接字。
● 调用Net-Library路由器将数据包发送到命名管道、多协议、AppleTalk或Banyan VINES Net-Library。
SSL加密仅适用于获得了公共证书颁发机构所颁发的证书的计算机上的SQL Server 2000实例。应用程序正在其上运行的计算机还必须有一个从同一证书颁发机构取得的根CA证书。
Net-Library加密通过安全套接字层API实现。采用40位还是128位加密级别取决于在应用程序计算机和数据库计算机上运行的Microsoft Windows操作系统的版本。
启用加密会降低Net-Library的性能。除所有未加密连接的工作外,加密还强制执行以下操作。
● 连接时需要额外的网络往返次数。
● 所有从应用程序发送到SQL Server实例的数据包必须由客户端Net-Library加密,并由服务器Net-Library解密。
● 所有从SQL Server实例发送到应用程序的数据包必须由服务器Net-Library加密,并由客户端Net-Library解密。
共享内存Net-Library通信本身具有安全性,无需加密。共享内存Net-Library不参与计算机间的通信。不能从任何其他Windows进程访问应用程序进程与数据库引擎进程之间的共享内存区。
为了与SQL Server的早期版本兼容,多协议Net-Library将继续支持自己的加密。这种加密与SSL加密分开指定,并通过调用Windows RPC加密API实现,不要求使用证书。采用40位还是128位的RPC加密级别取决于在应用程序计算机和数据库计算机上运行的Windows操作系统的版本。命名实例不支持多协议Net-Library。
实现过程
SSL加密仅适用于获得了公共证书颁发机构所颁发的证书的计算机上的SQL Server 2000实例,因此首先需要获得一张证书。
(1)在控制面板上运行“添加/删除Windows组件”安装Windows 2000证书服务,如图2.37所示。
图2.37 选择“证书服务”
(2)在“证书颁发机构类型”对话框中选择“独立根CA”单选按钮,如图2.38所示。
图2.38 选择“独立根CA”
(3)单击“下一步”按钮,在“CA的公用名称”文本框中输入CA的公用名称,如test CA,然后单击“下一步”按钮。
(4)接下来的操作均使用默认设置。
(5)打开Internet Explorer,在“地址”栏输入http://localhost/certsrv,进入证书服务申请界面。
注意:不同的证书服务器在安装的步骤上略有不同。
(6)在“欢迎”页的“选择一个任务”栏中,单击“申请一个证书”链接,如图2.39所示。
图2.39 申请证书
(7)在“申请一个证书”页面中,单击“高级证书申请”链接,如图2.40所示。
图2.40 选择“高级证书申请”
(8)在“高级证书申请”页面中,单击“创建并向此CA提交一个申请”链接,如图2.41所示。
图2.41 创建并向此CA提交一个申请
(9)在图2.42所示的页面中,填写证书申请表。在“识别信息”项的“姓名”文本框中,根据实际情况输入运行SQL Server的计算机的UNC名称(完全限定域名)。在“需要的证书类型”(或“预期目的”)项中,单击下拉列表,选择“服务器身份验证证书”选项。在“密钥选项”中,单击“创建新密钥集”单选按钮,单击“CSP”右边的下拉列表,选择“Microsoft RSA SChannel Cryptographic Provider”项,选中“将证书保存在本地计算机存储中”复选框,其他设置保持默认。填写完所需选项后,单击“提交”按钮提交申请。
图2.42 填写申请信息
(10)如果证书服务器自动颁发证书,则可以立即安装证书。否则,提交申请后,可以看到“证书挂起”页,如图2.43所示。
图2.43 “证书挂起”页
(11)要安装已经颁发的证书,需要浏览Microsoft证书服务器,在“欢迎”页中,单击“查看挂起的证书申请的状态”链接。在“查看挂起的证书申请的状态”页中,可以看到证书申请列表,如图2.44所示。
图2.44 “查看挂起的证书申请的状态”页
● 在“请选择您要查看的证书申请”链接列表中,单击在前面步骤中申请的证书链接,如果该证书已经被颁布,则会打开“证书已颁发”页,如图2.45所示。单击“安装此证书”链接,可以完成证书的安装。
图2.45 “证书已颁发”页面
● 如果申请证书填写的内容不正确,则会进入“证书申请被拒绝”页面,在该页中可以看到相关的错误信息。
● 如果申请的证书被拒绝,则亦会进入“证书申请被拒绝”页,在该页中可以看到拒绝信息。
● 如果申请的证书未被颁发,则会进入“证书挂起”页,在该页中可以看到挂起信息,并且可以单击页面中的“删除”按钮来删除当前查看的证书申请。
如果申请的证书未被颁发,则到Windows管理工具的“证书颁发机构”中申请颁发,如图2.46所示。
图2.46 “证书颁发机构”对话框
(12)在图2.45所示的对话框中,单击“安装此证书”链接,安装证书。
至此,已经完成了证书的申请、颁发与安装。下面将介绍在SQL Server中使用该证书的具体操作。
(1)在运行SQL Server的计算机上,单击“Microsoft SQL Server”程序组中的“服务器网络实用工具”。
(2)在“SQL Server网络实用工具”对话框中,选择“强制协议加密”复选框,如图2.47所示。
图2.47 强制协议加密
(3)启动SQL Server服务,如果可以顺利启动,则说明SSL加密已经启动。
实例070 如何SQL防范注入式攻击
本实例可以提高计算机安全性
实例说明
在开发应用程序时,有时会使用一些Transact-SQL语句,如果没有对用户输入的数据进行验证,那么就有可能受到SQL注入式攻击。本实例介绍防范SQL注入式攻击的方法。
技术要点
SQL注入式攻击是一种常规性的攻击,可以允许一些不法用户检索他人的数据,改变服务器的设置,或者在他人不小心的时候破坏其服务器。SQL注入式攻击不是SQL Server问题,而是不适当的程序。
实现过程
要防范SQL注入式攻击,应该注意以下事项。
(1)检查输入的SQL语句的内容,如果包含敏感字符,则删除敏感字符,敏感字符包括'、>、<、=、!、-、+、*、/、()、|和空格。
(2)不能在用户输入中构造WHERE子句,应该利用参数来使用存储过程。
说明:SQL注入一般出现在程序开发构造一个WHERE子句伴随着用户输入的时候。