预计阅读本页时间:-
11.9 Windows Vista中的安全
看过加密后,该从总体上探讨安全问题了。NT的最初设计符合美国国防部C2级安全需求(DoD 5200.28-STD),该橘皮书是安全的DoD系统必需满足的标准。此标准要求操作系统必需具备某些特性才能认定对特定类型的军事工作是足够安全的。虽然Windows Vista并不是专为满足C2兼容性而设计的,但它从最初的NT安全设计中继承了很多安全特性,包括下面的几个:
1)具有反欺骗措施的安全登录。
2)自主访问控制。
广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元
3)特权化访问控制。
4)对每个进程的地址空间保护。
5)新页被映射前必需清空。
6)安全审计。
让我们来简要地回顾一下这些条目。
安全登录意味着系统管理员可以要求所有用户必需拥有密码才可以登录。欺骗是指一个恶意用户编写了一个在屏幕上显示登录提示的程序然后走开以期望一个无辜的用户会坐下来并输入用户名和密码。用户名和密码被写到磁盘中并且用户被告知登陆失败。Windows Vista通过指示用户按下CTRL-ALT-DEL登录来避免这样的攻击。键盘驱动总是可以捕获这个键序列,并随后调用一个系统程序来显示真正的登录屏幕。这个过程可以起作用是因为用户进程无法禁止键盘驱动对CTRL-ALT-DEL的处理。但是NT可以并且确实在某些情况下禁用了CTRL-ALT-DEL安全警告序列。这种想法来自于Windows XP和Windows 2000,用来使NT系统对从Windows 98切换过来的用户保持更多的兼容性。
自主访问控制允许文件或者其他对象的所有者指定谁能以何种方式使用它。特权化访问控制允许系统管理员(超级用户)随需覆盖上述权限设定。地址空间保护仅仅意味着每个进程自己的受保护的虚拟地址空间不能被其他未授权的进程访问。下一个条目意味着当进程的堆增长时被映射进来的页面被初始化为零,这样它就找不到页面以前的所有者所存放的旧信息(参见在图11-36中为此目的而提供的清零页的列表)。最后,安全审计使得管理员可以获取某些安全相关事件的日志。
橘皮书没有指定当笔记本电脑被盗时将发生什么事情,然而在一个大型组织中每星期发生一起盗窃是很常见的。于是,Windows Vista提供了一些工具,当笔记本被盗或者丢失时,谨慎的用户可以利用它们最小化损失。当然,谨慎的用户正是那些不会丢失笔记本的人——这种麻烦是其他人引起的。
下一章将描述在Windows Vista中基本的安全概念,以及关于安全的系统调用。最后,我们将看看安全是怎样实现的。
11.9.1 基本概念
每个Windows Vista用户(和组)用一个SID(Security ID,安全ID)来标识。SID是二进制数字,由一个短的头部后面接一个长的随机部分构成。每个SID都是世界范围内唯一的。当用户启动进程时,进程和它的线程带有该用户的SID运行。安全系统中的大部分地方被设计为确保只有带有授权SID的线程才可以访问对象。
每个进程拥有一个指定了SID和其他属性的访问令牌。该令牌通常由winlogon创建,就像后面说的那样。图11-47展示了令牌的格式。进程可以调用GetTokenInformation来获取令牌信息。令牌的头部包含了一些管理性的信息。过期时间字段表示令牌何时不再有效,但当前并没有使用该字段。组字段指定了进程所隶属的组。POSIX子系统需要该字段。默认的DACL(Discretionary Access Control List,自主访问控制列表)会赋给被进程创建的对象,如果没有指定其他ACL的话。用户的SID表示进程的拥有者。受限SID使得不可信的进程以较少的权限参与到可信进程的工作中,以免造成破坏。

最后,权限字段,如果有的话,赋予进程除普通用户外特殊的权利,比如关机和访问本来无权访问的文件的权利。实际上,权限域将超级用户的权限分成几种可独立赋予进程的权限。这样,用户可被赋予一些超级用户的权限,但不是全部的权限。总之,访问令牌表示了谁拥有这个进程和与其关联的权限及默认值。
当用户登录时,winlogon赋予初始的进程一个访问令牌。后续的进程一般会将这个令牌继承下去。初始时,进程的访问令牌会被赋予其所有的线程。然而,线程在运行过程中可以获得一个不同的令牌,在这种情况下,线程的访问令牌覆盖了进程的访问令牌。特别地,一个客户端线程可以将访问权限传递给服务器线程,从而使得服务器可以访问客户端的受保护的文件和其他对象。这种机制叫做身份模拟(impersonation)。它是由传输层(比如ALPC、命名管道和TCP/IP)实现的、被RPC用来实现从客户端到服务器的通信。传输层使用内核中安全引用监控器组件的内部接口提取出当前线程访问令牌的安全上下文,并把它传送到服务器端来构建用于服务器模拟客户身份的令牌。
另一个基本的概念是安全描述符(security descriptor)。每个对象都关联着一个安全描述符,该描述符描述了谁可以对对象执行何种操作。安全描述符在对象被创建的时候指定。NTFS文件系统和注册表维护着安全描述符的持久化形式,用以为文件和键对象(对象管理器中表示已打开的文件和键的实例)创建安全描述符。
安全描述由一个头部和其后带有一个或多个访问控制入口(Access Control Entry,ACE)的DACL组成。ACE主要有两类:允许项和拒绝项。允许项含有一个SID和一个表示带有此SID的进程可以执行哪些操作的位图。拒绝项与允许项相同,不过其位图表示的是谁不可以执行那些操作。比如,Ida拥有一个文件,其安全描述符指定任何人都可读,Elvis不可访问,Cathy可读可写,并且Ida自己拥有完全的访问权限。图11-48描述了这个简单的例子。Everyone这个SID表示所有的用户,但该表项会被任何显式的ACE覆盖。

除DACL外,安全描述符还包含一个系统访问控制列表(System Access Control List,SACL)。SACL跟DACL很相似,不过它表示的并不是谁可以使用对象,而是哪些对象访问操作会被记录在系统范围内的安全事件日志中。在图11-48中,Marilyn对文件执行的任何操作都将会被记录。SACL还包含完整度级别字段,我们将稍后讨论它。