execve_hook/README.md

132 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# execve 拦截器
## 简介
本项目是一个通过动态链接库预加载 (LD\_PRELOAD) 方式实现的 `execve` 系统调用拦截器。它可以根据预定义的规则,在程序执行指定的命令时进行警告、阻止或记录操作。
**主要功能:**
* **命令拦截与告警:** 当执行配置中指定的命令时,可以显示警告信息并询问用户是否继续执行。
* **命令阻止:** 可以完全阻止执行配置中指定的命令。
* **参数匹配:** 支持基于命令参数进行更细粒度的规则匹配。
* **配置热加载:** 能够检测到配置文件修改并自动重新加载规则。
* **日志记录:** 记录所有通过 `execve` 执行的命令及其参数。
* **输出重定向与错误检测:** 将执行命令的标准输出和错误输出记录到日志文件,并能在检测到错误时发出提示。
* **仅拦截终端 Shell:** 默认只在终端 Shell (如 bash, zsh, fish, sh) 中拦截 `execve` 调用,避免影响其他程序。
* **功能开关:** 可以通过配置文件中的 `enabled` 字段全局启用或禁用拦截功能。
## 安装
1. **前提条件:**
* 安装 `gcc` 等编译工具。
* 安装 `json-c` 库 (开发版本)。在 Debian/Ubuntu 上可以使用 `sudo apt-get install libjson-c-dev` 安装,在 CentOS/RHEL 上可以使用 `sudo yum install json-c-devel` 安装。
2. **编译:**
```bash
gcc -shared -fPIC execve_interceptor.c -o execve_interceptor.so -ldl -ljson-c
```
* 确保你的代码文件名为 `execve_interceptor.c`
3. **创建配置和日志目录 (如果不存在):**
```bash
mkdir -p config logs
```
4. **创建配置文件:**
*`config` 目录下创建 `execve_rules.json` 文件,并按照以下格式配置规则:
```json
{
"enabled": true,
"rules": [
{
"cmd": "nvidia-smi",
"type": "warn",
"msg": "在沐曦环境下请执行mx-smi"
},
{
"cmd": "rm",
"type": "error",
"msg": "Error: rm command is forbidden"
},
{
"cmd": "pip",
"type": "warn",
"msg": "使用pip安装torch时请注意使用厂家支持版本",
"args": ["install", "torch"]
}
]
}
```
* `enabled`: 布尔值,用于启用或禁用整个拦截器功能。
* `rules`: 一个 JSON 数组,包含多个规则对象。
* `cmd`: 要拦截的命令名称。
* `type`: 拦截类型,可以是 `"warn"` (警告) 或 `"error"` (阻止)。
* `msg`: 当规则匹配时显示的消息。
* `args` (可选): 一个字符串数组,指定需要匹配的命令参数。只有当所有指定的参数都存在时,规则才匹配。
## 配置
* **`config/execve_rules.json`:** 这是主要的配置文件,用于定义拦截规则。你可以根据需要添加、修改或删除规则。
* **`logs/execve.log`:** 记录所有通过 `execve` 执行的命令及其参数。
* **`logs/execve_out.log`:** 记录被拦截命令的标准输出和错误输出。
## 使用
要使用该拦截器,你需要通过 `LD_PRELOAD` 环境变量在执行命令前加载编译好的动态链接库。
**示例:**
```bash
export LD_PRELOAD=$(pwd)/execve_interceptor.so
nvidia-smi
rm test.txt
pip install torch
```
## 前置依赖:
- jsonc
```bash
# Ubuntu/Debian
sudo apt-get install libjson-c-dev
# CentOS/RHEL
sudo yum install json-c-devel
```
## 编译:
- cd execve_hook && make
## 测试:
- ./test_bash.sh
## 配置文件格式:
```json
[
{
"cmd": "nvidia-smi", // 将匹配的命令
"type": "warn", // 如果为warn则会提示是否继续执行
"msg": "在沐曦环境下请执行mx-smi" // 提示信息
},
{
"cmd": "rm", // 匹配的命令
"type": "error", // 如果为error则会拦截命令执行
"msg": "Error: rm command is forbidden" // 提示信息
},
{
"cmd": "pip", // 匹配的命令
"type": "warn",
"msg": "使用pip安装torch时请注意使用厂家支持版本",
"args": ["install", "torch"] //当存在args则这里的参数必须全部存在
}
]
```