有关于一次windows权限方面的一次学习

由于最近需要使用windows的Local Group Policy的API,重新梳理一些有关windows权限的只是,这样需要理解一些关键概念,这些概念之间的关联联系形成了一张网络图。必须理解才能真正理解新东西的知识体系。

以前对这些东西都是一知半解的,什么安全描述符,安全对象等等都不太明白。

1.关键名词概念解释

  1. 安全对象------带有安全描述符的对象,比如文件对象,目录对象,命名管道对象,匿名管道对象,进程对象,线程对象,访问令牌,注册表键,windows服务等。
  2. 访问控制列表(ACL)-----与一个对象关联的安全属性列表,该列表描述了这个对象的安全访问控制的属性。这个对象一般就是win32 的安全对象,可以是一个文件,一个进程,
  3. 一个事件(Event),或其他带有安全描述符的对象。一个ACL是由多个访问控制项(ACE)组成的,windows有两种类型的ACL,分别是任意访问控制列表(discretionary ACL)和系统控制访问列表(system ACL)
  4. 访问控制项(ACE)-------多个ACE组成了一个ACL,可以把它想象成一个数组里面的元素。一个ACE包含了一组访问权限(execute, write,read等)和一个安全ID(SID), 这个ID标识了这组访问权限是允许,是拒绝,还是需要受到检查才能访问。比如,一个文件对象一个ACL列表中的其中一项就标记了这个文件不可写或者不可读。至于有哪些权限,可以看这里: https://msdn.microsoft.com/en-us/library/windows/desktop/aa374902(v=vs.85).aspx
  5. 访问令牌(Access Token)------是一个与一个进程或线程关联的对象,它描述了进程或线程的安全上下文。令牌中包含了与用户账户关联的进程或线程的标识和权限,当一个用户登录系统时,系统首先校验用户账户的密码(正确的密码存储在windows系统的安全数据库中),如果通过登陆成功,系统会生成与这个用户账户关联的访问令牌,之后这个用户执行启动的每个进程或线程都会复制这个访问令牌作为自己的令牌。令牌标识了用户,用户所属的组,以及用户的权限。系统用这个令牌来控制访问安全对象,还有控制限制用户的系统相关的操作。访问令牌本身也是安全对象,因为需要控制它是否可读写等等。关于令牌更详细的请看:https://msdn.microsoft.com/en-us/library/windows/desktop/aa374909(v=vs.85).aspx
  6. 任意访问控制列表(DACL)-----对对象持有者控制访问对象,并标明特定的用户,特定的组是否能持有对象。简单一句话就是说,定义哪个用户,或哪个用户所属的组访问该对象的权限。举个例子,当一个进程试图访问一个安全对象的时候,系统就检查检查该安全对象的DACL的每个ACE项,逐个与该进程的访问令牌作对比,来决定是否授权访问给进程。如果一个安全对象没有DACL,系统就会授予该对象的所有访问权限给任何用户,如果一个安全对象有DACL,但是DACL里面没有ACE,那么系统会拒绝对该对象的任何访问。
  7. 系统访问控制列表(SACL)-----使系统管理员对一个安全对象的所有访问都以日志记录访问的备份,可以简单理解为,访问记录的一个表。暂时不用深入理解。
  8. 登陆会话(logon session)----登陆会话开始于用户登录电脑的那一刻,所有进程在登陆会话中都有一个同样的primary访问令牌,该令牌中的信息主要包括,用户的SID,登陆的ID,还有登陆SID
  9. 登陆SID(logon SID)------登陆会话的安全描述ID,该ID直到用户注销前都有效。在登陆后,SID都是唯一的,不同的登陆会话就有不同的登陆SID,计算机启动时,可能会重置一组登陆SID,可以从访问令牌中检索登陆SID,调用GetTokenInformation函数

 

2.知识体系图

以上的图应该很直接的说明这些概念是怎样协同工作的了。下面以文本方式讲解工作机制:

系统将每个 ACE 的trustee与线程的访问令牌中标识的trustee进行比较。访问令牌包含标识用户所属的用户和组帐户的安全标识符 (sid)。访问令牌还包含标识当前登录会话的登录 sid。在访问检查过程中, 系统忽略未启用的组 sid。通常, 系统使用请求访问的线程的主访问令牌来访问安全对象。但是, 如果线程模拟另一个用户, 则系统使用线程的模拟令牌。

系统将依次检查DACL中的ACE,直到下列事件发生:

  • 访问被拒绝的 ACE 显式拒绝对线程访问令牌中列出的某个trustee所请求的访问权限。
  • 一个或多个允许访问的 ACE显式授予在线程访问令牌中它所负责的trustee所有请求的访问权限。
  • 所有的 ACE 都已被检查, 并且至少还有一个请求的访问权限未被明确允许, 在这种情况下, 访问被隐式拒绝。

 

下面看图说话:

对于线程 A, 系统读取ACE, 并立即拒绝访问, 因为拒绝访问的 ACE 适用于线程的访问令牌中的用户。在这种情况下, 系统不检查 ACE 2和ACE 3。对于线程 B, ACE 1不适用, 因此系统将进入 ACE 2, 允许写入访问, 然后进入下一个ACE3, 并且 ACE 3 允许读取和执行访问。

由于系统在明确授予或拒绝请求的访问时会停止检查下一个ACE, 因此 DACL中的 ACL排列 顺序非常重要。请注意, 如果该图片示例中的 ACE 顺序不同, 则系统可能已授予对线程 A的访问权限。

更多的请参考:https://msdn.microsoft.com/en-us/library/windows/desktop/aa379298(v=vs.85).aspx

 

3.注意事项

不要直接修改ACL的内容,需要通过微软专门提供的API来做,下面有参考资料:

https://msdn.microsoft.com/en-us/library/windows/desktop/ms717798(v=vs.85).aspx

https://msdn.microsoft.com/en-us/library/windows/desktop/aa446659(v=vs.85).aspx

https://msdn.microsoft.com/en-us/library/windows/desktop/aa446596(v=vs.85).aspx

 

references:

http://blog.csdn.net/xbgprogrammer/article/details/16818973

https://msdn.microsoft.com/en-us/library/windows/desktop/aa446683(v=vs.85).aspx

 

posted @ 2017-04-12 12:59  foo__hack  阅读(3024)  评论(0编辑  收藏  举报