开发人员和管理人员通常不断地考虑程序安全问题的策略──添加安全措施不再是一个可以完全接收的方法。程序的安全问题必须从设计的开始就得考虑,并贯穿开发的整个过程。以后如果要开发一个SQL Server的数据库,你一定要从开始就遵循这些安全设计规则。
最基本的要点
如果你不能理解SQL Server security基本的概念,就马上先停止开发并先阅读这些开发准则,你不可能在不知道这些概念的基础上就能够正确地使一个数据库安全化。程序的安全正如一辆卡车一样。你具有一个发动机,一把钥匙,当钥匙打开发动机即发动机启动之后,就有可能发生的全部过程。如果你忽略了某些细节,驾驶过程中就会发生很多麻烦。在问题产生之后,你可以将卡车交给一个修理工,然而对于程序的安全问题,你自己将是数据库的修理工。
开始,你必须选择以下两种安全模式:
l Windows 认证模式:用户通过一个现成的Windows用户帐号来连接服务器。当一个用户试图与一个服务器连接的时候,SQL Server将会认证用户的Windows帐号的名称和密码。用户不能同时进入网络和SQL Server,只能进入其中的一个。这一方法也被称为一个被依赖的连接。
l 混合模式:这一模式将Windows认证模式和SQL Server认证联接在一起。用户可以通过一个Windows用户帐号进行连接,这正如Windows认证一样。但是,你也可以在SQL Server中直接建立用户帐号。每一个SQL Server帐号都存储了一个用户名和密码。
我们建议在可能的情况下都使用Windows认证模式。然而,混合模式很可以使用,特别是在SQL Server 7.0(或更早版本)都可以使用。.对于早期的SQL Server版本,SQL Server认证存在一些缺点。Windows认证已经集成了操作系统的安全系统,这就提供了比SQL Server认证更多的安全特性,很容易的使用,效率更加高,安全性更加好。在设计开始的时候,你应该认真考虑选择哪一种模式最为合适。
密码
无论采用哪一些模式,你应该记住在SQL Server中为系统管理者(sa)设置一个密码。当安装SQL Server时,安装程序会自动建立一个带有SQL Server注册名称(sa)和一个空白密码的管理用户。如果你保持这些用户设置原样而使用混合安全模式,任何具备一点SQL Server基础知识的用户都可以很容易地进入到你的数据库中并做任何他想要做的事情。如果你使用的是Windows认证模式,在理论上你无需为sa用户设置一个密码,因为SQL Server注册不会接受这些的设置。但是设置是一个很良好的操作,尤其是当你被迫转移到将来使用的混合模式的时候。
如果安全模式已经启动,注册将成为关键。你必须使用正确的方法来启动程序,注册也是同样的,如果你不能正确地输入用户名和密码,程序将不能连接到网络,同时也不能连接到SQL Server。
作为一个管理者,一旦你已经启动了程序,你就做好安全管理的准备。可以通过定义以下的特性而实现:
l 用户(帐号):一个SQL Serve安全帐号代表着一个唯一的用户。一个用户也只有一个Windows帐号或者一个SQL Server注册,这与数据库中的用户帐号相统一。
l 组(帐号):每一个用户都属于一个或多个组,这由认证模式决定。每一个组都具有特定许可。作为一个组的成员,你将获得所有组的许可。
l 对象所有权:所有权属于建立对象的用户。所有者可以将访问权限分配给用户。如果你是一个视的所有者,你还可以决定哪些用户可以通过视来查看数据。
l 许可:一个许可代表着具有执行某些操作的权利,比如打开一个视或者更改一个存储程序。SQL Server承认许可的三种状态:GRANT给你一个用户访问;REVOKE删除访问;DENY防止用户访问对象。
l 任务:这是一个SQL Server安全帐号,可以将帐号的集合作为一个简单的单元来处理。任务定义在特定数据库中用户可以做哪些和哪些不可以做。
从安全的角度而考虑
设计过程应该用效地定义哪些地方需要进行安全设置和如何设置。在这一过程之前你应该从两个方面考虑:
l 敏感数据;
l 可以查看敏感数据的人。
敏感数据包括所有可能的数据,包括整个数据库中的所有数据,虽然这样的安全级别很少存在。你的工作就是定义为敏感数据并进行保护。
你选择的认证模式和建立的注册将通过限制哪些用户可以进入到数据库而实施第一步安全步骤。
第二步就要列举可以访问数据库的所有用户,然后决定所有数据是否对所有的用户都适用。通常,你需要对一些数据进行保护,比如工资或者其他私人数据。这就意味着只有特定的用户可以访问和查看数据。你还可以设置哪些用户更改数据。
始终记住的一条规则是“最小权利”概念。如果有人在他的工作中不需要访问数据,那即不要给他访问的权限。应该避免所有的用户都具有sa用户的访问权限。
具体的建议
当进行安全设置的时候,经验也是一个很好的老师,但通常也会有适用于通用数据库的设计准则:
l 从开始就获得数据库和对象的所有权。当建立一个新的数据库时,你将会成为数据库的所有者,并能够设置数据库中所有发生一切。你可以以管理者的身份注册数据库。然而,对象的所有权属于建立对象的用户。虽然这可能造成所有权的转移,但可以确定这些的注册能够被用于建立所有的对象。
l 理解所有权链。这一安全特性防止用户建立自己的视而偷看一些敏感数据。例如,假设你建立一个从两个表中集中的数据的视,如果你是这两个表的所有者,当你允许其他用户使用视的许可时,SQL Server不会检查表的有关许可。
l 使用视和存储程序以分配给用户访问数据的权利,而不是让用户编写一些直接访问表格的特别查询语句。通过这种方式,你无需在表格中将访问权利分配给用户。视和存储程序也可以限制查看的数据。例如,如果你的雇员表格包含一些秘密的工资信息,你可以建立一个省略了工资栏的视。
l 如果用户从特定程序中进入你的程序,你可以建立程序任务。一个程序任务就是分配到特定程序的用户,并给予用户的有关许可。使用程序任务,用户不能直接地认证数据库,相反,他们先认证他们自己的程序,这就决定哪些程序任务与服务器相连接。
l 时刻注意程序补丁。不可否认的,程序补丁是一些诀窍的集合。程序的发布,更新等都会引入新的问题,使用程序补丁是防止外界干扰和保护数据的最好和最容易的方法。可以访问微软主页上的SQL Service Pack下载页,查看当前最新的程序补丁。
结论
程序安全机制是每一个开发人员都必须面临的问题。不要等到数据库开发过程中和使用中才考虑到安全问题──安全是设计过程中的重要组成部分。除此之外,不要随意地应用安全设置而希望达到最佳的效果,应该学会选择安全模式并正确地应用。