WINNT/2000 Security programming brief(1)

作者:陆麟
转载请征得作者同意.
2001.9.7



NT/2000的安全体系概念乃是到目前为止所有的操作系统中最为完善的. 本文根据我所接触过的操作系统而发.由于本人对于NETWARE和UNIX接触时间不长, 评论可能不很准确, 请读者自行把握.
为什么这么说呢?
在DOS下,没有安全的概念,任何人只要打开电源,DOS就会启动,然后弹出一个SHELL窗口,任何用户都可以使用机器上的资源.
在WIN9X下,开始有了登录. 但是该登录本身并不是为了本机资源的保护.因为9X本身是DOS/WIN16的延伸. 致力于一个高速个人平台. 这样登录只不过是WOSA体系的一个组成部分.WOSA这个名词流传得十分有限.它的概念在此稍微提一下:
Windows Open Services Architecture (WOSA)
Software architecture that provides a single system-level interface for connecting front-end applications with back-end services. Windows Telephony is part of WOSA.
这是MS对于WOSA的定义. 在系统级提供接口用于联接前端应用程序和后台服务的软件体系. WINDOWS是WOSA的一个组成部分.我们可以看出, WINDOWS的登录并不是为了安全而提供的.
UNIX类操作系统通常是经典的多用户操作系统,UNIX的安全体系将用户划归3大类. 对象拥有者, 对象拥有者同组者, 普通用户. 并且将对象的访问权限划分为读,写和执行. 对象拥有者可以根据用户类别分配权限.
NOVELL的NETWARE对于对象的访问权限进行了细分. 衍生了R(读)W(写)O(打开)C(创建)D(删除)P(创建/删除子目录,允许指定托管者)S(查找目录)M(修改文件属性)权限.并且可以将对象的访问权划分到任意的单个用户上. 这一点有极大与其他OS相比有极大的改进.
到了NT, 这是我们将要详细讲述的操作系统. NT根据不同的对象,映射不同的访问权限.
例如一个文件系统的目录对象, 可以指定如下权限.
FILE_LIST_DIRECTORY :列出目录内容
FILE_ADD_FILE :增加文件到目录中
FILE_ADD_SUBDIRECTORY :创建子目录
FILE_READ_EA :读扩展属性
FILE_WRITE_EA :写扩展属性
FILE_TRAVERSE :历遍达到文件的目录层次. 如C:\ABC\DEF\GH.TXT FILE_TRAVERSE则确保C:\和ABD以及DEF3个目录都被正确解析过一次.这点对于NT的FSD(文件系统驱动程序)写作很重要.
FILE_DELETE_CHILD :删除子目录
FILE_READ_ATTRIBUTES :读目录属性
FILE_WRITE_ATTRIBUTES :写目录属性
SYNCHRONIZE :同步操作
DELETE :删除
READ_CONTROL :允许查询对象的安全设置,如果此位没设定,GetSecurityInfo等函数会返回出错.
WRITE_DAC :改变对象的安全设置
WRITE_OWNER :改变对象的拥有者.

对于一个文件系统的文件对象,可以指定如下权限.
FILE_READ_DATA :读取数据
FILE_WRITE_DATA :写数据
FILE_APPEND_DATA :追加数据
FILE_READ_EA :读扩展属性
FILE_WRITE_EA :写扩展属性
FILE_EXECUTE :执行文件(用于创建SECTION对象)
FILE_READ_ATTRIBUTES :读文件属性
FILE_WRITE_ATTRIBUTES :写文件目录属性
SYNCHRONIZE :同步操作
DELETE :删除
READ_CONTROL :允许查询对象的安全设置,如果此位没设定,GetSecurityInfo等函数会返回出错.
WRITE_DAC :改变对象的安全设置
WRITE_OWNER :改变对象的拥有者.

这么多的文件访问选项, 并不需要我们记住,而且SDK中也没有这些访问权的定义. 因为NT的IOS(IO管理器)会自动为我们映射我们需要的权限. 我们在编程时只要记住GENERIC_READ,GENERIC_WRITE,GENERIC_EXECUTE.GENERIC_ALL,我们着重看一下GENERIC_类的定义, 因为这是我们最为常用的映射:

#define FILE_GENERIC_READ         (STANDARD_RIGHTS_READ     |\
                                   FILE_READ_DATA           |\
                                   FILE_READ_ATTRIBUTES     |\
                                   FILE_READ_EA             |\
                                   SYNCHRONIZE)
#define FILE_GENERIC_WRITE        (STANDARD_RIGHTS_WRITE    |\
                                   FILE_WRITE_DATA          |\
                                   FILE_WRITE_ATTRIBUTES    |\
                                   FILE_WRITE_EA            |\
                                   FILE_APPEND_DATA         |\
                                   SYNCHRONIZE)
#define FILE_GENERIC_EXECUTE      (STANDARD_RIGHTS_EXECUTE  |\
                                   FILE_READ_ATTRIBUTES     |\
                                   FILE_EXECUTE             |\
                                   SYNCHRONIZE)
文件系统对象的访问权扩展只是NT安全体系中的细小枝节. NT安全体系提供的是对各种对象的保护,包括用户/组的帐号,内核对象和EXECUTIVE对象.内核对象和EXECUTIVE对象包括如下内容:
DESKTOP,DEVICE,EVENT,EVENT PAIR,FILE,IO COMPLETION PORT, KEY, MUTEXT, OBJECT DIRECTORY,PORT, PRINTER, PRINT JOB, PROCESS, PROFILE, SAM ALIAS, SECTION, SEMAPHORE, SYMBOLIC LINK, THREAD,THREAD, TIMER, TOKEN, WORKSTAION.
这些东西可能对于很多朋友都很陌生, 我会在下一次进行解释.
好了, 今天这篇是WINNT/2000 Security programming brief的开场白, 讲的具体的东西过多了. 更详细的东西请看以后的文章哦.