Rust Linux能力控制库capng的使用:高效管理进程权限与安全能力

Rust Linux能力控制库capng的使用:高效管理进程权限与安全能力

capng是libcap-ng的Rust封装库,用于高效管理Linux进程的权限和安全能力。

许可证

该项目采用以下两种许可证之一:

  • Apache License, Version 2.0
  • BSD-3-Clause License

安装

在项目目录中运行以下Cargo命令:

cargo add capng

或者在Cargo.toml中添加:

capng = "0.2.3"

示例代码

以下是一个完整的capng使用示例,展示如何管理进程权限:

use capng::{Cap, Action, Set, Type};

fn main() {
    // 清空当前线程的所有能力
    capng::clear(Type::Thread);
    
    // 添加NET_ADMIN能力
    capng::update(
        Action::Add,  // 添加能力
        Type::Thread, // 作用于当前线程
        Cap::NET_ADMIN // 网络管理能力
    );
    
    // 将能力应用到当前线程
    if let Err(e) = capng::apply(Type::Thread) {
        eprintln!("Failed to apply capabilities: {}", e);
        return;
    }
    
    // 检查当前线程是否具有NET_ADMIN能力
    if capng::have_capability(Type::Thread, Cap::NET_ADMIN) {
        println!("Current thread has NET_ADMIN capability");
    } else {
        println!("Current thread does NOT have NET_ADMIN capability");
    }
    
    // 获取当前线程的所有能力
    let mut caps = vec![];
    for cap in Cap::iter() {
        if capng::have_capability(Type::Thread, cap) {
            caps.push(cap);
        }
    }
    
    println!("Current thread capabilities: {:?}", caps);
}

完整示例demo

以下是一个更完整的capng使用示例,展示如何管理进程权限:

use capng::{Cap, Action, Type};

fn main() {
    // 示例1: 查看当前线程的所有能力
    println!("=== 初始线程能力 ===");
    print_current_capabilities();
    
    // 示例2: 清空并添加新能力
    println!("=== 修改线程能力 ===");
    modify_capabilities();
    
    // 示例3: 尝试删除不存在的权限
    println!("=== 删除不存在的权限 ===");
    remove_nonexistent_capability();
}

fn print_current_capabilities() {
    let mut caps = vec![];
    for cap in Cap::iter() {
        if capng::have_capability(Type::Thread, cap) {
            caps.push(cap);
        }
    }
    println!("当前线程能力: {:?}", caps);
}

fn modify_capabilities() {
    // 清空当前线程的所有能力
    capng::clear(Type::Thread);
    
    // 添加NET_ADMIN和NET_RAW能力
    for &cap in &[Cap::NET_ADMIN, Cap::NET_RAW] {
        capng::update(Action::Add, Type::Thread, cap);
    }
    
    // 应用能力设置
    if let Err(e) = capng::apply(Type::Thread) {
        eprintln!("应用能力失败: {}", e);
        return;
    }
    
    println!("已添加 NET_ADMIN 和 NET_RAW 能力");
    print_current_capabilities();
    
    // 删除NET_RAW能力
    capng::update(Action::Drop, Type::Thread, Cap::NET_RAW);
    if let Err(e) = capng::apply(Type::Thread) {
        eprintln!("应用能力失败: {}", e);
        return;
    }
    
    println!("已删除 NET_RAW 能力");
    print_current_capabilities();
}

fn remove_nonexistent_capability() {
    // 尝试删除不存在的SYS_ADMIN能力
    capng::update(Action::Drop, Type::Thread, Cap::SYS_ADMIN);
    if let Err(e) = capng::apply(Type::Thread) {
        eprintln!("错误: {}", e);
    } else {
        println!("SYS_ADMIN能力已删除");
    }
}

功能说明

  1. capng::clear(Type) - 清空指定类型(进程/线程)的所有能力
  2. capng::update(Action, Type, Cap) - 添加/删除特定能力
  3. capng::apply(Type) - 应用当前能力设置
  4. capng::have_capability(Type, Cap) - 检查是否拥有特定能力

所有者

  • Sergio López (slp)

1 回复

Rust Linux能力控制库capng的使用:高效管理进程权限与安全能力

完整示例demo

以下是基于内容中提供的示例代码整合的一个完整demo,展示了capng库的主要功能:

use capng::{Capabilities, FileCapabilities, Cap};

fn main() {
    // 示例1:查询当前进程能力
    query_current_capabilities();
    
    // 示例2:修改进程能力
    modify_process_capabilities();
    
    // 示例3:管理文件能力
    manage_file_capabilities("/tmp/sample_executable");
    
    // 示例4:临时提升权限执行操作
    temporary_privilege_escalation();
    
    // 示例5:创建最小权限环境
    minimal_privilege_environment();
}

fn query_current_capabilities() {
    println!("\n=== 查询当前进程能力 ===");
    match Capabilities::get_current_process() {
        Ok(caps) => {
            println!("Effective capabilities: {:?}", caps.effective());
            println!("Permitted capabilities: {:?}", caps.permitted());
            println!("Inheritable capabilities: {:?}", caps.inheritable());
        }
        Err(e) => eprintln!("查询能力失败: {}", e),
    }
}

fn modify_process_capabilities() {
    println!("\n=== 修改进程能力 ===");
    let mut caps = Capabilities::new();
    
    // 添加网络绑定服务和修改文件所有者能力
    caps.add(Cap::NET_BIND_SERVICE);
    caps.add(Cap::CHOWN);
    
    // 应用到当前进程
    if let Err(e) = caps.apply() {
        eprintln!("应用能力失败: {}", e);
    } else {
        println!("成功添加 NET_BIND_SERVICE 和 CHOWN 能力");
    }
}

fn manage_file_capabilities(path: &str) {
    println!("\n=== 管理文件能力 ===");
    
    // 设置文件能力
    let mut file_caps = FileCapabilities::new();
    file_caps.add_effective(Cap::NET_ADMIN);
    file_caps.add_permitted(Cap::NET_ADMIN);
    
    match file_caps.write(path) {
        Ok(_) => println!("成功设置文件能力: {}", path),
        Err(e) => eprintln!("设置文件能力失败: {}", e),
    }
    
    // 读取文件能力
    match FileCapabilities::read(path) {
        Ok(caps) => println!("文件能力: {:?}", caps),
        Err(e) => eprintln!("读取文件能力失败: {}", e),
    }
}

fn temporary_privilege_escalation() {
    println!("\n=== 临时提升权限 ===");
    
    // 保存原始能力
    let original_caps = match Capabilities::get_current_process() {
        Ok(caps) => caps,
        Err(e) => {
            eprintln!("获取当前能力失败: {}", e);
            return;
        }
    };
    
    // 临时添加能力
    let mut temp_caps = original_caps.clone();
    temp_caps.add(Cap::DAC_OVERRIDE);
    
    // 应用临时能力
    if let Err(e) = temp_caps.apply() {
        eprintln!("应用临时能力失败: {}", e);
        return;
    }
    
    println!("临时拥有 DAC_OVERRIDE 能力,执行特权操作...");
    
    // 恢复原始能力
    if let Err(e) = original_caps.apply() {
        eprintln!("恢复原始能力失败: {}", e);
    } else {
        println!("成功恢复原始能力");
    }
}

fn minimal_privilege_environment() {
    println!("\n=== 创建最小权限环境 ===");
    
    let mut caps = Capabilities::new();
    caps.add(Cap::NET_BIND_SERVICE);
    
    match caps.apply() {
        Ok(_) => println!("现在进程只有 NET_BIND_SERVICE 能力"),
        Err(e) => eprintln!("创建最小权限环境失败: {}", e),
    }
}

代码说明

  1. 查询当前进程能力

    • 使用Capabilities::get_current_process()获取当前进程的能力集
    • 分别打印有效(effective)、允许(permitted)和可继承(inheritable)能力集
  2. 修改进程能力

    • 创建新的能力集并添加特定能力
    • 使用apply()方法将修改应用到当前进程
  3. 管理文件能力

    • 使用FileCapabilities操作文件的能力集
    • 可以读取和设置文件的能力
  4. 临时提升权限

    • 保存原始能力集
    • 临时添加所需能力并应用
    • 执行特权操作后恢复原始能力
  5. 最小权限环境

    • 创建只包含必要能力的新能力集
    • 应用到当前进程以实现最小权限原则

使用建议

  1. 在生产环境中使用时,应该添加更完善的错误处理
  2. 考虑将能力操作封装到特定模块中,集中管理权限
  3. 对于需要持久化能力设置的文件,确保文件系统支持扩展属性
  4. 测试时可以使用capsh工具验证能力设置是否生效

这个完整demo展示了capng库的主要功能,您可以根据实际需求调整或扩展其中的功能模块。

回到顶部