参考文章:
https://secureidentity.se/acl-dacl-sacl-and-the-ace/
其实windows ACL、DACL、SACL、ACE的关系很好解释
ACL分为两种,DACL和SACL,而DACL和SACL又由一个个的ACE构成
DACL主要用于设置用户以及用户组对安全对象的访问权限
SACL用于配置对安全对象的访问的审计(生成日志)
下面我们详细介绍
本文章会描述ACL是啥,以及其所有的组件以及他们是如何使用的
在windows中,你可以委派访问到不同的安全对象中,
安全对象拥有一个安全描述符(SD)
SD用于控制该对象的访问,它包含了对象所有者的信息,以及什么需要被审计和通过什么样的方式进行权限的允许
它包含了真正的用于设置安全权限的ACL,在AD中,所有的对象都具有DS
常见的安全对象如下:
- NTFS文件系统中的文件和文件夹
- 互动目录对象
- 注册表中的键
- 网络共享
- 本地或者远程打印机
- windows 服务
- 命名管道
- 匿名管道
- 进程
- 线程
- 文件映射对象
- 访问令牌
- windows管理对象(windows工作站或者桌面)
- 进程间同步对象(事件、互斥对象、信号量、可等待定时器)
- Job对象
- 分布式组件对象模型对象
现在我们知道了我们要保护的究竟都是些什东西之后,我来带大家彻底了解一下ACL以及其组件是如何在文件系统和AD中工作的
ACL ——access control list
ACL是一堆ACE的有序列表,他定义了应用到一个对象和对象属性的保护
每一个ACE标识一个安全实体,并指定了访问权限的集合,访问权限包括allowed、denied、audited
一个对象的SD一般包含两个ACL
- DACL 标志用户和用户组的allowed或者denied权限
- SACL 控制访问如何进行audited
当一个用户试图访问一个文件时,window系统会运行一个AccessCheck并对用户的access token和该文件的SD进行对比,然后评估该用户是否拥有相应的权限,拥有什么样的权限取决于ACE集合
DACL——Discretionary Access Control List
自主访问控制列表
DACL标志了用户和用户组所赋予的针对某个对象的权限
它包含了一个ACE对列表(Account + AccessRight)
大概类似于这种形式
SACL——System Access Control List
SACL使得监控对安全对象的访问变得可能
SACL中的ACE决定了决定了什么类型的访问会被记录到安全日志中
配合监控工具,如果有恶意用户试图访问安全对象,可以对管理员发起警报
这个在AD中将会很有用,恶意用户可能会在不经意中触发警报,以便管理员及时发现风险
另外,除了用在预防攻击上面,也可以作为一种防范意外情况的手段,如果发生了误操作,可以根据日志记录,来进行还原,
可以通过该日志用来进行access issues的trobleshoot
ACE——Access Control Entries
ACE是最终描述安全实体对安全对象的访问权限的东西
DACL和SACL会包含很多ACE
ACE包含如下访问控制信息:
- 用于标志用户或者用户组的SID
- 用于指定访问权限的access mask
- 一系列比特位(bit flag),这些比特位用于决定子对象是否集成父对象的ACE
- 一个标明ACE类型的flag
一共有两种ACE集合
Generic ACE
拥有以下几种类型
- 显式allow ACE
- 显式deny ACE
- generic deny ACE
- generic allow ACE
- inherited deny ACE
- inherited allow ACE
- Audit allow和deny ACE
Deny ACE的优先级总是高于Allow ACE
inherited deny ACE也是这样
但是如果你对子对象设置了一个explicit allow ACE(显式Allow ACE),那么子对象继承成来的ACE就不再起作用了,你设置的显式Allow ACE拥有更高的优先级
EXplicit Deny也拥有较高的优先级(相对于allow)
在windows系统中,对文件或者文件夹的访问权限是在NTFS文件系统中进行设置的
当一个用户尝试去访问一个文件或者文件夹的时候,该用户的access token就会和该文件的DACL进行对比,如果访问列表中的SID列表中没有任何一条和ACE中匹配,那么这个用户机会被explicit denied acces
如果有任何一条匹配的,就会按照如下规则就行权限的判定
- Explicit deny
- Explicit allow
- Inherited deny
- Inherited allow
Object-Specific ACE——特定对象的ACE
在AD中,有一种额外的ACE集合,叫做object-specific ACE
这两种ACE有着相同的特性,不同的是,object-specific能够提供更高级别的安全性(粒度)
object-specific ACE拥有以下几种类型
- object-specific deny ACE
‒拒绝访问Active Directory对象上的属性
‒拒绝访问Active Directory对象上的属性集
‒基于子对象的SID将ACE继承限制为指定类型的子对象
- object-specific allow ACE
同上,拒绝改为允许
- object-specific System-Audit ACE
‒ 对属性和属性集的访问进行记录,或者限制对特定类型子对象的继承
LSA评估ACL列表中的ACE的顺序为Explicit Deny、Explicit Allow、继承Deny、继承Allow
当一个用户试图访问AD中的一个对象时,LSA会获取用户的access token,安全子系统会拿用户的SID、所属用户组SID和访问对象的DACL中的ACE来判断权限是deny还是granted
找不到匹配的SID,则用户对该对象的访问会被拒绝
如果用户对AD中的对象有访问和更改权限,那么对该对象的更改会被审计,并会在安全日志中留下记录
可视化
为了可视化上面提到的所有东西,我会展示几张图片
我们以文件系统为例
下面是ACL、DACL和ACE在文件夹的安全选项卡中的典型形式:
点击高级(advanced)按钮,我们会获取到更多的选项,比如继承
使用SACL对object进行监控
我们以监控单个文件为例
我们在使用SACL对安全对象进行监控之前,需要先设置组策略启用audit object access
,这里我们设置的是对成功访问的审计(只对访问成功的事件进行记录)
然后在文件的安全选项卡中进行SACL的配置
我们这里配置对C:\Users\123\AppData\Local\Tep\test_file.txt
文件的读取行为进行监控
SACL配置完成之后可能会产生的日志
4656(S, F): A handle to an object was requested.
4658(S): The handle to an object was closed.
4660(S): An object was deleted.
4663(S): An attempt was made to access an object.
4664(S): An attempt was made to create a hard link.
4985(S): The state of a transaction has changed.
5051(-): A file was virtualized.
4670(S): Permissions on an object were changed.
用记事本打开该文件,可以查看到如下日志:
上面我们只设置了监控文件的read,但是此时如果我们使用python写个脚本去读取内容,是不会产生日志的
#!/usr/bin/env python
# Define a filename.
filename = "C:\\Users\\123\\AppData\\Local\\Temp\\test_file.txt"
# Open the file as f.
# The function readlines() reads the file.
with open(filename) as f:
content = f.readlines()
# Show the file contents line by line.
# We added the comma to print single newlines and not double newlines.
# This is because the lines contain the newline character '\n'.
for line in content:
print(line),
要想监控到,需要同时勾选上下面这个选项
此时再使用脚本读取该文件,就会产生日志
在windows AD中,SACL的用途以及选项会比工作组多很多,下面是一个OU的ACL相关的截图