介绍 windows-acl:在 Rust 中操作 ACL
访问控制列表(ACL)是 Microsoft Windows 安全模型的重要组成部分。除了控制对安全资源的访问外,它们还用于沙箱、事件审计和指定强制完整性级别。然而,以编程方式操作 ACL 极其痛苦,尤其是在 Rust 中。如今,帮助来了——我们发布了 windows-acl,这是一个简化 Windows 上访问控制列表操作的 Rust crate。
Windows ACL 的简要背景
Windows 有两种类型的 ACL:自主(DACL)和系统(SACL)。Windows 中的每个可安全对象(如文件、注册表项、事件等)都有一个关联的安全描述符,其中包含 DACL 和 SACL。
DACL 和 SACL 的区别在于所持有的条目类型。DACL 用于控制实体对资源的访问。例如,要拒绝用户读取注册表项,该注册表项的 DACL 需要包含该用户的访问拒绝条目。SACL 用于管理生成审计事件所需的操作类型,并在资源上设置强制完整性标签。例如,要审计用户组对特定文件的访问失败,该文件的 SACL 必须包含该用户组的审计条目。
当前操作 ACL 的方式
从现有 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 应用程序进行沙箱处理。为了使沙箱正确工作,我需要修改特定资源上的 ACL——在没有 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 的安全工具!