10.3.1 存取控制.htm
来自「Windows2000后台服务程序开发手册」· HTM 代码 · 共 483 行 · 第 1/5 页
HTM
483 行
<HR style="LINE-HEIGHT: 25px">
<P><FONT style="LINE-HEIGHT: 25px" face=Arial color=#3e77d7 size=3
Black><B style="LINE-HEIGHT: 25px">说明</B></FONT> </P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>这里有个秘诀。AllowAccessToWinSta及AllowAccessToDesktop函数使用了标头文件Malloc.h中的C执行时期(Run-Time)程序库定义的_alloca函数,_alloca函数会在线程的堆叠上分配一块内存。此函数的优点是非常快速,不需内部的线程同步化及传回不必由应用程序释放的内存。当您跳出被呼叫的函数时,系统就会释放内存。
对于必须重复小型配置的安全性程序设计师而言,这样的函数会是个救命的工具,它将会加快程序代码的速度并帮助您避免内存缺乏的情形。</FONT></P>
<HR style="LINE-HEIGHT: 25px">
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>在此强烈地建议您找出时间察看AllowAccessToWinSta及AllowAccessToDesktop函数的内容,直到您了解它们的运作方式并有自信使用它们所采用的技巧为止。这些范例函数所执行的任务大约和您在存取控制程序设计中看到的一样复杂,假如您对它们感到自在,则实作符合您所需的存取控制大概就不会有困难。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#3e72d7
size=4><B style="LINE-HEIGHT: 25px">实作存取控制的选择<BR
style="LINE-HEIGHT: 25px"> </B></FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>Microsoft及其他厂商试图经由建立更高阶的函数来封装我们曾讨论过的低阶函数,以减轻存取控制程序设计师的重担。协力厂商也已经产生了减轻存取控制工作的解决方案。认识Windows之低阶存取控制的功能以及这些高阶函数的某些陷阱,应该能够让您做出满足程序代码需求的决定。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>更高阶套件(Package)的实作器已经面临到这些挑战:</FONT></P><FONT
style="LINE-HEIGHT: 25px" face=arial color=#000000 size=2>
<UL style="LINE-HEIGHT: 25px">
<LI
style="LINE-HEIGHT: 25px">简化非常有弹性的存取控制系统,不用限制弹性或在专案中可能需要的特色。<BR
style="LINE-HEIGHT: 25px">
<LI style="LINE-HEIGHT: 25px">建立健全且合用的程序代码。<BR
style="LINE-HEIGHT: 25px"> </LI></UL></FONT>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>第一个挑战-即维持弹性-是最难克服的。大多数的存取控制需求,可以使用Windows存取控制直接实作。然而,随着弹性而产生的复杂性,以及移除复杂性时就会移除了某些开发人员所期待的特色。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>看起来第二个挑战似乎比较可能达成,但是这个实例还未被证明。Microsoft实作了一组「高阶」安全性的函数,并且已加入Win32
API中。这些函数彻底地简化了某些安全性程序设计的观点,以及某些具有历史性的错误及固有的缺点。以下举出一个范例:</FONT></P>
<DIV style="LINE-HEIGHT: 25px; BACKGROUND-COLOR: #d7d7d7"><FONT
style="LINE-HEIGHT: 25px" face=Arial size=3><PRE style="LINE-HEIGHT: 25px">DWORD GetEffectiveRightsFromAcl( <BR> PACL pACL, <BR> PTRUSTEE pTrustee, <BR> PACCESS_MASK pAccessRights);</PRE></FONT></DIV>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>GetEffectiveRightsFromAcl函数为了搜寻ACL及传回DACL指出允许之存取权利到信任成员的存取遮罩而准备。听起来非常方便!这样的函数可以潜在中将我们的需求移到加入ACEs之前,先在DACL中搜寻ACEs。然而,GetEffective
RightsFromAcl试图做太多的事,如些一来,会产生做出来的成果几乎不能使用的情形。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>GetEffectiveRightsFromAcl函数指出允许存取权是以一致的允许存取ACEs之组合为基础,然后再减去一致的拒绝存取ACEs的组合。这意味着GetEffective
RightsFromAcl可以传回一组存取权利,它会指出ACL没有授予想要的存取权给信任成员部份,在我离开时仍旧不知道如何处理这个问题。没有授予存取权是因为缺少允许存取ACEs,或是因为存在拒绝存取ACEs呢?我厌恶增加允许存取ACE的方法,只想找出无效拒绝存取ACE使我仍然没有存取权的原因。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>GetEffectiveRightsFromAcl不只会搜寻符合您提供的信任成员ACEs,也搜寻信任成员所属之群组帐户的任何ACEs。但是这个函数并没有包括内建的群组,例如Everyone及受认证的使用者。假如它需要寻找群组的ACEs,而信任您程序代码的群组成员并没有列举权利时,此动作会失败。最后,没有方法可以限制搜寻程序只找出明确指派给信任成员的存取权。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>GetEffectiveRightsFromAcl是为了使您的程序代码能够查出信任成员对象上的存取检查是否成功或失败而准备。然而,存取检查需要一个权杖而非信任成员SID。权杖包含权限;权杖也可以被调整或限制(请参阅 <A
style="LINE-HEIGHT: 25px"
href="http://e-msbooks.com/relaunch/XML/paser.asp?src=957-2085-84-0_211.xml#"
target=_new>第十一章</A> )。在检查存取时,GetEffectiveRightsFromAcl不会把权限带到帐户里。存取检查能够执行成功是以对象所有权为基础,但是GetEffectiveRightsFromAcl并不了解对象所有权。这些方法使得GetEffectiveRightsFromAcl的使用有限。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>更有帮助的函数SetEntriesInAcl及GetExplicitEntriesFromAcl是为了帮助您在卸下为ACEs及ACLs分配的内存责任的同时,也可以直接处理ACL而准备。这些函数的目的很重要,但是这个函数具有历史性的错误及效能上的争议。某些问题已经被清除了,不过如果您选择在专案中使用这些函数,彻底测试其程序代码是很重要的。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>应该与SetEntriesInAcl一起使用的BuildExplicitAccessWithName函数不会传回任何值,它会潜在地把错误方案(当使用低阶函数呼叫LookupAccountName时,可以撷取)委托给SetEntriesInAcl函数。由于SetEntriesInAcl没有回报失败项目的方法,因此您会因为无法从失败案例中恢复而离开。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>您可以有其他的选择。Active Template
Library(ATL)的开发人员设计了一个称为CSecurityDescriptor的C++
类别,定义在标头档AtlCom.h中。CSecurityDescriptor之额外的好处是提供全部的类别原始码。尽管此类别提供了大量的功能,但本身也有陷阱。例如,此函数会以一向不遵守Windows
2000提出的ACE顺序的方式增加ACEs,虽然它们遵守Windows NT
4.0的方针。此外,从核心对象撷取安全性的AttachObject函数则用GetKernelObjectSecurity代替GetSecurityInfo,它是与Windows
2000一起使用所建议的函数。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>如前所述,CSecurityDescriptor类别最好的东西即是拥有原始码。假如它朝您需要的方向去运作,那会很好!如果没有的话,您便可以选择修改类别。而且若您找到任何错误,可以选择使用您拥有与Windows之低阶存取控制相关的知识来修改它们。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#3e72d7
size=4><B style="LINE-HEIGHT: 25px">安全的私有对象<BR
style="LINE-HEIGHT: 25px"> </B></FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>我已经提过好几次,您可以经由使用Windows存取控制来保护软件建立的私有对象。这个特色真的很强大,尤其是它可能对服务开发人员有用。到目前为止您已经学习的DACL建立技巧,适用于保护私人对象和系统对象,所以在您自己的对象上实作存取控制所需学习的部份并不多。</FONT></P>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>这个工作牵涉到需要保护的对象在您的软件及系统间共用的情形。您的软件必须执行以下的工作,以实作对象的私有安全性:</FONT></P><FONT
style="LINE-HEIGHT: 25px" face=arial color=#000000 size=2>
<UL style="LINE-HEIGHT: 25px">
<LI style="LINE-HEIGHT: 25px">您的软件必须为您的对象定义特定的权利(使用存取遮罩的低16位元)。<BR
style="LINE-HEIGHT: 25px">
<LI style="LINE-HEIGHT: 25px">您的软件必须决定哪个标准权利与您的对象有关。<BR
style="LINE-HEIGHT: 25px">
<LI style="LINE-HEIGHT: 25px">您的软件必须决定通用权利对应到哪个标准及特定权利。<BR
style="LINE-HEIGHT: 25px">
<LI style="LINE-HEIGHT: 25px">您的软件必须把安全描述项(系统建立的)与对象联系在一起。<BR
style="LINE-HEIGHT: 25px">
<LI style="LINE-HEIGHT: 25px">您的软件必须将适合您对象的安全描述项与对象储存到永续性储存体中。<BR
style="LINE-HEIGHT: 25px">
<LI style="LINE-HEIGHT: 25px">您的软件在安全对象上执行安全性活动前,必须先执行存取检查。<BR
style="LINE-HEIGHT: 25px"> </LI></UL></FONT>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>系统提供了以下的特色:</FONT></P><FONT style="LINE-HEIGHT: 25px"
face=arial color=#000000 size=2>
<UL style="LINE-HEIGHT: 25px">
<LI style="LINE-HEIGHT: 25px">为您的对象建立及删除安全描述项的函数。<BR
style="LINE-HEIGHT: 25px">
<LI style="LINE-HEIGHT: 25px">取得及设定这些安全描述项之特殊部分函数。<BR
style="LINE-HEIGHT: 25px">
<LI
style="LINE-HEIGHT: 25px">在某方面来说,一个执行存取检查的函数会与Windows之其他安全对象一致。<BR
style="LINE-HEIGHT: 25px"> </LI></UL></FONT>
<P><FONT style="LINE-HEIGHT: 25px" face=arial color=#000000
size=2>在我们开始讨论特定函数前,必须阐明以下两点:</FONT></P><FONT
style="LINE-HEIGHT: 25px" face=arial color=#000000 size=2>
<UL style="LINE-HEIGHT: 25px">
<LI
style="LINE-HEIGHT: 25px">私人对象安全性应该能被不同安全性环境中执行服务之客户端服务软件使用。<BR
style="LINE-HEIGHT: 25px">
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?