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使用多线程运行单元测试。要成功运行测试,必须执行以下操作:

  1. 打开具有提升权限/管理员命令提示符或PowerShell终端
  2. RUST_TEST_THREADS环境变量设置为1
  3. 运行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(())
}

最佳实践

  1. 修改权限前总是先读取现有ACL
  2. 谨慎处理系统关键对象的权限
  3. 测试权限修改在非生产环境
  4. 考虑使用事务性NTFS(TxF)进行关键操作
  5. 处理错误情况,特别是权限不足的情况

注意事项

  • 需要管理员权限才能修改某些系统对象的ACL
  • 不正确的权限设置可能导致安全漏洞或系统不稳定
  • 在修改ACL前备份原始权限是一个好习惯

windows-acl库为Windows平台提供了强大的ACL管理能力,使得Rust程序能够精细控制各种系统资源的访问权限。

回到顶部