windows ACL、DACL、SACL、ACE

  • A+
所属分类:安全闲碎



参考文章:


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)


大概类似于这种形式



windows ACL、DACL、SACL、ACE




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


windows ACL、DACL、SACL、ACE





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

windows ACL、DACL、SACL、ACE


使用SACL对object进行监控



我们以监控单个文件为例




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

windows ACL、DACL、SACL、ACE




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


我们这里配置对C:Users123AppDataLocalTeptest_file.txt文件的读取行为进行监控

windows ACL、DACL、SACL、ACE


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.






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




windows ACL、DACL、SACL、ACE



上面我们只设置了监控文件的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 ACL、DACL、SACL、ACE



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

windows ACL、DACL、SACL、ACE




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


windows ACL、DACL、SACL、ACE



免责声明:本站提供安全工具、程序(方法)可能带有攻击性,仅供安全研究与教学之用,风险自负!

转载声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


订阅查看更多复现文章、学习笔记

thelostworld

安全路上,与你并肩前行!!!!

windows ACL、DACL、SACL、ACE

个人知乎:https://www.zhihu.com/people/fu-wei-43-69/columns

个人简书:https://www.jianshu.com/u/bf0e38a8d400

个人CSDN:https://blog.csdn.net/qq_37602797/category_10169006.html

个人博客园:https://www.cnblogs.com/thelostworld/

FREEBUF主页:https://www.freebuf.com/author/thelostworld?type=article

windows ACL、DACL、SACL、ACE

欢迎添加本公众号作者微信交流,添加时备注一下“公众号”

windows ACL、DACL、SACL、ACE


本文始发于微信公众号(thelostworld):windows ACL、DACL、SACL、ACE

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: