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能力已删除");
}
}
功能说明
capng::clear(Type)
- 清空指定类型(进程/线程)的所有能力capng::update(Action, Type, Cap)
- 添加/删除特定能力capng::apply(Type)
- 应用当前能力设置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),
}
}
代码说明
-
查询当前进程能力:
- 使用
Capabilities::get_current_process()
获取当前进程的能力集 - 分别打印有效(effective)、允许(permitted)和可继承(inheritable)能力集
- 使用
-
修改进程能力:
- 创建新的能力集并添加特定能力
- 使用
apply()
方法将修改应用到当前进程
-
管理文件能力:
- 使用
FileCapabilities
操作文件的能力集 - 可以读取和设置文件的能力
- 使用
-
临时提升权限:
- 保存原始能力集
- 临时添加所需能力并应用
- 执行特权操作后恢复原始能力
-
最小权限环境:
- 创建只包含必要能力的新能力集
- 应用到当前进程以实现最小权限原则
使用建议
- 在生产环境中使用时,应该添加更完善的错误处理
- 考虑将能力操作封装到特定模块中,集中管理权限
- 对于需要持久化能力设置的文件,确保文件系统支持扩展属性
- 测试时可以使用
capsh
工具验证能力设置是否生效
这个完整demo展示了capng库的主要功能,您可以根据实际需求调整或扩展其中的功能模块。