50H属性结构
50H类型属性即$SECURITY_DESCRIPTOR属性,也就是安全描述符,主要用于保护文件以防止没有授权的访问,但Windows 2000/XP中已将安全描述符存放在$Secure元数据中,以便于共享(早期的NTFS将其与文件目录一起存放,不便于共享)。
安全描述属性的结构见表4-44。
表4-44 50H属性描述表
在一个标准属性头后是一个50H特有的属性头,其后跟一个或两个ACL(Access Control List,访问控制列表)和两个SID(Security Identifier,安全ID)。
ACL即访问控制列表,它赋予或拒绝特定用户或组访问某个对象的权限的对象安全描述符的组成部分。只有某个对象的所有者才可以更改ACL中赋予或拒绝的权限,这样,此对象的所有者就可以自由访问该对象。
SID即安全标识符,它是用来识别用户、组和计算机账户的不同长度的数据结构。在第一次创建该账户时,将给网络上的每一个账户发布一个唯一的SID。Windows中的内部进程将引用账户的SID而不是账户的用户名或组名。
第一个ACL(Access Control Entry)包括审核信息,即访问对象时要审核的组和用户账户,但也可能没有;第二个ACL包括权限,即授予的每个组或用户的权限的每个访问事件的成功或失败属性。
每一个ACL可能包括一个或多个ACE,ACE即访问控制项,它是授予用户或组权限的ACL中的一个项目。ACE也是对象的系统访问控制列表(SACL)中的项目,该列表指定用户或组要审核的安全事件,每一个ACE包括一个SID。
SACL是表示部分对象的安全描述符的列表,该安全描述符指定了每个用户或组的哪个事件将被审核。审核事件的例子是文件访问、登录尝试和系统关闭。
最后两个SID表示对象的所有者即用户和组。
为能防止对文件的未经授权的访问,安全描述必须存储文件所有者、文件所有者授予其他用户的访问许可、什么行为需要日志记录(审核)等信息。该属性没有最小最大长度要求。
50H属性中属性头的结构
50H类型属性中属性头的结构见表4-45。
表4-45 50H属性头描述表
字节偏移 | 字段长度(字节) | 含义 |
0x00 | 1 | 头1(通常总是01) |
0x01 | 1 | 头2(通常总是00) |
0x02 | 1 | 头3(通常为0x04或0x14,前者表示无审计,后者表示有审计) |
0x03 | 1 | 头4(通常总是80H) |
0x04 | 4 | 用户SID的偏移 |
0x08 | 4 | 组SID的偏移 |
0x0C | 4 | ACL审核 |
0x10 | 4 | ACL权限 |
50H属性中ACL的结构
ACL的结构见表4-46。
表4-46 ACL描述表
字节偏移 | 字段长度(字节) | 含义 |
0x00 | 1 | ACL版本 |
0x01 | 1 | 常为“00”,无意义 |
0x02 | 2 | ACL长度 |
0x04 | 2 | ACE合计 |
0x06 | 2 | 常为“00 00”,无意义 |
50H属性中ACE的结构
ACE的结构见表4-47。其中的标志包括3种情况,见表4-48。
表4-47 ACE描述表
字节偏移 | 字段长度(字节) | 含义 |
0x00 | 1 | 类型 |
0x01 | 1 | 标志 |
0x02 | 2 | 大小 |
0x04 | 4 | 访问掩码 |
0x08 | V | SID |
表4-48 ACE的标志
值 | 描述 |
0x00 | 访问允许 |
0x01 | 访问拒绝 |
0x02 | 系统审核 |
该标志可能的取值依赖于类型的值(偏移00H)。对于目录,其访问允许和访问拒绝有表4-49所列标志。
表4-49 目录的ACE标志描述
值 | 描述 |
0x01 | 对象继承的ACE |
0x02 | 容器继承的ACE |
0x04 | 不传播继承的ACE' |
0x08 | 只继承ACE |
如果是系统审核,标志则可能是表4-50中的情况。
表4-50 系统审核的ACL标志描述
值 | 描述 |
0x40 | 审核成功 |
0x80 | 审核失败 |
32位访问掩码即访问权限用于列举所有的允许及不允许的行为,其含义见表4-51。
表4-51 ACL访问掩码
位偏移 | 含义 | 描述 |
0~15 | 对象特殊访问权限 | 读数据、执行、添加数据 |
16~22 | 标准访问权限 | 删除、修改ACL、修改所有者 |
23 | 可以访问ACL | |
24~27 | 保留 | |
28 | 所有(读、写、执行) | 所有事情 |
29 | 执行 | 执行程序所需的所有权力 |
30 | 写 | 写文件所需的所有权力 |
31 | 读 | 读文件所需的所有权力 |
50H属性中SID的结构
典型的SID形如:S-1-5-21-646518322-1873620750-619646970-1110,由'S-p-q-r-s-t-u-v'组成,其意义见表4-52。
表4-52 SID的结构
S | 安全 |
p | 版本号(目前为1) |
q | NT域,该数值占6个字节 |
r~v | NT子域(可能有几个这样的子域) |
SID在磁盘上的存储形式如:S-1-5-21-646518322-1873620750-619646970-1110,用十六进制表示就是S-1-5-15-26891632-6fad2f0e-24ef0ffa-456(5个子域),其在磁盘上的存储见表4-53。
表4-53 SID在磁盘上的存储
但要注意的是这是一个可变长度的结构,它可能长一些,或短一些,子域会使结构变得大一些或小一些。
例如,在S-1-5-21-646518322-1873620750-619646970-1110这个SID中,“S”是SID简称,“1”为版本号,“5”为标识授权,“21”为子授权,“646518322”为SA(Security Association,安全协会),“1873620750”为SA的域ID,“619646970”也是SA,“1110”为用户ID。其中标识授权的含义见表4-54。
表4-54 安全标识的组成部分
标识授权 | 缩写 |
无效SID | S-1-0 |
全球SID | S-1-1 |
本地SID | S-1-2 |
创建者SID | S-1-3 |
非唯一SID | S-1-4 |
NT SID | S-1-5 |
子授权中的R表示相关ID(Relative Identifiers),用以和标识授权一起组成知名SID,其含义见表4-55。
表4-55 相关ID
常见的知名域用户见表4-56。
表4-56 常见知名域用户
域用户 | 代码 |
Admin(管理员) | 500 |
Guest(来宾) | 501 |
Kerberos Target(安全验证用) | 502 |
常见的知名域组见表4-57。常见的知名域别名见表4-58。
表4-57 常见知名域组
域组 | 代码 |
Admins(管理员组) | 512 |
Users(用户组) | 513 |
Guests(来宾组) | 514 |
Computers(计算机组) | 515 |
Controllers(控制员组) | 516 |
Cert Admins(确定管理员组) | 517 |
Schema Admins(计划管理员组) | 518 |
Enterprise Admins(企业管理员组) | 519 |
Policy Admins(策略管理员组) | 520 |
表4-58 常见知名域别名
域别名 | 代码 |
Admins(管理员组) | 544 |
Users(用户组) | 545 |
Guests(来宾组) | 546 |
Power Users(高级用户组) | 547 |
Account Ops(账号操作) | 548 |
System Ops(系统操作) | 549 |
Print Ops(打印操作) | 550 |
Backup Ops(备份操作) | 551 |
Replicator(复制操作) | 552 |
RAS Servers | 553 |
Pre W2K Comp Access | 554 |
安全描述符的控制标志见表4-59。
表4-59 SID的控制标志
标志 | 描述 | 标志 | 描述 |
0x0001 | 默认所有者 | 0x0200 | SACL自动继承Req |
0x0002 | 默认组 | 0x00400 | DACL自动继承 |
0x0004 | DACL存在 | 0x0800 | SACL自动继承 |
0x0008 | DACL默认值 | 0x1000 | DACL保护 |
0x0010 | SACL存在 | 0x2000 | SACL保护 |
0x0020 | SACL默认值 | 0x4000 | RM控制有效 |
0x0100 | DACL自动继承Req | 0x8000 | 自相关标志 |
其中默认所有者是一个布尔标志,设置时表示通过默认机制由所有者域来指示SID,而不是采用由最初的安全描述符所显式指定的SID。它将对所有者继承的处理方式产生影响。默认组的设置同默认所有者一样。
DACL存在是一个布尔标志,设置时表示安全描述包含一个自由的ACL。如果设置了该位,而安全描述的DACL域为空,则将此空ACL列入清单。
DACL(任意访问控制列表)默认值是一个布尔标志,设置时表示通过默认机制由DACL域来指示ACL,而不是由最初的安全描述指定ACL。它将对ACL继承的处理方式产生影响。如果DACL存在没有设置,则忽略该标志。
SACL存在是一个布尔标志,设置时表示安全描述包含一个由SACL域指定的系统ACL。如果设置了该位,而安全描述的SACL域为空,则将此空ACL(但确实存在)列入清单。
SACL默认值是一个布尔标志,设置时表示通过默认机制由SACL域来指示ACL,而不是由最初的安全描述指定ACL。它将对ACL继承的处理方式产生影响。如果SACL存在没有设置,则忽略该标志。
自相关标志是一个布尔标志,设置时表示安全描述是一个自相关表。在该表中,安全描述的所有域在内存中都是连续的,所有的指示域都明确的用从相对安全描述的起始处的偏移来表示。
在NTFS 4.0以上版本中,所有的安全描述都集中存储在$Secure文件中,通过标准信息属性中的安全ID属性来找到正确的安全描述。每个唯一的安全描述都指派一个唯一的安全标识(security_id,但不是SID),卷中的security_id是唯一的,作为$SII索引的一个索引来使用,并存储为$SDS的数据流属性。$SII索引按security_id的升序进行存储。
50H属性可以常驻,也可以非常驻,一个常驻50H的例子如图4-420所示。
图4-420 常驻50H的例子