主页 | 文件 | 属性 | 概念 | 词汇

# 属性 - $SECURITY_DESCRIPTOR (0x50)

前一页 后一页

## 概述

    标准属性标题？

安全描述符可总结如下：

- 一个标题（也许是标记）后面跟着一两个ACL和两个SID。
- 第一个ACL包含审计信息并且可能没有。
- 第二个ACL包含许可（谁可以做）。
- 每个ACL包含至少一个ACE。
- 每个ACE包含一个SID。
- 最后两个SID指出对象的所有者（用户和群组）。

成份 | 描述
--- | ---
Header | 到不同结构的偏移量
Audit ACL | ACE | SID | 审计 ACL的ACEs
Permissions ACL | ACE | SID | 许可 ACL的 ACEs
ACE | SID
ACE | SID
SID (User) | 对象的所有者
SID (Group)

安全描述符对于阻止未经授权访问文件的情况是必要手段。它存储以下信息：

- 文件所有者
- 所有者对其它用户的许可
- 需要记录的动作（审计）

## 属性结构

## 注意

### 大小

就像在 $AttrDef中定义的，此属性没有上下限。

### 其它信息

## 流的结构

## 问题

- 目录的ACE如何传递？
- 如何把ACE装入一个正常的UNIX文件系统？
- 如何把文件许可加入PAM或SMB?
- 能用NT鉴定吗？为什么？

## 需要做的

- 判断哪种规格，特性和权利涉及哪种文件系统活动，例如，FILE_APPEND_DATA允许用户扩展一个 文件而不是创建一个文件。
- 看是否填充零并且标记域做了标记。
- 试试一般的读/写/执行/全部标记。

### 标题

偏移量 | 大小 | 描述
--- | --- | ---
0x00 | 1 | 标题 1
0x01 | 1 | 标题 2
0x02 | 1 | 标题 3
0x03 | 1 | 标题 4
0x04 | 4 | 到用户 SID的偏移量
0x08 | 4 | 到群组 SID的偏移量
0x0C | 4 | ACL 审计
0x10 | 4 | ACL 许可

标题域可能是某些标记，没有任何说明。
标题1好像总是0x01
标题2好像总是0x00
标题3是0x04 或 0x14，如果是0x04 那么无审计信息；如果是0x14则有审计信息。
标题4好像总是0x80
这里有4个偏移量域。如果标题域里有4比特（位），那么所有4个偏移量都在用。
如果有3比特（位）则3个偏移量在用。 巧合？

## ACL

偏移量 | 大小 | 描述
--- | --- | ---
0x00 | 1 | ACL 修订
0x01 | 1 | 填料 (0x00)
0x02 | 2 | ACL 大小
0x04 | 2 | ACE 计数
0x06 | 2 | 填料 (0x0000)

访问控制列表（ACL）包含一个或更多的ACE。
ACL修订在我的机子上是0x02。
WIN32 API建议0x01 和 0x06包含为形成队列的0x00填料。

### ACE

偏移量 | 大小 | 描述
--- | --- | ---
0x00 | 1 | 类型
0x01 | 1 | 标记
0x02 | 2 | 大小
0x04 | 4 | 访问屏蔽
0x08 | V | SID

### 标记

现在执行的类型（在NT里）：

值 | 描述
--- | ---
0x00 | 访问许可
0x01 | 访问拒绝
0x02 | 系统审计

标记是一个比特域。标记可能的值取决于类型值。当应用到一个目录时，访问许可和 访问拒绝可以标记为

值 | 描述
--- | ---
0x01 | 对象延续的 ACE
0x02 | 容器延续的 ACE
0x04 | 不传播 '延续的 ACE'
0x08 | 只延续 ACE

如果类型是系统审计，那么标记可为

值 | 描述
--- | ---
0x40 | 成功审计
0x80 | 失败审计

## 访问屏蔽 / 访问权

访问屏蔽 / 权利 是一个比特域，列举了所有 (不)允许的动作。

比特 (范围) | 含义 | 描述 / 例子
--- | --- | ---
0 - 15 | 对象特定的访问权 | 读数据, 执行, 增补数据
16 - 22 | 标准访问权 | 删除, 写 ACL, 写所有者
23 | 可以访问安全 ACL |
24 - 27 | 保留的 |
28 | 一般的所有 (读, 写, 执行) | 所有下面的
29 | 一般执行 | 所有需要执行一个程序的事
30 | 一般写 | 所有需要写入一个文件的事
31 | 一般读 | 所有需要读取文件的事

## SID (安全标识符)

一个典型的SID看起来象：S-1-5-21-646518322-1873620750-619646970-1110

它由'S-p-q-r-s-t-u-v'组成。

S | 安全
p | 修订号 (当前是1)
q | NT 著作权. 这个数值分为6个字节 (48 比特 数字)。
r - v | NT 子著作权 (在这里可以有多个)

磁盘上的SID存为：
S-1-5-21-646518322-1873620750-619646970-1110
十六进制形式为：
S-1-5-15-26891632-6fad2f0e-24ef0ffa-456 (5 个子著作权)

0x00 | 01 | 05 | 00 | 00 | 00 | 00 | 00 | 05
0x08 | 15 | 00 | 00 | 00 | 32 | 16 | 89 | 26
0x10 | 0e | 2f | ad | 6f | fa | 0f | ef | 24
0x18 | 56 | 04 | 00 | 00 |  |  |  |

这是一个可变长度的结构。可以更多或更少，子著作权使结构更大或更小。

### 安全描述符控制标记

标记 | 描述
--- | ---
0x0001 | 默认所有者
0x0002 | 默认群组
0x0004 | 当前的DACL
0x0008 | 默认的DACL
0x0010 | 当前的SACL
0x0020 | 默认的 SACL
0x0100 | 要求自动延续的DACL
0x0200 | 要求自动延续的SACL
0x0400 | 自动延续的DACL
0x0800 | 自动延续的SACL
0x1000 | DACL 保护
0x2000 | SACL 保护
0x4000 | RM 控制有效
0x8000 | 自相关的

### 默认的所有者

在设置时，这个布尔数学系统的标记用所有者域指示SID所指向的， 是由一个默认的机构提供，而不是由安全描述符的初始供给者明确地提供。 这也许会影响SID关于所有者延续的处理。

### 默认群组

在设置时，这个布尔数学系统的标记用所有者域指示SID所指向的， 是由一个默认的机构提供，而不是由安全描述符的初始供给者明确地提供。 这也许会影响SID关于初始群组的处理。

### 当前DACL

在设置时，这个布尔数学系统的标记指示包含一个ACL目录的安全描述符。 如果此标记已经设置且安全标识符的DACL域是零，那么就明确说明了一个无效的ACL。

### 默认的DACL

在设置时，这个布尔数学系统的标记用所有者域指示SID所指向的， 是由一个默认的机构提供，而不是由安全描述符的初始供给者明确地提供。 这也许会影响ACL关于一个ACL延续的处理。如果没有设置DACL当前标记则可忽略此标记。

### 当前SACL

在设置时，这个布尔数学系统的标记指示包含一个由SACL域指向的系统ACL的安全描述符。 如果此标记已经设置且安全描述符的SACL域为零，则指定了一个空（但是存在）的ACL。

### 默认的SACL

在设置时，这个布尔数学系统的标记用所有者域指示SID所指向的， 是由一个默认的机构提供，而不是由安全描述符的初始供给者明确地提供。 这也许会影响ACL关于一个ACL延续的处理。如果设置了当前SACL，则此标记可忽略。

### 自相关

在设置时，这个布尔数学系统的标记指示安全描述符是自相关形式。 在这种形式中，安全描述符的所有域在内存中是连续的，所有指针域表示为从安全描述符开始的偏移量。

        SID结构是一个可变长度结构，用于唯一地识别用户或群组。

        SID代表安全描述符。

        SID的标准原文表示法为：S-R-I-S-S...

        这里：
           - 第一个“S”是文字符，确定下面的数字是一个SID。
           - R 是SID的修订水平，表示为一个数字序列，可为十进制或十六进制
             如果是后者，由“0x”做前缀）。
           - I 是48比特的著作权标识符，表示为和上面的R相同的数字。
           - S... 是一个或更多的子著作权值，表示为和上面的R相同的数字。

        SID实例; 范围自相关SID，在WINDOWS NT/2K上有本地的管理群组：

            S-1-5-32-544

        转化到SID为：
            修订本 = 1,
            子著作权数 = 2,
            著作权标识符 = {0,0,0,0,0,5},   NT的安全著作权
            子著作权[0] = 32,               SECURITY_BUILTIN_DOMAIN_RID
            子著作权[1] = 544               DOMAIN_ALIAS_RID_ADMINS

        ACE类型：

        ACCESS_MIN_MS_ACE_TYPE           = 0
        ACCESS_ALLOWED_ACE_TYPE          = 0
        ACCESS_DENIED_ACE_TYPE           = 1
        SYSTEM_AUDIT_ACE_TYPE            = 2
        SYSTEM_ALARM_ACE_TYPE            = 3 不在win2k下执行.
        ACCESS_MAX_MS_V2_ACE_TYPE        = 3

        ACCESS_ALLOWED_COMPOUND_ACE_TYPE = 4
        ACCESS_MAX_MS_V3_ACE_TYPE        = 4

        下面只在WIN2K环境里

        ACCESS_MIN_MS_OBJECT_ACE_TYPE    = 5
        ACCESS_ALLOWED_OBJECT_ACE_TYPE   = 5
        ACCESS_DENIED_OBJECT_ACE_TYPE    = 6
        SYSTEM_AUDIT_OBJECT_ACE_TYPE     = 7
        SYSTEM_ALARM_OBJECT_ACE_TYPE     = 8
        ACCESS_MAX_MS_OBJECT_ACE_TYPE    = 8

        ACCESS_MAX_MS_V4_ACE_TYPE        = 8

        下面这个只针对WINNT和2K

        ACCESS_MAX_MS_ACE_TYPE           = 8

        用于审计和延续的ACE标记（8比特）：

        SUCCESSFUL_ACCESS_ACE_FLAG只用于系统审计和警告ACE类型来指示
        为访问成功产生一个信息（在WINDOWS里）。

        FAILED_ACCESS_ACE_FLAG只用于系统审计和警告ACE类型来指示为访
        问失败产生一个信息（在WINDOWS里）。

        延续标记：
        OBJECT_INHERIT_ACE           = 0x01
        CONTAINER_INHERIT_ACE        = 0x02
        NO_PROPAGATE_INHERIT_ACE     = 0x04
        INHERIT_ONLY_ACE             = 0x08
        INHERITED_ACE                = 0x10  Win2k only
        VALID_INHERIT_FLAGS          = 0x1f

        审计标记：
        SUCCESSFUL_ACCESS_ACE_FLAG   = 0x40
        FAILED_ACCESS_ACE_FLAG       = 0x80

        访问标准权利的定义

        标准权利：
        删除                   = 0x00010000
        读取控制               = 0x00020000
        DAC写入                = 0x00040000
        所有者写入             = 0x00080000
        同步                   = 0x00100000

        要求的标准权利         = 0x000f0000

        标准权利读取           = 0x00020000
        标准权利写入           = 0x00020000
        标准权利执行           = 0x00020000

        所有标准权利           = 0x001f0000

        访问系统ACL和最大允许访问类型

        访问系统安全           = 0x01000000
        最大允许               = 0x02000000

        一般权利：
        所有一般的               = 0x10000000
        一般执行                 = 0x20000000
        一般写入                 = 0x40000000
        一般读取                 = 0x80000000

        对象ACE标记（32比特）：
        ACE当前对象类型          = 1
        ACE当前延续对象类型      = 2

        ACL常数
        当前修订本：
        ACL修订本                = 2
        ACL_REVISION_DS          = 4

        修订本历史：
        ACL_REVISION1        = 1
        MIN_ACL_REVISION     = 2
        ACL_REVISION2        = 2
        ACL_REVISION3        = 3
        ACL_REVISION4        = 4
        MAX_ACL_REVISION     = 4

       绝对安全描述符不包含所有者和群组SID,在安全描述符里也没有SACL和DACL ACL。
       作为替代，它包含到内存里哪些结构的指针。显然，绝对安全描述符只用于在内存
       中安全描述符的表示法。在磁盘上，使用一个自相关的安全描述符。

       属性：安全描述符(0x50).一个标准的自相关安全描述符。
       注意：总是常驻的。
       注意：在NTFS3.0+中不用,因为安全描述符存储在文件安全里并且正确的描述符使用
       标准信息属性中的安全标识符.

       在NTFS3.0+中,所有的安全描述符存储在文件安全里.只存储每个唯一的安全描述符。

       文件安全包含非未命名数据属性，例如，它有零长度。但是它包含两个索引($SDH 和 $SII)
       和一个命名的数据流($SDS).

       每个唯一的安全描述符分配了一个唯一的安全标识符（安全验证，不要和SID混淆）。
       安全验证对于NTFS卷来说是唯一的，用作一个到$SII的索引，它指出了安全验证到安
       全描述符在$SDS数据流里的存储位置。$SII索引由安全验证升序分类。

       一个简单的杂乱信号是从每个安全描述符计算的，这个杂乱信号用作到$SDH索引的一
       个索引，它指出了安全描述符杂乱信号到安全描述符在$SDS数据流里的存储位置。此$SDH
       索引由安全描述符杂乱信号分类且存储在一个B＋子目录结构里。当搜索$SDH时（想确定是
       否已经有一个新的安全描述符存在于$SDS数据流里），如果发现了一个匹配的杂乱信号，
       但是安全描述符不匹配，就要继续在$SDH索引中的搜索，寻找下一个匹配的杂乱信号。

       当发现一个精确的匹配时，就会从$SDH索引项读取在$SDS属性里安全描述符所对应的安全
       验证，并存储在应用安全描述符的文件/目录的标准信息属性里。标准信息属性存在于
       所有低级的MFT记录里（例如在所有文件和目录里）。

       如果没发现匹配，则阿全描述符被分配了一个新的唯一安全验证并添加到$SDS数据属性。那
       么，涉及到$SDS数据属性中的安全描述符的条目则被添加到$SDH 和 $SII索引。

       注意：条目从不会被从文件安全里删除，即使没有任何事涉及到此条目。

       $SDS数据流包含安全描述符，以16字节边界排列，由安全验证在一个B＋子目录结构里分类。
       安全描述符不能超过256k字节边界（此限制是由WINDOWS 缓存管理器强加的）。每个安全描述
       符包含在一个SDS条目结构里。而且，每个安全描述符在$SDS流里以一个0x40000字节（256k字
       节，WINDOWS缓存管理器的最大值）的固定偏移量距离存储两次。例如，如果一个SDS条目指定
       了一个0x51d0的偏移量，那么安全描述符的第一个拷贝在$SDS数据流的偏移量0x51d0处，第二
       个拷贝在偏移量0x451d0处。

       $SII索引，整理类型是COLLATION_NTOFS_ULONG。
       $SDH索引，整理规则是COLLATION_NTOFS_SECURITY_HASH。

Online 中文在线 Validate HTML Validate CSS $Id: security_descriptor.html,v 1.9 2001/07/11 11:04:05 flatcap Exp $