介绍windows-acl:在Rust中操作ACL
访问控制列表(ACLs)是Microsoft Windows安全模型的核心组成部分。除了控制对安全资源的访问外,它们还用于沙箱、事件审计和指定强制完整性级别。然而,以编程方式操作ACLs非常困难,尤其是在Rust中。今天我们发布了windows-acl,这是一个简化Windows上访问控制列表操作的Rust crate。
Windows ACLs简要背景
Windows有两种类型的ACLs:自主访问控制列表(DACL)和系统访问控制列表(SACL)。Windows中的每个安全对象(如文件、注册表项、事件等)都有一个关联的安全描述符,其中包含DACL和SACL。
DACL和SACL的区别在于所包含的条目类型。DACL用于控制实体对资源的访问。例如,要拒绝用户读取注册表项,该注册表项的DACL需要包含该用户的访问拒绝条目。SACL用于管理生成审计事件所需的操作类型,并为资源设置强制完整性标签。例如,要审计用户组对特定文件的访问失败,该文件的SACL必须包含该用户组的审计条目。
当前操作ACLs的方式
从现有ACL添加和删除ACL条目需要创建新的ACL。删除过程相对简单——复制除要删除的目标外的所有现有ACL条目。对于自主访问控制列表,插入过程稍微困难一些。DACL允许用户的访问权限取决于DACL中ACE的顺序。在首选位置正确插入新的访问控制条目(ACE)是开发人员的责任。此外,新的DACL必须确保要插入的ACE与现有ACE条目没有冲突。例如,如果现有DACL具有具有读/写权限的用户的访问允许条目,而要添加的ACE是具有只读权限的用户的访问允许条目,则不得将现有条目复制到新的DACL中。没有人愿意处理这种复杂性,尤其是在Rust中。
windows-acl如何简化任务
让我们看一下appjaillauncher-rs来演示windows-acl的简单性。去年,我将原始的C++ AppJailLauncher移植到了Rust。appjaillauncher-rs使用AppContainers对Windows应用程序进行沙箱处理。为了使沙箱正确工作,我需要修改特定资源上的ACLs——在没有Active Template Library类(参见CDacl和CSacl)、.NET框架或PowerShell的帮助的情况下,这是一项艰巨的任务。我最终得到了一个既不完美又复杂的解决方案。在实现windows-acl之后,我回过头来更新了appjaillauncher-rs以使用windows-acl。通过windows-acl,我有了一个处理Windows ACL编程困难的模块化库。它提供了一个简化添加和删除DACL和SACL条目操作的接口。
例如,添加DACL访问允许条目需要以下代码:
|
|
同样,删除DACL访问允许条目:
|
|
windows-acl的潜在应用和未来工作
windows-acl crate为使用Rust编写Windows安全工具开辟了新的可能性。操作SACL的能力使我们能够充分利用Windows事件审计引擎的功能。Windows事件审计引擎在提供检测终端妥协信息方面起着重要作用。我们希望这项工作能为Windows Rust开发者社区做出贡献,并激发更多基于Rust的安全工具的创建!