Windows 通过相互关联的身份验证和授权机制来控制系统资源和网络资源的使用。 对用户进行身份验证后,Windows 操作系统使用内置授权和访问控制技术来实现保护资源的第二阶段:确定经过身份验证的用户是否具有访问资源的正确权限。
基本概念
对象:包括文件、文件夹、打印机、注册表项和 Active Directory 域服务 (AD DS) 对象
权限:授予用户或组的访问权限类型,例如,可以授予 Finance 组对名为 Payroll.dat 的文件的读取和写入权限。
对象所有权:创建对象时,会向该对象分配所有者。 默认情况下,所有者是对象的创建者。 无论对对象设置了哪些权限,该对象的所有者始终都可以更改权限。
权限继承:继承允许管理员轻松分配和管理权限, 例如,文件夹中的文件继承文件夹的权限
用户权限:向计算环境中的用户和组授予的特定权限和登录权限,管理员可以将特定权限分配给组帐户或单个用户帐户
动态访问控制:如果用户的作业或角色发生更改,则用户的权限会动态更改
认证机制
操作系统密码存储于%SystemRoot%\system32\config\SAM
文件中

在登录时,winlogon.exe接收到账号密码后,会将密码交给lsass进程,这个进程会将明文密码加密成NTLM Hash,与SAM文件中的账号密码进行比较认证

用户账户控制
Windows账户分类:
SYSTEM:拥有系统最高权限
Administrators 用户组:
- Administrator
- 管理员账户:比SYSTEM低,是用户最高权限,在权限上与Administrator一样,但是在访问令牌管理上有所不同

Users 用户组
显式的区别Administrator/管理员账户/标准账户:
- Administrator:可直接运行高权限程序,无弹窗
- 管理员账户:在运行高权限程序时,有弹窗确认

标准账户:要求输入管理员账号和密码

Windows token 管理
Windows Token即Access Token(访问令牌),不同的用户登录计算机后会生成一个Access Token,token在用户创建进程或线程时会进行拷贝和分配。
Windows Access Token主要组成
- 用户账户的SID;
- 用户所属组的SID;
- 登陆SID,标识当前登陆会话;
- 用户和用户组特权列表;
- 用户创建的进程的默认DACL;
- access token类型和来源;
- 其他信息;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
| kd> !process 81464da8 1 PROCESS 81464da8 SessionId: 0 Cid: 03bc Peb: 7ffdf000 ParentCid: 0124 DirBase: 0dec2000 ObjectTable: e1a31198 TableSize: 275. Image: MSMSGS.EXE VadRoot 81468cc0 Vads 170 Clone 0 Private 455. Modified 413. Locked 0. DeviceMap e1958438 Token e1bed030 ElapsedTime 0:44:15.0142 UserTime 0:00:00.0290 KernelTime 0:00:00.0300 QuotaPoolUsage[PagedPool] 49552 QuotaPoolUsage[NonPagedPool] 10872 Working Set Sizes (now,min,max) (781, 50, 345) (3124KB, 200KB, 1380KB) PeakWorkingSetSize 1550 VirtualSize 57 Mb PeakVirtualSize 57 Mb PageFaultCount 2481 MemoryPriority BACKGROUND BasePriority 8 CommitCharge 2497 kd> !exts.token -n e1bed030 _TOKEN e1bed030 TS Session ID: 0 User: S-1-5-21-518066528-515770016-299552555-2981724 (User: MYDOMAIN\myuser) Groups: 00 S-1-5-21-518066528-515770016-299552555-513 (Group: MYDOMAIN\Domain Users) Attributes - Mandatory Default Enabled 01 S-1-1-0 (Well Known Group: localhost\Everyone) Attributes - Mandatory Default Enabled 02 S-1-5-32-544 (Alias: BUILTIN\Administrators) Attributes - Mandatory Default Enabled Owner 03 S-1-5-32-545 (Alias: BUILTIN\Users) Attributes - Mandatory Default Enabled 04 S-1-5-21-518066528-515770016-299552555-2999049 (Group: MYDOMAIN\AllUsers) Attributes - Mandatory Default Enabled 05 S-1-5-21-518066528-515770016-299552555-2931095 (Group: MYDOMAIN\SomeGroup1) Attributes - Mandatory Default Enabled 06 S-1-5-21-518066528-515770016-299552555-2931096 (Group: MYDOMAIN\SomeGroup2) Attributes - Mandatory Default Enabled 07 S-1-5-21-518066528-515770016-299552555-3014318 (Group: MYDOMAIN\SomeGroup3) Attributes - Mandatory Default Enabled 08 S-1-5-21-518066528-515770016-299552555-3053352 (Group: MYDOMAIN\Another Group) Attributes - Mandatory Default Enabled 09 S-1-5-21-518066528-515770016-299552555-2966661 (Group: MYDOMAIN\TestGroup) Attributes - Mandatory Default Enabled 10 S-1-5-21-2117033040-537160606-1609722162-17637 (Group: MYOTHERDOMAIN\someusers) Attributes - Mandatory Default Enabled 11 S-1-5-21-518066528-515770016-299552555-3018354 (Group: MYDOMAIN\TestGroup2) Attributes - Mandatory Default Enabled 12 S-1-5-21-518066528-515770016-299552555-3026602 (Group: MYDOMAIN\SomeGroup4) Attributes - Mandatory Default Enabled 13 S-1-5-21-518066528-515770016-299552555-2926570 (Group: MYDOMAIN\YetAnotherGroup) Attributes - Mandatory Default Enabled 14 S-1-5-21-661411660-2927047998-133698966-513 (Group: MYDOMAIN\Domain Users) Attributes - Mandatory Default Enabled 15 S-1-5-21-518066528-515770016-299552555-2986081 (Alias: MYDOMAIN\an_alias) Attributes - Mandatory Default Enabled GroupResource 16 S-1-5-21-518066528-515770016-299552555-3037986 (Alias: MYDOMAIN\AReallyLongGroupName1) Attributes - Mandatory Default Enabled GroupResource 17 S-1-5-21-518066528-515770016-299552555-3038991 (Alias: MYDOMAIN\AReallyLongGroupName2) Attributes - Mandatory Default Enabled GroupResource 18 S-1-5-21-518066528-515770016-299552555-3037999 (Alias: MYDOMAIN\AReallyLongGroupName3) Attributes - Mandatory Default Enabled GroupResource 19 S-1-5-21-518066528-515770016-299552555-3038983 (Alias: MYDOMAIN\AReallyReallyLongGroupName) Attributes - Mandatory Default Enabled GroupResource 20 S-1-5-5-0-71188 (no name mapped) Attributes - Mandatory Default Enabled LogonId 21 S-1-2-0 (Well Known Group: localhost\LOCAL) Attributes - Mandatory Default Enabled 22 S-1-5-4 (Well Known Group: NT AUTHORITY\INTERACTIVE) Attributes - Mandatory Default Enabled 23 S-1-5-11 (Well Known Group: NT AUTHORITY\Authenticated Users) Attributes - Mandatory Default Enabled Primary Group: S-1-5-21-518066528-515770016-299552555-513 (Group: MYDOMAIN\Domain Users) Privs: 00 0x000000017 SeChangeNotifyPrivilege Attributes - Enabled Default 01 0x000000008 SeSecurityPrivilege Attributes - 02 0x000000011 SeBackupPrivilege Attributes - 03 0x000000012 SeRestorePrivilege Attributes - 04 0x00000000c SeSystemtimePrivilege Attributes - 05 0x000000013 SeShutdownPrivilege Attributes - 06 0x000000018 SeRemoteShutdownPrivilege Attributes - 07 0x000000009 SeTakeOwnershipPrivilege Attributes - 08 0x000000014 SeDebugPrivilege Attributes - 09 0x000000016 SeSystemEnvironmentPrivilege Attributes - 10 0x00000000b SeSystemProfilePrivilege Attributes - 11 0x00000000d SeProfileSingleProcessPrivilege Attributes - 12 0x00000000e SeIncreaseBasePriorityPrivilege Attributes - 13 0x00000000a SeLoadDriverPrivilege Attributes - Enabled 14 0x00000000f SeCreatePagefilePrivilege Attributes - 15 0x000000005 SeIncreaseQuotaPrivilege Attributes - 16 0x000000019 SeUndockPrivilege Attributes - Enabled 17 0x00000001c SeManageVolumePrivilege Attributes - Authentication ID: (0,11691) Impersonation Level: Anonymous TokenType: Primary Source: User32 TokenFlags: 0x9 ( Token in use ) Token ID: 18296 ParentToken ID: 0 Modified ID: (0, 18298) RestrictedSidCount: 0 RestrictedSids: 00000000
|
按完整性高低可以分为四类:
- System:对应 SYSTEM 用户拥有的最高权限,系统进程以 SYSTEM 用户启动,拿到 System 令牌
- High:对应 Administrators 组拥有的最高权限,用来管理计算机,可以修改其他用户,可以修改系统的设置
- Medium:对应 Users 组拥有的最高权限,用于日常使用
- Low:为了更小权限而设置的,例如IE使用该权限启动网页,避免恶意攻击对本地资源产生过多影响
细看不同账户区别:
管理员账户,如果启动一个普通进程,那么此进程在管理员账户下运行,获得的是 Medium 访问令牌。当此进程提升权限,将弹出 UAC 提示框,用户同意后继续使用此同一个管理员账户运行,但子进程将获得 High 访问令牌。
标准账户,如果启动一个普通进程,那么此进程在标准账户下运行,获得的是 Medium 访问令牌。当此进程提升权限,将弹出 UAC 提示框,用户输入管理员账号密码后,子进程将在输入的管理员账户下运行,获得此管理员的 High 访问令牌

安全标识符SID
SID用于唯一标识安全主体或安全组
SID永远都是唯一的,由计算机名、当前时间、当前用户态线程的CPU耗费时间的总和三个参数决定,以保证它的唯一性
每个帐户或组,或在帐户的安全上下文中运行的进程都有唯一SID,存储在安全数据库中,当 SID 用作用户或组的唯一标识符时,它永远不会再次用于标识其他用户或组。
本地帐户或组的 SID 由计算机上本地安全机构 (LSA) 生成,并与其他帐户信息一起存储在注册表的安全区域中。 域帐户或组的 SID 由域安全机构生成,并存储为 Active Directory 域服务中的 User 或 Group 对象的属性。
用户每次登录时,系统会为该用户创建访问令牌。 访问令牌包含用户的 SID、用户权限以及用户所属的任何组的 SID。 此令牌为用户在此计算机上执行的任何操作提供安全上下文。
对于每个本地帐户和组,SID 对于创建它的计算机是唯一的。 计算机上没有任何两个帐户或组共享同一 SID。 同样,对于每个域帐户和组,SID 在企业中是唯一的。

1 2 3 4 5 6
| typedef struct _SID { UCHAR Revision; // 标识SID版本 UCHAR SubAuthorityCount; SID_IDENTIFIER_AUTHORITY IdentifierAuthority; //最高级别签发机构 ULONG SubAuthority[ANYSIZE_ARRAY]; //中间签发者 } SID, *PISID;
|
访问令牌
有两种类型的访问令牌,即主令牌和模拟令牌。 每个进程都有一个主令牌,用于描述与进程关联的用户帐户的安全上下文。 通常会将主访问令牌分配给一个进程,以表示该进程的默认安全信息。 另一方面,模拟令牌通常用于客户端和服务器方案。 模拟令牌使线程在不同于拥有该线程的进程的安全上下文的安全上下文中运行。
过程:
当用户以交互方式登录或尝试与运行 Windows 的计算机建立网络连接时,登录过程会对用户凭据进行身份验证。 如果身份验证成功,此过程将返回用户的 SID 和用户的安全组的 SID 列表。
计算机上本地安全 (LSA) 使用此信息创建访问令牌 (在这种情况下,主访问令牌) 。 这包括登录过程返回的 ID 以及本地安全策略分配给用户和用户的安全组的用户权限列表
LSA 创建主访问令牌后,访问令牌的副本将附加到代表用户执行的每一个线程和进程。 每当线程或进程与安全对象交互或尝试执行需要用户权限的系统任务时,操作系统都会检查与该线程关联的访问令牌以确定授权级别。
安全描述符
安全描述符是一种与每个安全对象关联的数据结构。 Active Directory 中的所有对象以及本地计算机或网络上的所有安全对象都有安全描述符,以帮助控制对对象的访问。
安全描述符包括有关谁拥有对象、谁可以访问该对象以及以什么方式访问以及审核哪些类型的访问的信息
分为DACL和SACL:
- 选择访问控制列表DACL:用于标识允许或拒绝访问的用户和组
- 系统访问控制列表SACL:用于控制如何审核访问权限
1 2 3 4 5 6 7 8 9
| typedef struct _SECURITY_DESCRIPTOR { UCHAR Revision; UCHAR Sbz1; SECURITY_DESCRIPTOR_CONTROL Control; PSID Owner; // PSID Group; PACL Sacl; //系统访问控制列表,是用来做审计用的,一般不用关心 PACL Dacl; //自主访问控制列表,记录了哪些用户可以(/不可以)以何种方式访问该对象 } SECURITY_DESCRIPTOR, *PISECURITY_DESCRIPTOR;
|
每个ACL都由一系列ACE元素组成,ACE中包含以下信息:
1、谁对你有权限
2、是允许还是拒绝
3、有什么权限
4、这个权限能不能被继承
授权和访问控制过程

当进程打开一个对象时,会从进程token中获取用户名和用户所在组列表,与对象安全描述符的中的DACL比较
- 对象的DACL==Null,则进程拥有完全的访问权限。
- 对象的DACL不为Null,但是AceCount ==0(ACE,访问控制项),则拒绝任何进程访问。
- 遍历DACL,找到跟令牌中用户或组一致的Ace,如果该Ace指明没有拥有制定的访问权限,则直接退出安全检查函数,并拒绝该进程访问。
- 遍历DACL,没找到跟令牌中用户或组一致的Ace,并拒绝该进程访问。
- 遍历DACL,找到跟令牌中用户或组一致的Ace,如果该Ace指明拥有制定的访问权限,则直接退出安全检查函数,并允许该进程访问。
参考资料