【windows安全性 之访问控制】 访问控制 详细解说
windows的安全性的两个基本支柱是身份验证(登入)和授权(访问控制)。
身份验证是标识用户的过程 ,授权在验证了所标识用户是否可以访问特定资源之后进行。
相关的命名空间和类:
System.Security Namespace
System.Security.Principal Namespace
WindowsIdentity Class
System.Security.AccessControl Namespac
FileSystemSecurity Class
DirectorySecurity Class
FileSecurity
AccessRule Class
FileSystemAccessRule Class
AccessControlType Enum
FileSystemRights Enum
目录
1、访问控制模型(Access Control Model)
- 1.1访问控制模型的各个部分
- 1.2线程与安全对象之间的交互
- 1.3DACL 和 AES
- 1.4AccessCheck 的工作原理
2、访问控制编辑器(Access Control Editor)
1.1访问控制模型的各个部分
访问控制模型由两个基本部分:
-
访问令牌(Access Token)
其中包含有关登录用户的信息(User SID,Group SIDS,特权列表privileges),访问令牌是与Windows的账户相互对相应的,当某一账户登录时,系统会生成此用户的访问令牌并分发给启动的进程 -
安全描述符(Security descriptor)
描述一个安全对象的安全信息,如什么样的用户的什么访问请求可以被允许,什么样的用户或者组的什么访问要被拒绝。安全描述符具体由ACL、 对象拥有者SID 、此拥有者所在主群的SID、安全描述符意思相符的控制位集合一起组成。ACL由 自由访问控制列表 (DACL) 和系统访问控制列表 (SACL)组成。
访问控制的工作原理:
简述:用户经过身份认证成为 安全主体》安全主体 获取访问令牌》安全主体持有访问令牌 操作 安全对象》操作系统比对 安全主体持有的访问令牌 与 安全对象的安全描述符 是否匹配》如匹配允许操作(删除 、移动 、添加等13项操作),不匹配拒绝操作。
具体:用户登录时 ,系统会对用户 的帐户名和密码进行身份验证, 如果登录成功,我们就把该用户称为安全主体,LSA(Local Security Authority)将创建访问令牌 ,安全主体将获取此令牌(access token)。
安全主体持有访问令牌,安全主体访问安全对象时候,操作系统将检查安全主体的访问令牌内容和安全对象的安全描述是否匹配。如果匹配操作系统将允许安全主体对安全对象进行相应的操作。
相关知识点:访问令牌的组成、安全描述符、安全标识符(SID)、计算机上本地安全机构(LSA)、权限列表
安全描述符标识对象的所有者,还可以包含以下 访问控制列表:
ACL 包含 AES (访问控制) 。 每个 ACE 指定一组访问权限,并包含一个 SID,用于标识允许、拒绝或审核其权限的受信者。 受信者可以是用户帐户、组帐户或 登录会话。
使用函数操作安全描述符、SID 和 ACL 的内容,而不是直接访问它们。 这有助于确保这些结构在语法上保持准确,并防止将来对安全系统的增强功能破坏现有代码。
以下主题提供有关访问控制模型的各个部分的信息:
1.2线程与安全对象之间的交互
当线程尝试使用安全对象 时,系统会先执行访问检查,然后再允许线程继续。 在访问检查中,系统将线程的访问令牌中的安全信息与对象的安全描述 符 中的安全信息 进行比较。
- 访问令牌包含 标识与 (关联的) ID 的安全标识符。
- 安全描述符标识对象的所有者,并包含 DACL (的) 。 DACL 包含 AES (访问控制) ,其中每个条目都指定允许或拒绝特定用户或组的访问权限。
系统检查对象的 DACL,从线程的访问令牌中查找应用于用户和组 SID 的 AES。 系统会检查每个 ACE,直到授予或拒绝访问,或者直到没有要检查的 ACE。 可以想象 ,ACL (访问控制) 可能有几个适用于令牌的 SID 的 AES。 如果发生这种情况,则每个 ACE 授予的访问权限都会累积。 例如,如果一个 ACE 授予对组的读取访问权限,而另一个 ACE 授予对作为该组成员的用户的写入访问权限,则用户可以同时拥有对 对象的读取和写入访问权限。
下图显示了这些安全信息块之间的关系:
1.3Dacl 和 Ace
如果 Windows 对象没有 (DACL) 的 自由访问控制列表,则系统允许每个人对其进行完全访问。 如果对象具有 DACL,系统只允许 (Ace) 的 访问控制项 显式允许的访问。 如果 DACL 中没有 Ace,则系统不允许任何人访问。 同样,如果 DACL 包含允许访问有限的一组用户或组的 Ace,则系统将隐式拒绝对 Ace 中未包含的所有受信者的访问。
在大多数情况下,你可以通过使用允许访问的 Ace 来控制对对象的访问。不需要显式拒绝对对象的访问。 例外情况是,ACE 允许访问组,而你希望拒绝对组成员的访问。 为此,请在组的访问允许的 ACE 前面的 DACL 中放置用户的 "拒绝访问" ACE。 请注意, ace 的顺序 非常重要,因为系统会按顺序读取 ace,直到授予或拒绝访问权限。 用户的 "拒绝访问" ACE 必须首先出现;否则,当系统读取组的 "允许的访问" ACE 时,它将向受限用户授予访问权限。
下图显示了拒绝访问一个用户并授予对两个组的访问权限的 DACL。 组 A 的成员可以通过累积允许对每个用户进行分组和权限的权限来获取读取、写入和执行访问权限。 例外情况是 Andrew 的,拒绝访问的 ACE (尽管是 Everyone 组的成员)拒绝了访问。
1.4AccessCheck 的工作原理
当线程尝试访问安全对象时,系统将授予或拒绝访问。 如果该对象没有 DACL (自由 访问控制) , 则系统会授予访问权限;否则, 系统会在对象的 DACL 中查找 (AES) 应用于线程的访问控制条目。 对象的 DACL 中的每个 ACE 都指定受信者(可以是用户帐户、组帐户或登录会话)允许或拒绝 的访问权限。
2、window 访问控制编辑器(Access Control Editor)
右键(文件、目录、程序)》选择属性》安全》高级 进入访问控制编辑器
2.1权限属性页
术语表
安全描述符(Security Descriptors)
MSDN说安全描述符包含了描述一个安对象的安全信息。如什么样的用户的什么访问请求可以被允许,什么样的用户或者组的什么访问要被拒绝。只是是大概上的。让我们具体看看安全描述符到底描述了哪些东西?
安全描述符包括:
1.与安全描述符关联的安全对象的拥有者的SID和此拥有者所在主群的SID
2.一个DACL(discretionary access control list)
3.一个SACL(system access control list)
4.和安全描述符意思相符的控制位集合
安全对象(Securable Objects)
具有安全描述符的对象就是安全对象。window上的安全对象有:NTFS 文件系统上的文件或目录\命名管道 匿名管道\进程 线程\文件映射对象\本地或远程打印机\网络共享
知识点:https://docs.microsoft.com/zh-cn/windows/win32/secauthz/securable-objects
Security Descriptor:安全描述符,被访问者持有安全描述符。
安全标识符(SID Security Identifiers)
SID是用来标识安全主体。就是给安全主体一个唯一的ID。用户层面通过用户账户名识别,程序和资源之间通过SID识别。
如何获取SID
1、获取windows 10操作系统的 SID,已经测试过,是有些的
1.简单点的:
System.Security.Principal.WindowsIdentity currentUser = System.Security.Principal.WindowsIdentity.GetCurrent();
string sid = currentUser.User.ToString();
2、cmd 命令行获取SID
安全主体(security principal)?
安全主体是任何可通过操作系统进行身份验证的实体,例如用户帐户、计算机帐户、在用户或计算机帐户的安全上下文中运行的线程或进程,或者这些帐户的安全组。 安全主体一直是控制对计算机中安全资源Windows的基础。 每个安全主体在操作系统中由 SID (唯一) 。
个人理解:不管是从本地还是远程 登入操作系统的的账户或程序都是安全主体
身份验证
身份验证是验证对象或人员身份的过程。 当你对某个对象进行身份验证时,目的就在于验证该对象是否为正版。 当你对某个用户进行身份验证时,其目标是验证该用户是否不是冒名顶替者。 因此,身份验证不能保证对资源的访问权限,也不能授权使用资源。
在网络环境中,身份验证是向网络应用程序或资源证明身份的行为。
个人理解:登入操纵系统、服务器、应用软件的过程就是身份验证的过程,登入成功就是验证成功。
计算机帐户:加入域服务器的计算机,在域服务器中会生成一个账户就叫计算机帐户
用户帐户:每个安全主体都分配有一个唯一标识符,它将在其整个生命周期内保留。 本地用户帐户和安全组是在本地计算机上创建的,它们可用于管理对该计算机上资源的访问权限。 本地用户帐户和安全组由本地计算机上安全帐户管理器 (SAM) 管理。
window内置的安全主体:
虽然内置安全主体有很多,但正常能在权限设置中使用到的并不多,所以下面仅说明其中几个较重要的:①Anonymous Logon:任何没有经过Windows XP验证程序(Authentication),而以匿名方式登录域的用户均属于此组;②Authenticated Users:与前项相反,所有经过Windows XP验证程序登录的用户均属于此组。设置权限和用户权力时,可考虑用此项代替Everyone组;④DIALUP:任何通过拨号网络登录的用户;⑤Everyone:指所有经验证登录的用户及来宾(Guest);⑥Network:任何通过网络登录的用户;⑦Interactive:指任何直接登录本机的用户;⑧Terminal server user:指任何通过终端服务登录的用户。
来源:百度百科
访问控制模型(DAC,MAC,RBAC,ABAC)
内容来源:https://blog.csdn.net/weixin_39638859/article/details/110464921
安全标识符如何工作
用户通过使用帐户名称来引用帐户,但操作系统内部指使用其安全标识符或 SID 在帐户的安全上下文中运行的帐户 (进程) 。 对于域帐户,安全主体的 SID 创建方法为:将域的 SID 与帐户的相对标识符相连接 (RID) 。 SID 在其作用域内是唯一 (或本地) ,并且永远不会重复使用。
创建帐户或组时,操作系统将生成标识特定帐户或组的 SID。 本地帐户或组的 SID 由计算机上本地安全机构 (LSA) 生成,并与其他帐户信息一起存储在注册表的安全区域中。 域帐户或组的 SID 由域安全机构生成,并作为 User 或 Group 对象的属性存储在 Active Directory 域服务中。
对于每个本地帐户和组,SID 对于创建它的计算机都是唯一的。 计算机上没有两个帐户或组共享同一 SID。 同样,对于每个域帐户和组,SID 在企业内都是唯一的。 这意味着,在一个域中创建的帐户或组的 SID 将永远不会与在企业内任何其他域中创建的帐户或组的 SID 匹配。
SID 始终保持唯一。 安全机构从不发出两次相同的 SID,并且从不对已删除的帐户重复使用 SID。 例如,如果某个用户在域中拥有用户帐户Windows离开工作,则管理员将删除其 Active Directory 帐户,包括标识该帐户的 SID。 如果稍后她回到同一公司的不同工作,则管理员将创建一个新帐户,Windows Server 操作系统将生成一个新的 SID。 新 SID 与旧 SID 不匹配;因此,用户不会从旧帐户访问任何帐户转移到新帐户。 她的两个帐户代表两个完全不同的安全主体。
安全标识符体系结构
安全标识符是二进制格式的数据结构,其中包含可变数量的值。 结构中的第一个值包含有关 SID 结构的信息。 剩余值按层次结构排列 (类似于电话号码) ,并标识 SID 颁发机构 (例如,"NT 颁发机构") 、SID 颁发域和特定的安全主体或组。 下图演示 SID 的结构。
下表介绍了 SID 的单个值。
下表介绍了 SID 的单个值。
评论 | 描述 |
---|---|
修订 | 指示特定 SID 中使用的 SID 结构的版本。 |
标识符颁发机构 | 标识可颁发特定类型安全主体的 SID 的最高级别颁发机构。 例如,Everyone 组的 SID 中的标识符颁发机构值为 1 (颁发机构) 。 特定服务器帐户或组的 SID 中的标识符Windows颁发机构值是 5 (NT authority) 。 |
Subauthorities | >在 SID 中保存最重要的信息,这些信息包含在一系列一个或多个子身份验证值中。 系列中最后一个值(不包括)的所有值共同标识企业中的域。 本系列的这一部分称为域标识符。 系列中的最后一个值(称为"RID (标识符) 标识与域相关的特定帐户或组。 |
当使用标准表示法将 SID 从二进制转换为字符串格式时,SID 的组件更易于可视化:
S-R-X-Y1-Y2-Yn-1-Yn
在此表示法中,SID 的组件表示如下表所示。
评论 | 描述 |
---|---|
S | 指示字符串是 SID |
R | 指示修订级别 |
X | 指示标识符颁发机构值 |
Y | 表示一系列子身份验证值,其中 n 是值的数量 |
SID 的最重要的信息包含在一系列子身份验证值中。 (-Y1-Y2-Yn-1) 是域标识符。 SID 的此元素在具有多个域的企业中变得十分重要,因为域标识符将一个域颁发的 SID 与企业中所有其他域颁发的 SID 相区分。 企业中没有任何两个域共享同一域标识符。
子身份验证值系列中的最后一 (-Yn) 是相对标识符。 它将一个帐户或组与域中的所有其他帐户和组区分。 任何域中没有两个帐户或组共享同一相对标识符。
例如,内置 SID 的 SID 管理员组以标准化 SID 表示法表示为以下字符串:
访问掩码格式
所有安全对象均使用下图中所示的 访问掩码 格式来排列其访问权限。
此格式的低序位16位用于特定于对象的访问权限,接下来的8位适用于适用于大多数对象类型的 标准访问权限,4个高序位用于指定 一般访问权限 ,每个对象类型都可以映射到一组标准和特定于对象的权限。 访问 _ 系统 _ 安全位对应于 访问对象的 SACL的权限。
访问控制列表(ACL:Access Control List)
ACL 中的每个 ACE 标识一个受信者,并指定该受信者访问规则。安全对象的安全描述符 可以包含两种类型的 ACL:DACL 和 SACL。
自由访问控制列表(DACL:Discretionary Access Control List)
就像它的名字一样,DACL就是一个表明其它所有人的自由的(相应的)访问控制列表。这是什么意思呢?让我们具体看看DACL里面是什么东西吧。看下图你就比较明白了。
Aa446683.accctrl1(en-us,VS.85).png
相信看了这个图能明白一大半。一个DACL是一个列表。
那么DACL是如何工作的?
系统将每个 ACE 中的受信者与线程的访问令牌 中标识的受 信者进行比较。通常,系统使用 请求 访问的线程的主访问令牌。 但是,如果线程正在模拟其他用户,则系统将使用线程的 模拟令牌。
系统会按顺序检查每个 ACE,直到发生以下事件之一:
- 拒绝访问的 ACE 显式拒绝对线程的访问令牌中列出的受信者之一的任何请求访问权限。
- 线程访问令牌中列出的受信者允许访问的一个或多个 AES 显式授予所有请求的访问权限。
- 已检查所有 AES,并且仍有至少一个请求的访问权限未显式允许,在这种情况下,将隐式拒绝访问。
这个链表的比较是顺序的,从头到尾。如果链表的顺序变了,或许原来访问请求的结果就样了。
例如将上图中ACE3和ACE1的顺序调换过来,Thread A的请求就会被允许。所以顺序很重要。所以如果要构建一个安全描述符的DACL的话,用API添加ACE的时候,程序员要谨慎处理。注意API函数添加ACE始终实在链表末尾添加的。
ACE继承没有完全研究,暂且搁浅!
系统访问控制列表(SACL:System Access Control List)
SACL其实就是一个审计中心,这个列表里面列举着哪些类型的访问请求需要被系统记录。一旦有用户访问一个安全对象,其请求的访问权限和SACL中的一个ACE符合,那么系统会记录这个用户的请求是被拒绝了还是被允许了。MSDN提及说,将来可能会实现安全对象会对未经授权的用户访问发出警告信息。个人理解:SACL的作用是记录访问成功与否,SACL也是由ACE构成,每条ACE的内容是某个用户访问成功/失败某个权限,当访问跟满足这条ACE的时候就会被记录下来。
访问控制项 (ACE :Access Control Entry )
一条ACE主要是四个方面
- 谁对你有权限
- 是允许还是拒绝
- 有什么权限
- 这个权限能不能被继承
相信看了这个图能明白一大半。每个ACE都是一个对某个SID的访问控制说明,描述这个SID是被拒绝还是被允许,如果允许的话,对这个SID给予什么权限。当然这个图很形象,但实际中ACE里面不是一个一个的字符串,这个ACE是怎么样的呢?
ACE其实由四部分组成,只是上面的图画的太好了。
这四部分分别是:
1.可能访问本ACE某个用户SID(对应Andrew)
2.该用户的访问权限的掩码(Read,write,execute)
3.ACE的类型,总共有三种。Access-denied ACE,Access-allowed ACE,System-audit ACE。前两种是DACL类型,最后一种是SACL类型。
4.这个ACE是否可以被其他安全对象继承。
C# 新建一个ACE 代码如下:
FileSecurity sonFileSecurity=sonFile2.GetAccessControl(); sonFileSecurity.AddAccessRule(new FileSystemAccessRule("HP", FileSystemRights.Modify, AccessControlType.Deny)); sonFile2.SetAccessControl(sonFileSecurity);
Access Tokens(访问令牌)
我们可以这样理解访问令牌,不过还是先把完整概念介绍一下。
访问令牌是包含12项,分别是:
- 当前用户的安全ID(稍后介绍),
- 当前用户所属组的安全ID。
- 当权会话安全ID。
- 用户所有的特权列表(包括用户本身,和其所属组)。
- 令牌拥有者安全ID。
- 用户所属主组群安全ID。
- 默认的自由访问控制列表(稍后介绍)。
- 源访问令牌
- 表明此令牌是源令牌还是模拟令牌
- 可选的链表,表明此令牌限制哪些SID
- 当前模拟令牌的级别
- 其他数据资料
看到这么多数据项,你该知道安全措施需要付出多大的代价了吧。
访问令牌描述了一个进程或线程的相关的安全信息。这些信息表明与这个进程或者线程关联的用户的标识符和特权。当用户登陆系统是,将用户密码和系统内数据库内的响应密码对比,如果验证通过,系统给用户产生一个访问令牌。以后这用户打开的所有线程都是继承与这个令牌。拿着这个令牌去访问安全对象。(Windows vista之后已经不一样了,如果是管理员登陆的话,管理员得到的访问令牌,和管理员启动的进行所拥有的令牌不一样,进程的令牌是被筛选的,或者说是降低权限的,进程要获得管理员的访问令牌(或者会所权限),就必须发出申请,系统显示一个对话框,是否允许这个程序以这种方式启动。)
每个进程至少有一个访问令牌,那就是主访问令牌,为什么是主呢?因为有些进程可能模拟另一个用户,并会或者另一个用户的令牌,而那个令牌就是模拟令牌。而系统在将进程的访问和安全对象进行审核是,使用的是主访问令牌。具体的暂且未知。
特权
特权是一个帐户(如用户或组帐户)在本地计算机上执行各种系统相关操作(如关闭系统、加载设备驱动程序或更改系统时间)的权限。特权与访问权限有两个不同之处:
特权控制对系统资源和系统相关任务的访问,而访问权限控制对安全对象的访问。
系统管理员为用户和组帐户分配特权,系统根据安全对象的DACL中的ACE授予的访问权限授予或拒绝对安全对象的访问。
相关单词列表:
principals:主体
subject:主体、主语
identifier:标识符 鉴定人
authority:专家 授权 官方
Access Control Model:访问控制模型=访问令牌+安全描述符
,访问者拥有访问令牌。用户成功登入操作系统后,操作系统将分配给访问者一个令牌,该令牌包含(用户SID和组SID、特权、其他)。
Security Descriptor:安全描述符,被访问者持有安全描述符。
访问者持有令牌,到被访问对象的门前叩门(用户双击) , 操作系统得到叩门的事件后,就将用户的访问令牌中的信息与对象的安全描述 (AES) 中的访问控制项进行比较。如果符合被访问对象安全描述,操作系统就同意访问者对被访问对象进行相应的操作(删除 、添加、移动、改名等)。
Authorization Rules:授权规则
AccessRule:访问规则
Access Token-访问令牌
SD:Security Descriptors 安全描述符:
LSA:Local Security Authority 计算机上本地安全机构
SID:Security Identifier 安全标识符。本地帐户或组的 SID 由计算机上本地安全机构 (LSA) 生成,并与其他帐户信息一起存储在注册表的安全区域中。 域帐户或组的 SID 由域安全机构生成,并作为 User 或 Group 对象的属性存储在 Active Directory 域服务中。
ACL :Access Control List 访问控制列表(DACL+SACL)
DACL:Discretionary Access Control List
SACL:System Access Control List
ACE:Access Control Entry 访问控制项
AES:Access Control Entries 访问控制项
SDDL:Security Descriptor Definition Language 安全描述符定义语言
SAM:Security Account Manager安全账户管理
identifier authority:标志符的颁发机构
security principal:安全主体
Windows NT
新技术视窗操作系统 wind10 也叫NT10
AccessControlType:访问控制类型 ,分为Allow(允许)+deny(拒绝)
FileSystem:文件系统,分为FAT32 和NTFS ,NTFS的优势是制裁单独权限管理和文件加密,NTFS权限有13种。
Window Station:对应一个Logon Session。一个Window Station管理一个剪贴板(Clipboard),一个原子表(Atom Table)和一组桌面(Desktop)。也就是说通过Window Station, 把不同的帐号进行隔离,防止他们相互影响
计算机帐户:域中账户 每台加入到域的计算机都有一个计算机帐户,它们位于活动目录中,可由管理员进行管理。
用户帐户:本机账户
安全主体(security principal):任何可通过操作系统进行身份验证的实体,例如用户帐户、计算机帐户、在用户或计算机帐户的安全上下文中运行的线程或进程。 每个安全主体都分配有一个唯一标识符,它将在其整个生命周期内保留。
C# 相应的类枚举和访问控制的对应
1、AccessControlSections 枚举 对应 访问控制的ACL
2、AccessControlModification 枚举 枚举 对应 访问控制的ACL的增加和删除的操作
3、FileSystemAccessRule类对应 访问控制的ACE