Windows访问控制笔记

Windows安全模型要求当一个线程打开一个对象(如文件、进程、桌面等等)的时候,它必须指定它期望在该对象上执行哪些类型的动作。对象管理器是根据一个线程期望的访问要求,调用SRM(安全引用监视器)来执行访问检查,如果它允许此访问,则向该线程的进程赋予一个句柄,因而该线程或该进程中的其他线程可以通过此句柄在对象上执行进一步的操作。SRM是Ntoskrnl.exe中的一个组件,工作在内核模式下,它负责: 定义访问令牌的数据结构来表示一个安全环境、执行对象的访问检查、管理特权,以及生成所有的结果安全审计消息

一、安全标识符SID

https://docs.microsoft.com/en-us/windows/security/identity-protection/access-control/security-identifiers

Windows使用SID来标识系统中执行各种动作的实体(安全主体),用户有SID、本地用户组、域用户组、本地计算机、域、域成员和服务都有SID。

例如,windows用唯一的SID标识账户及账户组,此后该账户或账户组所做的操作(比如访问某个文件夹),windows都要去验证其身份,确认它是否有权限操作。本地帐户或组的SID 由计算机上的本地安全机构(LSA)生成,并与其他帐户信息一起存储在注册表安全区域中;域帐户或组的SID由域安全机构

(域控上的LSA)生成,并以用户或组对象的属性的形式存储在 Active Directory中。

常见SID的格式如下(RID不一定都有):

procexp查看SID:

注册表查看本地service account SID:

注册表查看本地user account RID:

一般RID 500是Administrator, 501是Guest, 503是DefalutAccount,自定义用户账户和组的RID是从1000开始。

此外,Windows会预定义一些account和group,如NT AUTHORITY\Local Service S-1-5-19,在这里可以查看常见SID:

https://support.microsoft.com/en-au/help/243330/well-known-security-identifiers-in-windows-operating-systems

https://docs.microsoft.com/en-us/windows/security/identity-protection/access-control/security-identifiers#well-known-sids

二、强制完整性控制(MIC, mandatory integrity control)

同一用户,打开chrome.exe下载未知程序和打开word.exe,这两个操作危险性不一样,显然进程权限也应不一样;为此,windows使用强制完整性控制(MIC) 来控制同一用户下的不同进程对安全对象的访问。

 

MIC机制包含两部分:完整性级别和强制策略,此机制是对自由访问控制的补充,发生在自由访问控制列表(DACL)访问检查之前。 

2.1. 完整性级别

安全主体和安全对象都被分配了完整性级别,用于描述访问者与被访问者的访问级别。

1. 进程的完整性级别与令牌强制策略(TOKEN_MANDATORY_POLICY)

每个进程在它的访问令牌中有一个完整性级别,它根据以下规则传播:

进程除了完整性级别,还有一个强制策略:

 

2. 对象的完整性级别与系统强制策略

安全对象在其安全描述符的系统访问控制列表(SACL)中有一个完整性级别

  • 为了兼容老版本window和方便开发者,所有的对象都有一个隐含的完整性级别"中"
  • 当进程创建一个对象时,如果没有指定完整性级别,系统会根据进程令牌中的完整性来决定对象的完整性。如果进程完整性级别是"中"或更高,则对象隐含的完整性级别仍是"中";如果进程的完整性级别低于"中",则会显示地以与令牌中相匹配的完整性级别创建对象。

  为什么对象不能继承创建者的"高"完整性级别?  如果管理员禁用UAC并创建一个对象,此时进程是"高"完整性级别,若对象也继承"高"完整级别,当再次启用UAC时管理员会无法修改这个对象。

  • 对象也可以有一个由系统或对象创建者显示设置的完整性级别。当进程、线程、令牌、作业这几类对象被创建时,内核会赋予一个显示的完整性级别,使得同一用户下低完整性级别的进程无法访问或修改这些对象。

安全对象除了完整性级别,也有一个强制策略:

 可以用accesschk.exe -v查看进程、文件、注册表等对象的完整性级别和强制策略:

 三、访问令牌 Access Token

SRM使用令牌对象来标识一个进程或线程的安全上下文环境,令牌中包含的最重要的内容如下所示:

1. 令牌源,描述创建此令牌的实体

2. 主令牌还是模仿令牌,模仿令牌的模仿级别(后面讲述)

3. 令牌ID,相当于令牌标识符,每个令牌唯一。

4. 认证ID,LSASS为所有从同一个初始登录令牌继承下来的令牌,拷贝其认证ID,用于程序检查该令牌与其他令牌是否属于同一个登录会话。

5. 修改ID,每次当一个令牌的特征被修改时,会刷新修改ID。

6. 过期时间,令牌过期时间

7. 会话ID

8. 各种标志,决定了UAC和UIPI机制的某些行为(后面讲述)

9. 登录会话

10. 强制策略,对应第二部分讲到的令牌强制策略

11. 默认的主组和默认的DACL,进程所创建对象的默认主组和默认DACL,这样不需每次创建对象都显示指定这些信息。

12. 用户账户SID, 进程所属账户

13. 组SID,用户账户属于哪些组

14. 受限制的SID,将此SID标记为deny-only,后面做访问检查的时候,只匹配那些access-denied的ACE,略过access-allowed的ACE,即只用于拒绝。

15. 特权 (后面讲述)

模拟令牌

https://www.anquanke.com/post/id/190207#h2-8

https://www.cnblogs.com/MyGuazi/p/11871420.html

猜你喜欢

转载自www.cnblogs.com/ring-lcy/p/12740907.html