Windows Security之自主访问控制

时间:2022-05-07 05:51:57

自主的访问控制

这使得资源的所有者能够决定谁可以访问该资源,以及他们可以对它做些什么。资源的所有者为单个用户或者一组用户授予各种访问权限。

访问控制,简单的说就是授权,一项操作能否被授权决定了这项操作是否能在安全的前提下成功的进行下去。这里根据操作中是否跟一个特定的对象打交道将其分为两大类:

  1. 保护对象
  2. 账户权限和特权

保护对象


安全引用监视器(SRM) :这是Windows执行体(\Windows\System32\Ntoskrnl.exe)中的一个组件,他负责:

  1. 定义访问令牌数据结构(来表示一个安全环境)
  2. 执行对象的安全访问检查
  3. 管理特权(用户权限)
  4. 生成所有结果的安全审计消息

Windows安全模型要求一个线程打开一个对象的时候,必须制定它期望在该对象上执行哪些类型的动作(R、W、RW、…)系统根据一个线程期望的访问要求来执行 访问检查 。其中的核心模块当然是交由SRM处理的。

SRM安全模型的本质是一个包含三项输入的等式:

  1. 一个线程的安全身份(令牌)
  2. 该线程想要获得的对一个对象的访问权
  3. 该对象的安全设置(安全描述符)

输出为“是”或“否”,以此来表明此安全模型是否授予了该线程所期望的访问权。如果已授权,那么对象管理器将返回一个该对象的句柄以供线程使用。

下面详细讲解这个对象安全等式的各个部分:

令牌(Tokens)


用来表示一个线程的安全身份的就是 令牌。

SRM使用一个称为令牌(或访问令牌)的对象来标识一个进程或线程的安全环境

Windows Security之自主访问控制

Windows的安全机制用到了令牌中的两部分来决定哪些对象对象可以被访问,以及哪些安全操作可以被执行:

  1. 用户SID(User account SID)和组SID(Group SID)域
  2. 特权(Privilege)集

    安全标识符(SID,security identifier) :Windows并非使用名称类标识系统中执行各种个动作的实体,相反,Windows使用SID。用户有SID,本地用户组、域中的用户组、本地计算机、域和域成员 也有SID。SID是一个可变长度的数值,包含三部分:一个SID结构版本号、一个48位标识符机构值,以及可变数量的32位子机构值或者相对标识符(RID, relative identifier)值。例如一些知名的SID:

Windows Security之自主访问控制

特权后面会细说。

模仿(impersonation)是一项强大的、广为使用的安全特性。

安全描述符


令牌标识了一个用户的凭证,它只是对象安全等式的一部分,另一部分是与一个对象关联在一起的安全信息,这信息规定了谁可以在这个对象上执行哪些操作。这些信息所在的数据结构被称为安全描述符(security descriptor)。它包括以下属性:

  1. 版本号:创建此描述符的SRM安全模型的版本
  2. 标志: 一些可选的修饰符,定义了该描述符的行为或特征
  3. 所有者ID
  4. 组ID
  5. 自主访问控制列表(Discretionary Access Control List):规定了谁可以用什么方式访问该对象
  6. 系统访问控制列表(System Access Control List):规定了哪些用户的哪些操作应该被记录到安全审计日志中

访问控制列表(ACL, access-control lis)中包含一个头和零个或多个访问项(ACE, access-control entry)。每个ACE包含一个SID和一个访问掩码,DACL中的ACE分为允许、拒绝、允许的-对象、拒绝的-对象四种类型。

单独的ACE所授予(拒绝)的权限累积起来,就构成了一个ACL所授予的访问权限集合。在DACL中,若允许ACE与拒绝ACE冲突,则访问验证依赖于DACL中两个ACE的相对顺序——以在前面的为准。有两个特殊情况:

  1. 没有DACL:即null DCAL,所有人对该对象都有完整的访问权限
  2. DCAL为空:即0个ACE,则没有人对该对象有访问权限

一个访问验证的例子如下:

Windows Security之自主访问控制

账户权限和特权


进程在运行中执行的许多操作时无法通过对象访问保护来授权控制的,因为这些操作并没有与一个特定的对象打交道。所有的账户权限和特权都可以在“本地安全策略”中找到完整的列表。

账户权限并不是由SRM强制实施的,也不存储在令牌中,而是由本笃安全权威中心(LSA)强制实施的,它从LSA数据库重获取已赋予该用户的账户权限。

与账户权限不同,特权存放在令牌中,不同的特权是由不同的组件来定义,并且也由这些组件来强制使用。