利用Windows域让客户端“0”配置
Lewolf
关键字:C/S、Windows域、活动目录、域用户、客户端“0”配置
提要:本文主要通过Windows域用户集成的方式使C/S结构的客户端程序做到零配置,减少客户端配置是提高客户端灵活性,方便性的一个重要举措,同时又要保证整个系统的安全性、可靠性。
正文:
在C/S结构的系统应用中,客户端不可避免的需要进行配置,来完成相关诸如服务器、数据库访问等方面参数的设置,没有进行配置的客户端可以说无法和服务端完成整个系统的功能,本文中所说的零配置不是指没有配置,而是在客户端不需要手工进行烦琐而复杂的配置工作,这对于大规模的应用系统来说,将非常有效的降低客户端维护和管理的复杂成的。难以想像在数百台客户端工作的C/S系统中,由于DBA例行数据库访问密码更改而导致的整个系统必须重新配置,甚至部分工作站暂时不能工作情形将是多么恐怖的恶梦。
解脱网管、抛弃频繁的系统维护,加强集中管理,提高系统的安全性,正是本文将要探讨的问题。在本文中将要介绍的是利用Windows 2000中域(活动目录)来实现客户端“0”配置的解决方案,目前使用该方案的一个大型应用系统正在安全、平稳的运行中,实践证明,这是一种切实可行的解决方案,具有实用的现实意义。
应用系统和域用户验证集成的可行性<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
一.Windows 域用户的安全性
域是Windows NT操作系统提供的新的用户管理体系,在Windows 2000的服务器中,将域升级至活动目录,活动目录提供更高的用户安全机制,并且提供了更多的基于活动目录的相关功能,同时也加强了域用户策略的管理功能。
尽管在很多方面,Windows的域用户并不是完全可靠的,也存在着非常多的安全漏洞,同任何操作系统一样,并不是完全的安全可靠,但毋庸置疑的是,使用Windows域用户集成的方式作为C/S系统的验证体系,将可以应用获得系统级的安全措施,只要操作系统是安全的,基本就可以保证我们的应用系统是安全的。从这个角度讲,使用Windows的域用户作为应用系统的验证,将提高系统的安全性。
二.应用程序的验证
任何一个C/S结构不可避免的存在着安全性和用户身份验证的问题,大多数的C/S应用中都需要客户端程序创建用户认证的过程,只有输入正确的用户名和密码才可以访问服务器。
这实际上是一个重复的过程,因为在Windows系统中,严格的讲是在基于NT技术的Windows中,用户认证已经是一个严格的过程,然而在Windows系列的Windows 95和Windows 98中,可以通过加入域,并通过域用户策略来实现严格的用户认证过程。因此上Windows的登录已经是严格的登录过程,已经完成了用户使用身份的确认。
然而,大多数应用程序都没有将Windows验证作为程序自身的验证,这并不是说这种方式不可行。相反的是,如果将应用程序和域用户结合,不仅提高了应用程序本身的安全级别,也减少了不必要的重复的用户验证过程,当然处于更高级别的安全考虑,可以在关键的操作中加入二次验证的过程。
三.应用程序验证的实现
所谓客户端“0”配置,并不是说客户端不需要配置,而是将配置信息等是通过网络获取的,在获取配置信息的同时还必须完成用户操作权限的认证过程。
即使从网络获取配置信息,也并不是客户端完全孤立的存在,但是这个任务我们可以交给系统去作,因为系统本来就已经完成了这个操作,本文中讨论的验证方式,必须是在具有域控制器的网络上运行,而且客户端必须是这个域中的成员,这是一个基本要求,否则客户端将失去在网络上管理的能力,也无法控制用户的访问能力。
在一个大型的基于Windows的网络应用中,域是不可缺少的,与此同时存在的是DNS、DHCP、Wins等TCP的应用,这些服务往往是在域控制器中运行的,也是可以完全集中式管理的,我们将客户端应用程序做到“0”配置的目的之一就是可以完全的集中式管理所有客户端,而不需要额外的网管软件的支持。
实现客户端“0”配置的基本要素就是客户端获取自身登录的域控制器,这个在Windows登录的过程中已经实现,在Windows提供的服务中,没有提供这种类似的服务,为此我们必须自行设计用于客户端验证和获取配置的服务软件。在登录服务程序中,可以将任何希望通过登录服务获取的信息提供给客户端程序,但最主要的是对数据库的配置,诸如数据库类型、数据库的名称、数据库的服务器、数据库的用户访问名称和密码。获取数据库访问权限的同时就可以在数据库中获取任何复杂的配置信息。
域用户验证集成的实现过程
应用系统和域用户集成并不是不需要任何初始信息,而达到了客户端的“0”配置,只是利用了Windows的域用户验证过程,实现这个功能总共需要分作三个步骤。下图示意出整个验证过程的流程,接下来分别介绍这三个步骤。
一.收集本机信息
需要将应用系统和域用户的验证集成,就要求应用程序能够获取当前登录用户的登录信息,或者是运行该进程的用户的登录信息,在某些系统中配置信息是和客户端所运行工作站相关的,在这些系统中不仅需要获取用户的登录信息,而且还要获取本工作站的相关信息,这些信息的内容和复杂成都根据不同的要求有所不同。但有一个基本的信息就是用户的登录信息,只有这样才能达到验证用户权限的目的。
二.搜索登录服务器
在Windows中,对于域用户登录的验证和配置亦可以采用登录脚本和域用户策略来实现,但这样对于一个系统来说,不够完整。本文中介绍的方法是使用自己的登录服务来完成客户端验证后的配置工作。
登录服务是应用系统的组成部分,可以运行在任何基于NT技术的Windows中,同通常运行在域控制器更加适合,原因有两点。
1. 在包含域的网络中,通常域控制器是网络的核心,具有比较健壮的硬件设施和软件环境,通常的网络至少包含一个主域控制器和一个备份域控制器,在Windows2000之后的系统中,活动目录通常也具有多个域控制器(活动目录控制器)。因此运行在域控制器的服务可以得到系统的保证。
2. 客户端应用程序在没有任何额外配置的条件下,容易获得域控制器的列表。尽管在Windows系列的操作系统中,可以获得任何同网段主机的信息,但是访问普通工作站企图获得登录服务,显然是不可取的,只有访问少数运行服务器操作系统的主机来获得登录服务是切实可行的,在众多服务器主机中,域控制器是最佳的选择,因为域控制器更容易获得域的用户信息。
三.验证登录信息并获取相关配置
应用系统和域用户集成的一个目的就是减少客户端的配置,甚至可以做到“0”配置,这并不是一个设想,事实上对于任何系统,第一步需要确认的就是用户的角色,通常一个角色中的成员会对系统有不同的操作权限和能力,自然也包含了对数据库访问的限制,而通常这个角色包含在数据库的用户管理中,然而客户端需要获得这个角色的信息,首先需要能够访问数据库,这就带来了一个矛盾,要么在客户端本机需要配置相应权限的数据库访问信息,要么给客户端分配的数据库访问权限为完全控制。这显然对系统的健壮性提出了考验。
利用Windows域用户验证可以解决这个尴尬的问题,当然在很多数据库产品中,可以选择用户认证和系统认证结合,但这容易导致权利泛滥,本文介绍的方法中,数据库访问不和系统用户认证结合,甚至数据库运行在独立域控制器或者非域控制器上,这样依赖任何域中的用户不可能获得数据库的直接访问权限。
在Windows NT或者之后的版本中,对域用户规定了三种基本角色(用户组):管理员组、普通用户组、访客组,但系统为用户提供可以自定义用户组的能力,Windows使用了2个字节16表示用户组别,也就是最多可以提供给我们将16中独立权限或者独立的角色属性相互组合多达64K的用户组别,而通常的应用系统最多提供4~5中用户角色已经是足够的了。因此我们可以使用域用户的角色来决定该用户在数据库访问中的角色,根据登录域用户的组别来分配给不同权限的数据库访问用户名及密码。
除此之外,Windows的服务器版本中,对于加入域的工作占也具有很强的管理能力,对于工作站的管理和域用户基本类似,也可以将工作站的权限以及不同工作站的配置信息存放在数据库中,这样也可以应用系统和操作系统之间的依赖关系。
相关的系统函数介绍
在本文介绍的方法中使用到的主要API函数如下:
客户端
NetWkstaUserEnum
用户获取当前登录用户或者运行当前进程的用户的登录信息,使用到的登录信息为用户名称和登录的域。用到的数据结果为
_WKSTA_USER_INFO_1结构
gethostname
用户获取本机的工作站名称,向服务器提交工作站信息。
NetServerEnum
用户枚举网络中的计算机,本文中使用该函数枚举了域中的控制器,以域控制器作为登录服务的服务器。
服务端
NetServerEnum
用于枚举网络中的域、域控制器等
gethostname
获取本机名称
NetUserEnum
用于获取域控制器的用户列表,即域用户列表和角色。
NetGroupEnum
用户获取域控制器的用户组列表,即自定义的用户角色。
NetWkstaUserEnum
用于获得登录指定域控制器的用户列表,当用户提交登录信息时,到其提交的登录域去核实用户的登录信息,这并不是一个必要的操作,但是可以避免和阻止企图通过非法手段,切换同域不同物理网络来欺骗登录服务的行为。
结论
实践证明,这种验证方式有效的提高了对客户端的管理能力,提高了系统的一致性和可用性,同时也可以扩展功能利用登录服务来掌握每一个客户端的工作状况。但同时这种方式也带来了一些弊端和缺点,主要有以下几点:
1. 不适合于Windows 95以及98系统,在客户端使用的NetWkstaUserEnum函数是在NT中新增加的,这种强的用户认证功能只有在基于NT技术的系统才能得到保证,本文中依据的实例操作系统全部使用Windows 2000。
2. 和部分域用户相关的软件可能会发生冲突,比如向熊猫卫士、瑞星等基于域用户登录脚本的网络杀毒软件,可能在客户端的用户认证是发生冲突。
3. 必须在包含域的网络中运行,同时要求客户端最好是运行加入域的工作站,尽管可以通过Run As功能使客户端程序以域用户的身份运行,但还是建议工作站加入域。
4. 减少了客户端的登录过程,同时也使客户端开放于操作系统,任何合法用户登录的合法工作占都可以顺利的启动并运行客户端,但这并不是一个很严重的问题,因为安全性始终是以操作员的安全意识为基础的,培养良好的操作习惯和安全意识是解决问题的根本,对部分要求高的操作,可以加入二次认证措施来解决这个问题。
本文中的实例源代码涉及到商业机密,不能提供和摘选,使用到的主要API函数可以参考Windows SDK获取详细的介绍。