Windows 版 (精华区)

发信人: xhc (花自飘零水自流), 信区: Windows
标  题: Windows 2000的安全性应用 
发信站: 哈工大紫丁香 (2000年06月20日13:35:21 星期二), 站内信件

 在全社会都在谈论"Internet"的今天,网络已经成为人们工作、生活中不可缺少的组
成部分。而网络操作系统的安全性,则是整个网络系统安全体系中的基础环节。
---- 作为新一代的企业级网络系统,Windows 2000在安全特性方面的设计十分重视。W
indows 2000不仅提供对基于Internet的新型企业的支持,帮助它们突破原有的企业网络
和Internet的界限,满足移动办公、远程工作,以及随时随地接入Internet进行通信和
电子商务的需要。新的安全协议、加密服务提供者或者第三方的验证技术,可以方便地
结合到Windows 2000的"安全服务提供者接口"(SSPI,Security Service Provider Int
erface)中,供用户选用。Windows 2000系统能够完全无缝地对Windows NT 4.0的网络提
供支持,包括提供对其采用的NTLM(NT LAN Manager)安全验证机制的支持。
本文内容
Windows 2000在安全性方面的特点。
身份验证服务中的几个关键结构和概念。
---- 一、Windows 2000实现的安全特性
---- 由于采用较完整的安全机制,Windows 2000实现了良好的数据安全性、企业间通信
的安全性、企业和Internet网的单点安全登录,以及易用的安全管理。
---- 1.数据安全性
---- Windows 2000所提供的保证数据保密性和完整性的特点,首先表现在用户登录时的
安全性:从用户登录网络开始,对数据的保密性和完整性的保护就已经开始。Windows 
2000借助Kerberos和PKI等验证协议提供了强有力的口令保护;其次是对网络数据的保护
:包括在本地网络上的数据或者穿越网络的数据,在本地网络的数据由验证协议来保证
其安全性;还有是对存储数据的保护:通常采用数字签名来签署软件产品或者加密文件
系统,用以防范破坏性程序的运行。
---- 2.企业间通信的安全性
---- Windows 2000为不同企业之间的通信,提供了多种安全协议和用户模式的内置集成
支持,包括:1) 在目录服务中创建专门为外部企业开设的用户账号:通过Windows 200
0的活动目录,可以设定组织单元、授权或虚拟专用网等方式,并对它们进行管理。2) 
建立域之间的信任关系:用户可以在Kerberos或公用密钥体制得到验证之后,远程访问
已经建立信任关系的域。3) 公用密钥体制:电子证书可以用于提供用户身份确认和授权
,企业可以把通过电子证书验证的外部用户映射为目录服务中的一个用户账号。
---- 3.企业和Internet网的单点安全登录
---- 当用户成功地登录到网络之后,Windows 2000透明地管理一个用户的安全属性(Se
curity Credentials),而不管这种安全属性是通过用户帐号和用户组的权限规定(这是
企业网的通常做法)来体现的,还是通过数字签名和电子证书(这是Internet的通常做法
)来体现的。先进的应用服务器都应该能从用户登录时所使用的安全服务提供者接口(SS
PI)获得用户的安全属性,从而使用户做到单点登录,从而访问所有的服务。这一技术的
应用在本文后面会有具体介绍。
---- 4.易用的管理性
---- 通过在活动目录中使用组策略,管理员可以集中地把所需要的安全保护加强到某个
容器(SDOU)的所有用户/计算机对象上。Windows 2000包括了一些安全性模版,既可以针
对计算机所担当的角色来实施,也可以作为创建定制的安全性模版的基础。
---- Windows 2000提供了两个微软管理界面(MMC)的插件作为安全性配置工具,即安全
性模版和安全性配置/分析。安全性模版MMC提供了针对十多种角色的计算机的管理模版
,这些角色包括从基本工作站、基本服务器一直到高度安全的域控制器。它们的安全性
要求是不同的。通过安全性配置/分析MMC,管理员可以创建针对当前计算机的安全性策
略。当然通过对加载模版的设置,该插件就会智能地运行配置或分析功能,并产生报告
来。
---- 总之,随着企业越来越多的对外联系需要,企业再也不能为了安全性的需要,人为
地将Internet和企业网分离开来。新一代的建立在Internet上的成功企业,必然要借助
Windows 2000的分布式安全机制,实现高度的安全性集成。
---- 二.Windows 2000的验证服务结构和相关概念
---- 从上图的"多种验证服务体系架构"中我们可以看到,通过安全服务提供者接口(Se
curity Service Provider Interface,SSPI),Windows 2000实现了应用协议和底层安
全验证协议的分离。不管是NTLM、Kerberos、Secure Channel (Schannel,是web访问的
常用验证方法),还是DPA(Distributed Password Authentification,社团/内容网站常
用的验证方法),它们对于应用层来说都是一致的。应用厂商还可以通过微软提供的Pla
tform SDK产品包中的Security API来开发自己的验证机制。
---- 1.安全服务提供者接口
---- 安全服务提供者接口(SSPI,Security Service Provider Interface)是一套用
于访问Windows NT安全功能的程序接口。它基于通用安全服务应用程序接口(GSSAPI)
标准,允许开发者充分利用Windows 2000具有的集成化安全特点,包括单点登录(sing
le sign-on)、身份验证(authentication)和授权(authorization)。
---- 虽然SSPI是一个可编程应用程序接口(API),应用程序可以直接调用,但是大多
数情况下,应用程序并不直接调用它。在应用程序与SSPI之间由许多中间层,便于应用
程序运用。例如:远端程序访问(RPC)、Winlnet、Winsock 2.0等。但是基于接口的应
用程序经常直接调用SSPI程序,例如DCOM应用程序自动使用RPC层提供安全服务。所以,
SSPI还是向应用程序接口函数提供了四组接口,包括凭证管理、上下文管理、数据包管
理和信息支持。它们分别用于读取凭证、管理两个通信端口之间的安全上下文、查询安
全数据包和实现信息的加密功能。
---- 2.Kerberos验证机制
---- Kerberos是在Internet上长期被采用的一种安全验证机制,它基于共享密钥的方式
。该协议定义了一系列客户机/密钥发布中心(Key Distribution Center,KDC)/服务器
之间进行的获得和使用Kerberos票证的通信过程。当已被验证的客户机试图访问一个网
络服务时,Kerberos服务(即KDC)就会向客户端发放一个有效期一般为8个小时的"对话票
证"(Session Ticket)。网络服务不需要访问目录中的验证服务,就可以通过对话票证来
确认客户端的身份,这种对话的建立过程比Windows NT 4.0中的速度要快许多。
---- Kerberos加强了Windows 2000的安全特性和互操作性,使网络应用服务验证速度更
快,允许多层次的客户/服务器代理验证和跨域验证建立可传递的信任关系。在一个多种
操作系统的混合环境中,Kerberos协议提供了通过一个统一的用户数据库为各种计算任
务进行用户验证的能力。即使在非Windows 2000平台上通过KDC验证的用户,比如从Int
ernet进入的用户,也可以通过KDC域之间的信任关系,获得无缝的Windows 2000网络访
问。
---- 总之,为了保证系统信息交流的保密性,Windows 2000广泛采用了各种技术,确保
数据的安全;并且集成大量的接口,对目前流行的大多数网络安全协议提供支持。
---- 三.几种实用的技术应用
---- 由于本文的目的是协助应用程序的编写人员,制作出具有更高安全性的网络方面的
应用程序,所以阅读本文内容的关键是理解各种功能实现的过程和步骤,具体涉及的函
数及其相应参数的选择还需要参考相关的专业技术资料。
---- 1.实现单点登录
---- 单点登录(SSO,Single Sign-on)是一种用于方便用户访问网络的技术。无论多
么复杂的网络结构,用户只需在登录时进行一次注册,以后便可以在网络中自由穿梭,
不必多次输入用户名和口令来确定身份。当网络中包含不同的操作系统时,这一功能甚
至可以包括确保口令的同步。SSO是由Windows 2000通过Kerberos 和安全接口层(SSL,
Secure Sockets Layer)协议提供支持的。
---- 当用户在某个系统中登录成功以后,用户计算机中运行的Kerberos客户机将接受一
个TGT(票证许可票证,Ticket Granting Ticket)。如果客户机需要访问另一个域中的服
务器,TGT将传递到KDC(密钥分配中心)并产生一个访问该服务器的对话票证。客户机
将该对话票证提供给目标服务器,如果对方接受,则两者之间的连接将被确认。
---- 过去版本的Windows NT系统中,验证身份的形式是由服务器来验证向其提出访问要
求的客户机。现在Windows 2000则通过引入Kerberos实现对相互验证的支持,实现在服
务器验证客户机的同时,客户机也反过来验证服务器的身份。这样,服务器与客户机不
仅仅是从属关系,如果服务器的身份不通过,客户机也可以拒绝接收服务器的信息,网
络数据的安全性可以得到进一步的提高。
---- (1)客户机的连接身份验证
---- 客户机的身份验证共分两步:第一步是获取登录凭证(Logon Credentials)。如
果SSO工作正常,客户机只需调用AcquireCredentialsHandle为用户的登录获取凭证句柄
。如果SSO没有正常工作,还需要提供其他的登录凭证,比如包括另一个用户名、口令或
域名的参数,客户机可以在AcquireCredentialsHandle函数中加入SEC_WINNT_AUTH_IDE
NTITY结构,并在其中输入相应信息。
---- 当SEC_WINNT_AUTH_IDENTITY结构用于传输附加的登录凭证时,只有结构中的字符
串为原始设备制造商(OEM)时,其标记项才设为SEC_WINNT_AUTH_IDENTITY_ANSI。如果
字符串为ANSI,他们首先必须利用MultiByteToWideChar函数转换成Unicode,并且将SE
C_WINNT_AUTH_IDENTITY设为SEC_WINNT_AUTH_IDENTITY_UNICODE。
---- 第二步是完成客户机的身份验证。(注意:在此之前必须确保客户机与服务机使用
的是相同的验证机制,确保信息的正确交流。)创建了首次安全标记之后,客户机会向
服务器发送一条信息。由于客户机与服务器之间的信息格式是加密的,必须加以定义确
保两者之间能正确交流。服务器收到信息后,客户机通过InitializeSecurityContext 
的返回状态确定验证操作是否完成。如果返回状态为SEC_I_CONTINUE_NEEDED,则必须不
断发送验证信息直到对话结束。客户机是利用OutputBufferDescriptor 中的内容,构成
信息发送给服务器。
---- 示例: 下例为创建新属性和辅助类的代码
// 在本代码中加入附加的凭证内容。
字符串UserName替换为凭证需要的用户名,
// DomainName和Password替换为与用户名相对应的域名和口令
SEC_WINNT_AUTH_IDENTITY AdditionalCredentials;
CredHand ClientCredentials;
TimeStamp Expiration;
AdditionalCredentials.User = UserName;
AdditionalCredentials.UserLength = strlen(UserName);
AdditionalCredentials.Domain = DomainName;
AdditionalCredentials.DomainLength=strlen(DomainName);
AdditionalCredentials.Password = Password;
AdditionalCredentials.PasswordLength = strlen(Password);
#ifdef UNICODE
AdditionalCredentials.Flags =
SEC_WINNT_AUTH_IDENTITY_UNICODE
#else
AdditionalCredentials.Flags =
SEC_WINNT_AUTH_IDENTITY_ANSI
#endif
SecStatus = AcquireCredentialsHandle(
    NULL,             // 无负责机构名称
    "Negotiate",      // 数据包名称
    SECPKG_CRED_OUTBOUND, // 凭证使用标记
    NULL,             // 无登录标识号
    &AdditionalCredentials // 包含可选凭证的数据结构地址
    NULL,             // 无GetKey函数
    NULL,             // 无GetKey函数参数
    &ClientCredential,// 接受新凭证
    &Expiration);
---- (2)服务器的连接身份验证
---- 服务器的身份验证过程与客户机的身份验证过程基本相同,所不同的是需要创建一
个本地安全上下文(Security Context)。当客户机的连接要求接受以后,服务器调用
AcceptSecurityContext为客户机创建一个本地安全上下文。该上下文为该客户机的后续
要求服务。服务器每次将核查其返回状态并输出缓冲区描述符确保其正确无误,如果出
错服务器将拒绝连接。如果由AcceptSecurityContext返回的缓冲区中包含附加信息,服
务器会将这些信息返回给客户机。对于客户机,如果接受的返回状态为SEC_I_CONTINUE
_NEEDED或SEC_I_COMPLETE_AND_CONTINUE,则说明需要交换其他的信息才能实现身份验
证。
---- 客户机与服务器之间的身份认证结束后,两者间通信的形式则是由MakeSignature
函数产生一个安全签名,经过签名的信息可以提示该信息是否被改动过。信息接收端通
过调用VerifySignature来确定信息是否经过修改。通过EncryptMessage和DecryptMess
age函数可以令服务器与客户机之间的通信实现加密传输,在传输过程中无法解密。
---- 在服务器/客户机对话结束之后,两者必须利用各自的安全上下文句柄调用Delete
SecurityContext函数删除安全上下文。同时客户机在结束与服务器对话后必须调用Fre
eCredentialsHandle,而服务器在关机前必须调用DeleteSecurityContext,但注意要在
卸载安全提供者动态链接库之后。
---- 符合以上的各种要求,即正确调用和填写相关函数信息,就可以实现正确的网络单
点登录功能。
---- 2.利用SSPI验证客户机和服务器
---- 虽然大多数情况下应用程序并不直接调用SSPI应用程序接口(API),但是作为应
用程序的编写人员,我们必须了解其函数的基本功能和运行过程,以便将来在必要时引
用。
---- 下面的内容将介绍如何使用SSPI函数生成凭证和安全上下文;说明身份确认的不同
等级及其应用方法;同时介绍代理(delegation),通过这种方式服务器可以模拟客户机
身份访问另一台服务器。
---- 首先介绍凭证的定义:凭证是由呼叫方提供的一条数据,用于接收方对其身份进行
鉴别。用于访问凭证的应用程序接口包括:AcquireCredentialsHandle、FreeCredenti
alsHandle和QueryCredentialsAttributes。前两个函数用于获取和释放凭证句柄,最后
一个函数则用来查询和确定凭证的特征参数,包括名称、支持算法、加密力度和支持协
议等。
---- 然后是安全上下文的制作:安全上下文是在通信过程中发生作用的一系列安全属性
和规则。它由企业制定,并在客户机与服务器之间共享。客户机与服务器在彼此对话中
,都利用该上下文来判断信息的完整性和保密性。安全上下文共有三种类型:Connecti
on、Datagram、Stream。通常使用的是Connection类型,由呼叫方确定信息的格式,并
提供传输信息中不同数据段的地址。
---- 用于制作安全上下文的应用程序接口函数有很多,主要包括用于客户机和服务器分
别创建安全上下文的InitializeSecurityContext和AcceptSecurityContext函数;用于
删除安全上下文及其对应的本地数据结构的DeleteSecurityContext函数;对应用于上下
文的控制符号进行添加或编辑的ApplyControlToken函数;当需要模仿呼叫方对其他资源
进行访问时,由服务提供者或应用程序服务器调用的ImpersonateSecurityContext函数

---- 此外,RPC(远端程序呼叫)定义了六种身份验证等级,这些等级覆盖了从不需要
任何检查到需要加密每一个数据包的多种安全级别。但是安全提供者(SSP)并不需要支
持所有验证等级。如果申请的等级提供者不支持,提供者可以返回错误信息或将其向上
转换为提供者所支持的最近等级。
示例:
// 本例说明客户机是如何传输
RpcBindingSetAuthInfo中的身份认证等级参数:
// 本代码中假设rpcBinding
是客户机与服务器之间的有效结合句柄,并假设
// pAuthCredentials为有效指针,
指向包含用户身份验证参数的数据结构。
RPC_STATUS RPC_ENTRY rpcStatus;
rpcStatus = RpcBindingSetAuthInfo(
    rpcBinding, // 有效结合句柄
    "ServerName", // 服务负责机构名称
    RPC_C_AUTHN_LEVEL_PKT_INTEGRITY,  // 身份认证等级
    RPC_C_AUTHN_GSS_KERBEROS, // 使用 KERBEROS SSP
    pAuthCredentials, // 身份认证参数
RPC_C_AUTHZ_NAME); // 身份认证服务
// 服务器将接受该身份验证等级
或选择一个最近的等级,如果不支持该等级则向
// 客户机返回错误信息。
---- 代理(Delegation)是指由服务器模仿客户机,向另一台服务器进行呼叫。模仿客
户机的作用是对资源进行访问,代理的作用是以客户机身份完成实际功能。服务器可以
模仿客户机生成新的安全上下文,让其他服务器将其作为客户机接受。NTLM不支持代理
,只支持模仿;而Kerberos则两者同时支持。
---- 使用SSPI实现代理的基本步骤为:
---- 1) 客户机首先调用InitializeSecurityContext指定ISC_REQ_DELEGATION标记。
---- 2) 服务器首先调用QuerySecurityPackageInfo确认它支持模仿客户机。如果其支
持,SecPkgInfo数据结构中返回的安全数据包信息将在fCapabilities位掩码处包含SEC
PKG_FLAG_IMPERSONATION位。
---- 3) 服务器必须拥有有效的安全上下文句柄,通过调用AcceptSecurityContext获得
,并将fContextReq位掩码参数指定ASC_REQ_DELEGATION标记。
---- 4) 服务器将客户机传来的安全符号递交给安全子系统。如果正确,服务器将获得
一个安全上下文句柄。
---- 5) 服务器调用ImpersonateSecurityContext模仿该呼叫客户机,并使用模仿上下
文进行操作。
---- 6) 服务器利用客户机的参数,调用InitializeSecurityContext获取新的身份验证
符号。
---- 7) 将新的符号发送给远端服务器。
---- 8) 如果远端服务器使用SEC_I_CONTINUE_NEEDED或SEC_I_COMPLETE_AND_CONTINUE
回应,它返回的符号必须用于下次调用的InitializeSecurityContext中。
---- 9) 代理服务器将以客户机身份向远端服务器申请服务。
---- 10) 当本地服务器结束同远端服务器的对话后,它必须调用RevertSecurityConte
xt恢复其自身的安全上下文。
---- 利用Dcomcnfg可以轻松实现DCOM代理。具体可参看下图的Distributed COM Confi
guration Properties对话框界面:
---- 3.集中访问控制(Certralized Access Control)的支持
---- 安全组(Security Group)提供对资源的访问控制,并可以通过动态目录进行集中
管理。由于动态目录支持集中管理资源,这大大简化了许可访问特定应用程序的步骤。

---- 下面的内容将介绍采取哪些步骤确保应用程序实时掌握策略的改变;描述动态目录
是如何管理安全组和个人许可的;应用程序如何使用安全组和许可,并如何在运行中探
测其变化。
首先介绍几个相关概念:
---- 安全组(Security Groups):安全组用于控制对资源的访问,还可以用作电子邮
件分类列表。它们列在访问控制列表(ACLs)中,该列表定义了资源和对象的许可权。
如果不需要保护对象的安全,可以使用分类组(distribution group)替换安全组,因
为使用安全组将令用户和服务安全符号变得更大,增加工作量,占用更多的时间。
---- 安全标识符(SID):安全标识符是当用户或组用于安全目的时,对该用户或安全
组对象进行的标识符。SID保存在用户对象和安全组对象的objectSid中。当创建用户或
组时,动态目录将自动产生objectSid。系统能够确保SID是唯一的,通过它识别用户和
组。当用户登录到Windows 2000域中,他们的访问符号将自动产生。该符号用于判断该
用户可以访问哪些资源。每个访问符号包括用户的SID和该用户所属安全组的SID。
---- 访问控制条目(ACE):访问控制条目(Access Control Entry)承认或否定用户
和组访问资源的权利。如果安全组获得了访问资源的权利,该安全组的SID将添加到ACE
中,定义其许可权。每个资源都包含自由选择访问控制列表(Discretionary Access C
ontrol List,DACL),指定哪些用户或组允许对该资源进行哪些操作。DACL通常包含许
多ACE,定义个人和组的权限;如果为空,说明没有人可以对其进行访问;如果不存在,
则说明每个用户都具有对该资源进行操作的全部许可。在动态目录中,每个对象都具有
一个nTSecurityDescriptor属性,保存DACL。
---- 动态目录中的组:组分为Universal、Global和Domain Local三种,具有不同的范
围。Universal可以包括任意域中的用户和组,并用于对任意域的访问控制;Global只包
括单个域中的用户和组,并用于对任意域的访问控制;Domain Local可以包括任意域中
的用户和组,但只能用于对单个域的访问控制。
---- 分配许可权:分配和取消许可权的最常用、最简单的方法是使用访问控制列表(A
CL)编辑器。通过对访问权利位(Access Rights Bit)的设置,也可以对许可权进行定
义。但由于这方面的内容十分庞杂,本文不再赘述。
---- 三.下面具体介绍如何建立支持集中访问的应用程序。
---- 支持集中访问的应用程序可以利用动态目录存储信息,所存的内容通常为与分布式
应用的不同组件相关的设置信息。这些信息可以通过组策略对象(GPOs,Group Policy
 Objects)进行管理。如果一个应用程序具有通过策略管理的注册设置,它必须直接返
回给GPOs并进行确认。应用程序可以调用GetGPOList函数实现GPOs对当前用户或计算机
的应用。注意每次运行此类应用程序时必须调用该函数,以确保它在当前的设置下运行
。由于服务器需要长时间运行,每次组策略的改变必须通知它,以便它能按照远端管理
员的操作进行改变。应用程序通常可以采用三种方式获取组策略改变的通知:
---- 第一种方式为应用程序可以创建独特的注册项HKLM\Software\Microsoft\Windows
 NT\CurrentVersions\Winlogon\GPExtensions,该注册项包括函数名及其所在的动态链
接库(DLL)的名称。当组策略发生改变,通知将发送给ProcessGroupPolicyProc回叫函
数。
---- 第二种方式为当组策略设置发生改变时,一个窗口信息(WM_SETTINGSCHANGE)将
自动发送给所有应用程序。如果应用程序检测到其所使用的设置发生了改变,它将重新
读取其最新设置。
---- 第三种方式是针对没有窗口的应用程序,这类应用程序可以调用RegisterGPNotif
ication函数,同时传递一个事件对象。当组策略发生改变,该应用程序可以通过该事件
得到消息。
---- 四.总结
---- 随着信息时代的发展,企业信息通过网络在世界各地传播,在进一步提高信息交换
速度的同时,如何确保信息交流的准确和安全更加成为人们关心的焦点。Windows2000作
为新一代的企业级网络系统,在安全特性方面的设计更加重视,不仅提供对Internet的
支持,满足移动办公、远程工作,以及随时随地接入Internet进行通信和电子商务的需
要;更是提供了一个安全性框架,结合Windows 2000的"安全服务提供者接口"(SSPI)
,实现对服务器和客户机身份的验证机制。
---- 只有充分了解各种不同安全技术的原理及其操作步骤,我们才能在实际应用程序中
合理地运用Windows 2000为用户提供的各种安全特性。本文通过对大量相关概念描述,
以及对安全技术实现步骤的介绍,为大家重点介绍了四种实际应用,包括:如何实现单
点登录(SSO,Single Sign-on)功能;利用安全服务提供者接口(SSPI)验证客户机和
服务器;实现对集中访问控制(Certralized Access Control)的支持。
---- 希望借助我们的介绍,可以为编程人员制作符合实际应用要求的程序提供一点帮助
,并通过大家的实际应用,将Windows 2000提供的安全特性充分发挥。




--
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: dip8.hit.edu.cn]
※ 修改:·xhc 於 06月20日13:38:26 修改本文·[FROM: dip8.hit.edu.cn]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:205.213毫秒