Rust Windows ACL权限管理库windows-acl的使用:高效控制文件、目录和系统对象的访问权限
Rust Windows ACL权限管理库windows-acl的使用:高效控制文件、目录和系统对象的访问权限
windows-acl是一个简化Windows ACL操作的Rust库。
使用windows-acl
首先,在项目的Cargo.toml
文件中添加以下依赖项:
winapi = "0.3.5"
windows-acl = "0.1.0"
在主Rust源文件中,添加windows-acl外部crate并导入符号:
extern crate winapi;
extern crate windows_acl;
use winapi::um::winnt::{
PSID, FILE_GENERIC_READ, FILE_GENERIC_EXECUTE, FILE_GENERIC_WRITE,
FILE_ALL_ACCESS, SYSTEM_MANDATORY_LABEL_NO_WRITE_UP,
SYSTEM_MANDATORY_LABEL_NO_READ_UP, SYSTEM_MANDATORY_LABEL_NO_EXECUTE_UP
};
use windows_acl::acl::ACL;
注意: 修改系统ACL条目需要管理员权限或获得SeSecurityPrivilege
权限的能力。
完整示例代码
添加强制完整性标签
let high_integrity_level_sid = string_to_sid("S-1-16-12288").unwrap();
let mut acl = ACL::from_file_path("C:\\Users\\andy\\work\\high_il", true).unwrap();
// 设置high_il为高完整性级别目录
match acl.integrity_level(
high_integrity_level_sid.as_ptr() as PSID,
true,
SYSTEM_MANDATORY_LABEL_NO_WRITE_UP |
SYSTEM_MANDATORY_LABEL_NO_READ_UP |
SYSTEM_MANDATORY_LABEL_NO_EXECUTE_UP
) {
Ok(status) => {
if !status {
println!("We had an internal issue trying to add high integrity level to high_il");
}
},
Err(code) => {
println!("Failed to add high integrity level to high_il: error={}", code);
}
}
添加审计条目
let world_sid = string_to_sid("S-1-1-0").unwrap();
let mut aql = ACL::from_file_path("C:\\Users\\andy\\work\\sensitive_files", true).unwrap();
// 审计sensitive_files中Everyone组的所有文件操作
match acl.audit(
world_sid.as_ptr() as PSID,
true,
FILE_ALL_ACCESS,
true,
true
) {
Ok(status) => {
if !status {
println!("We had an internal issue trying to add audit entry to sensitive_files");
}
},
Err(code) => {
println!("Failed to add audit entry to sensitive_files: error={}", code);
}
}
拒绝访客访问目录
let guests = string_to_sid("S-1-5-32-546").unwrap();
let mut acl = ACL::from_file_path("C:\\Users\\andy\\work\\sensitive_files", false).unwrap();
// 访客无法读取此目录中的任何内容,但仍可以放置文件
match acl.deny(guests.as_ptr() as PSID, true, FILE_GENERIC_READ) {
Ok(status) => {
if !status {
println!("We had an internal issue trying to add a deny entry to sensitive_files");
}
},
Err(code) => {
println!("Failed to add deny entry: error={}", code);
}
}
移除条目
let world_sid = string_to_sid("S-1-1-0").unwrap();
let mut acl = ACL::from_file_path("C:\\Users\\andy\\work\\sensitive_files", true).unwrap();
// 移除SystemAudit条目;remove()也可以移除DACL条目
match acl.remove(world_sid.as_ptr() as PSID, Some(AceType::SystemAudit), None) {
Ok(removed) => {
println!("Removed {} entries", removed);
},
Err(code) => {
println!("Failed to remove entry: error={}", code);
}
}
单元测试
当前单元测试期望在具有提升权限的单线程环境中运行。默认情况下,Rust使用多线程运行单元测试。要成功运行测试,必须执行以下操作:
- 打开具有提升权限/管理员命令提示符或PowerShell终端
- 将
RUST_TEST_THREADS
环境变量设置为1 - 运行
cargo test
安装
在项目目录中运行以下Cargo命令:
cargo add windows-acl
或者在Cargo.toml中添加以下行:
windows-acl = "0.3.0"
许可证
MIT许可证
1 回复
Rust Windows ACL权限管理库windows-acl的使用指南
windows-acl
是一个Rust库,用于在Windows平台上管理访问控制列表(ACL),可以高效控制文件、目录和系统对象的访问权限。
基本介绍
windows-acl
库提供了对Windows安全描述符和ACL的高级抽象,允许开发者:
- 读取和修改文件、目录的权限
- 管理系统对象(如进程、服务等)的安全属性
- 添加/移除特定用户或组的访问权限
- 继承权限管理
安装
在Cargo.toml中添加依赖:
[dependencies]
windows-acl = "0.3"
基本用法示例
1. 获取文件ACL
use windows_acl::acl::ACL;
use windows_acl::helper::string_to_sid;
let path = "C:\\example.txt";
let acl = ACL::from_file_path(path, false).unwrap();
println!("ACL for {}: {:?}", path, acl);
2. 修改文件权限
use windows_acl::acl::ACL;
use windows_acl::helper::string_to_sid;
let path = "C:\\example.txt";
let mut acl = ACL::from_file_path(path, false).unwrap();
// 添加用户权限
let user_sid = string_to_sid("S-1-5-21-3623811015-3361044348-30300820-1013").unwrap();
acl.allow(user_sid, 0x1F01FF /* 完全控制 */, 0, true)
.unwrap();
// 应用到文件
acl.apply_to_file_path(path, false).unwrap();
3. 管理目录权限
use windows_acl::acl::ACL;
use windows_acl::helper::string_to_sid;
let dir_path = "C:\\example_dir";
let mut acl = ACL::from_file_path(dir_path, true).unwrap();
// 移除Everyone组的权限
let everyone_sid = string_to_sid("S-1-1-0").unwrap();
acl.revoke(everyone_sid, 0, true).unwrap();
// 应用到目录
acl.apply_to_file_path(dir_path, true).unwrap();
高级功能
1. 权限掩码
常用权限掩码:
0x1F01FF
- 完全控制0x1200A9
- 读取和执行0x120089
- 读取0x10000
- 删除
2. 处理继承权限
// 禁用继承并复制现有权限
let mut acl = ACL::from_file_path(path, false).unwrap();
acl.set_inheritance(false, true).unwrap();
acl.apply_to_file_path(path, false).unwrap();
3. 系统对象权限
use windows_acl::acl::ACL;
use windows_acl::helper::string_to_sid;
// 获取进程的安全描述符
let process_id = 1234; // 目标进程ID
let mut acl = ACL::from_process(process_id).unwrap();
// 修改权限
let user_sid = string_to_sid("S-1-5-21-3623811015-3361044348-30300820-1013").unwrap();
acl.allow(user_sid, 0x1000 /* PROCESS_QUERY_INFORMATION */, 0, true)
.unwrap();
// 应用修改
acl.apply_to_process(process_id).unwrap();
完整示例代码
下面是一个完整的使用示例,展示了如何创建一个文件、设置ACL权限,然后验证权限:
use std::fs::File;
use windows_acl::acl::ACL;
use windows_acl::helper::string_to_sid;
fn main() -> Result<(), Box<dyn std::error::Error>> {
// 1. 创建测试文件
let path = "test_file.txt";
File::create(path)?;
println!("创建测试文件: {}", path);
// 2. 获取文件ACL
let mut acl = ACL::from_file_path(path, false)?;
println!("原始ACL: {:?}", acl);
// 3. 添加当前用户完全控制权限
let current_user = whoami::username(); // 需要添加whoami依赖
let user_sid = string_to_sid(¤t_user)?;
acl.allow(user_sid, 0x1F01FF /* 完全控制 */, 0, true)?;
// 4. 移除Everyone组权限
let everyone_sid = string_to_sid("S-1-1-0")?;
acl.revoke(everyone_sid, 0, true)?;
// 5. 应用修改后的ACL
acl.apply_to_file_path(path, false)?;
println!("已更新文件ACL");
// 6. 验证新ACL
let updated_acl = ACL::from_file_path(path, false)?;
println!("更新后的ACL: {:?}", updated_acl);
// 7. 清理测试文件
std::fs::remove_file(path)?;
println!("已删除测试文件");
Ok(())
}
最佳实践
- 修改权限前总是先读取现有ACL
- 谨慎处理系统关键对象的权限
- 测试权限修改在非生产环境
- 考虑使用事务性NTFS(TxF)进行关键操作
- 处理错误情况,特别是权限不足的情况
注意事项
- 需要管理员权限才能修改某些系统对象的ACL
- 不正确的权限设置可能导致安全漏洞或系统不稳定
- 在修改ACL前备份原始权限是一个好习惯
windows-acl
库为Windows平台提供了强大的ACL管理能力,使得Rust程序能够精细控制各种系统资源的访问权限。