返回
顶部

参考文章:

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)

大概类似于这种形式

1610014139219

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在文件夹的安全选项卡中的典型形式:

1610013978417

点击高级(advanced)按钮,我们会获取到更多的选项,比如继承

1610014062110

使用SACL对object进行监控

我们以监控单个文件为例

我们在使用SACL对安全对象进行监控之前,需要先设置组策略启用audit object access,这里我们设置的是对成功访问的审计(只对访问成功的事件进行记录)

1610012809927

然后在文件的安全选项卡中进行SACL的配置

我们这里配置对C:\Users\123\AppData\Local\Tep\test_file.txt文件的读取行为进行监控

1610013012152

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.

用记事本打开该文件,可以查看到如下日志:

1610013245325

上面我们只设置了监控文件的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),

要想监控到,需要同时勾选上下面这个选项

1610013551951

此时再使用脚本读取该文件,就会产生日志

1610013621359

在windows AD中,SACL的用途以及选项会比工作组多很多,下面是一个OU的ACL相关的截图

1610014712881