一、项目介绍
1.1 仓库地址
- GIT URL: https://github.com/Joe-zsc/April-AE.git
1.2 项目说明
- 用强化学习+动作嵌入(SBERT)训练“自治渗透测试”智能体,在大规模动作空间中学习高效的扫描/利用策略(对应论文 APRIL)。
我们应该看到的“结果” - 训练过程曲线与指标:奖励、成功率、步数、覆盖率等(TensorBoard 中查看)。
- 学到的渗透策略:给定环境,智能体能按更少步骤、更高成功率达成目标(成功利用/拿到 flag)。
- 最优动作序列(渗透路径):每回合的具体操作序列,可用于复现与报告。
训练后的结果“在哪里” - 训练日志与曲线:runs/(TensorBoard 可视化)。
- 动作向量缓存:actions/Action-/Embedding-.npy(只是加速用的缓存,不是训练产物)。
- 预训练文本嵌入模型(SBERT):NLP_Module/Embedding_models/…(onnx 是预训练模型导出,不是你的RL训练结果)。
- 强化学习策略权重(需要你显式保存):April-AE-actor.pt / critic_.pt 以及 statenorm.pt(保存到你指定目录,例如 log/checkpoints/)。
二、Docker镜像构建
2.1 准备工作
- requirements.txt调整
原来requirements中torch的版本是。annoy==1.17.3# numpy==1.19.5 这个版本要升级numpy==1.26.4#pandas==2.2.3 这个版本要升级pandas==2.3.1scikit_learn==1.4.1.post1sentence_transformers==2.5.1torch==2.5.1tqdm==4.66.2 - Linux安装软件包(windows需要单独安装git客户端)
sudoapt-getupdate&&sudoapt-getinstall-ygitgit-lfs&&gitlfsinstall - 下载模型
git拉取(linux和windows)
模型地址在https://huggingface.co/sentence-transformers/all-MiniLM-L12-v2/tree/main此处,但由于网络不稳定,只能下载到个人服务器中专一次。
如果网络允许,可以直接git拉取:gitclone https://huggingface.co/sentence-transformers/all-MiniLM-L12-v2\./NLP_Module/Embedding_models/all-MiniLM-L12-v2linux(git不能拉取的情况)
cdNLP_Module/Embedding_modelswgethttp://118.25.230.32:9000/all-MiniLM-L12-v2.tar.gztar-zxvfall-MiniLM-L12-v2.tar.gz ```Windows(git不能拉取的情况)
Windows直接通过浏览器下载http://118.25.230.32:9000/all-MiniLM-L12-v2.tar.gz该模型文件到April-AE/ 目录解压即可。
- 修改配置文件config.ini
修改NLP_Module\Embedding_models为NLP_Module/Embedding_models。[common] log_path = log actions_file = Action-1000 project_name = April-AE [Embedding] embedding_models=NLP_Module/Embedding_models sbert_model = all-MiniLM-L12-v2
2.2 制作Dockerfile
# 基础镜像 FROM python:3.11-slim # 防止 Python 缓冲标准输出/错误 ENV PYTHONUNBUFFERED=1 \ PIP_NO_CACHE_DIR=1 \ PYTHONDONTWRITEBYTECODE=1 # 切换 APT 源为国内镜像并安装系统依赖(兼容新旧 Debian,带重试与 fix-missing) ARG DEBIAN_MIRROR=https://mirrors.tuna.tsinghua.edu.cn/debian ARG DEBIAN_SECURITY_MIRROR=https://mirrors.tuna.tsinghua.edu.cn/debian-security RUN set -eux; \ if [ -f /etc/apt/sources.list ]; then \ sed -i "s|http://deb.debian.org/debian|${DEBIAN_MIRROR}|g; s|http://security.debian.org/debian-security|${DEBIAN_SECURITY_MIRROR}|g" /etc/apt/sources.list; \ elif [ -f /etc/apt/sources.list.d/debian.sources ]; then \ sed -i "s|URIs: http://deb.debian.org/debian|URIs: ${DEBIAN_MIRROR}|g" /etc/apt/sources.list.d/debian.sources || true; \ sed -i "s|URIs: http://security.debian.org/debian-security|URIs: ${DEBIAN_SECURITY_MIRROR}|g" /etc/apt/sources.list.d/debian.sources || true; \ else \ printf 'deb %s stable main contrib non-free non-free-firmware\n' "${DEBIAN_MIRROR}" > /etc/apt/sources.list; \ printf 'deb %s stable-updates main contrib non-free non-free-firmware\n' "${DEBIAN_MIRROR}" >> /etc/apt/sources.list; \ printf 'deb %s stable-security main contrib non-free non-free-firmware\n' "${DEBIAN_SECURITY_MIRROR}" >> /etc/apt/sources.list; \ fi; \ apt-get -o Acquire::Retries=5 update; \ apt-get install -y --no-install-recommends \ build-essential \ git \ curl \ ca-certificates \ || (apt-get -o Acquire::Retries=5 update --fix-missing && apt-get install -y --no-install-recommends build-essential git curl ca-certificates); \ rm -rf /var/lib/apt/lists/* # 工作目录 WORKDIR /app # 仅先拷贝 requirements 以利用分层缓存 COPY requirements.txt /app/requirements.txt # 使用官方 pip 命令安装 PyTorch(CPU 版本) # 注意:torchaudio 2.5.1 可能在某些索引中不可用,使用更宽松的版本约束 #RUN python -m pip install --upgrade pip \ # && pip install --no-cache-dir torch==2.5.1 torchvision==0.20.1 torchaudio==2.5.1 #--index-url https://download.pytorch.org/whl/cpu # 使用官方 pip 命令安装 PyTorch(GPU 版本) RUN python -m pip install --upgrade pip \ && pip install --no-cache-dir torch==2.5.1 torchvision==0.20.1 torchaudio==2.5.1 --index-url https://download.pytorch.org/whl/cu118 # 安装其他 Python 依赖(排除 torch 相关包) RUN awk '!/^torch==/' requirements.txt > /tmp/requirements.no_torch.txt \ && pip install --no-cache-dir -r /tmp/requirements.no_torch.txt \ && pip install --no-cache-dir tensorboard # 拷贝项目其余文件 COPY . /app # 为模型、日志与运行结果声明挂载点 VOLUME ["/app/NLP_Module/Embedding_models", "/app/log", "/app/runs"] # 暴露 README 中的 TensorBoard 端口 EXPOSE 6666 # 默认可配置参数 ARG ENV_FILE=single/env-CVE-2018-11776.json ARG AGENT=April-AE ARG GPU=-1 # 支持在运行时通过环境变量覆盖 ENV ENV_FILE=${ENV_FILE} \ AGENT=${AGENT} \ GPU=${GPU} # 启动命令:按 README 运行训练;在 Linux 中使用 POSIX 路径 CMD ["/bin/sh", "-lc", "python April.py --env_file \"$ENV_FILE\" --agent \"$AGENT\" --gpu \"$GPU\""]2.3 构建镜像
注意:需要把/home/kali换位实际的地址。
- linux版本
cd/home/kali/April-AEdockerbuild-tapril-ae:latest.# 或者# docker build -t april-ae:latest /home/kali/April-AE- Windows版本
cd D:/workspace/April-AE docker build -t april-ae:latest . # 或者 # docker build -t april-ae:latest D:/workspace/April-AE2.3 运行模型
- Linux版本
需要把/home/kali/改为实际的地址。dockerrun--rm-it\-v/home/kali/April-AE/NLP_Module/Embedding_models:/app/NLP_Module/Embedding_models\-v/home/kali/April-AE/log:/app/log\-v/home/kali/April-AE/runs:/app/runs\-eAGENT=April-AE\april-ae:latest
- Windows版本
docker run --rm -it -v D:/workspace/April-AE/NLP_Module/Embedding_models:/app/NLP_Module/Embedding_models -v D:/workspace/April-AE/log:/app/log -v D:/workspace/April-AE/runs:/app/runs -e AGENT=April-AE april-ae:latest
其他命令:
- 指定不同环境文件或 agent(保持 POSIX 路径)
dockerrun--rm-it\-vD:/workspace/April-AE/NLP_Module/Embedding_models:/app/NLP_Module/Embedding_models\-vD:/workspace/April-AE/log:/app/log\-vD:/workspace/April-AE/runs:/app/runs\-eENV_FILE=single/env-CVE-2019-9193.json\-eAGENT=April-AE\-eGPU=-1\--nameapril-ae\april-ae:latest- 启动 tensorboard(映射 6666 端口)
实时可视化(单独起一个 TensorBoard 容器,训练容器退出也能看历史),访问一定要改为:http://127.0.0.1:6006。
dockerrun--rm-it\-v/mnt/d/workspace/April-AE/runs:/app/runs\-p6006:6666\--entrypointbash\april-ae:latest-lc"tensorboard --logdir runs --host 0.0.0.0 --port 6666"dockerrun--rm-it-vd:\workspace\April-AE\runs:/app/runs-p6006:6666--entrypointbashapril-ae:latest-lc"tensorboard --logdir runs --host 0.0.0.0 --port 6666"- GPU 训练(推荐分离训练与可视化)
在wsl中,执行下面命令使用GPU加速。
dockerrun--rm-it--gpusall\-v/mnt/d/workspace/April-AE/NLP_Module/Embedding_models:/app/NLP_Module/Embedding_models\-v/mnt/d/workspace/April-AE/log:/app/log\-v/mnt/d/workspace/April-AE/runs:/app/runs\-eAGENT=April-AE\-eGPU=0\--nameapril-ae\april-ae:latest- 如果希望训练完容器不立即退出(不推荐,一般没必要)
- 前台常驻:在容器里追加一个阻塞命令
docker run --gpus all -d \ -v /mnt/d/workspace/April-AE/NLP_Module/Embedding_models:/app/NLP_Module/Embedding_models \ -v /mnt/d/workspace/April-AE/log:/app/log \ -v /mnt/d/workspace/April-AE/runs:/app/runs \ -e AGENT=April-AE -e GPU=0 \ --name april-ae-train-bg \ april-ae:latest \ bash -lc "python April.py --env_file \"$ENV_FILE\" --agent \"$AGENT\" --gpu \"$GPU\"; tail -f /dev/null" - 或者把 TensorBoard和训练同容器内并行跑(训练结束 tensorboard 仍在) docker run --gpus all -d \ -v /mnt/d/workspace/April-AE/NLP_Module/Embedding_models:/app/NLP_Module/Embedding_models \ -v /mnt/d/workspace/April-AE/log:/app/log \ -v /mnt/d/workspace/April-AE/runs:/app/runs \ -p 6666:6666 \ -e AGENT=April-AE -e GPU=0 \ --name april-ae-train-and-tb \ april-ae:latest \ bash -lc "python April.py --env_file \"$ENV_FILE\" --agent \"$AGENT\" --gpu \"$GPU\" & tensorboard --logdir runs --host 0.0.0.0 --port 6666; wait"三、使用方式
defload(self,path):ifself.use_state_norm:self.state_norm=Normalization(shape=StateEncoder.state_space# shape=StateEncoder.state_space, finetune=True)mean_checkpoint=path/f"state_norm_mean.pt"std_checkpoint=path/f"state_norm_std.pt"mean=torch.load(mean_checkpoint)std=torch.load(std_checkpoint)self.state_norm.running_ms.mean=mean self.state_norm.running_ms.std=std self.state_norm.running_ms.S=std*std self.Policy.load(path)self.is_loaded_agent=Truedockerrun--rm-it-vD:\workspace\April-AE\log:/app/log-vD:\workspace\April-AE\NLP_Module\Embedding_models:/app/NLP_Module/Embedding_models-eCKPT_TITLE="April-AE-Sep24_15-57-50-single/env-CVE-2019-9193"-eEVAL_ENV="single/env-CVE-2019-9193.json"--entrypointbashapril-ae:latest-lc"python evaluate.py"四、总结
- 训练
april-ae提供很多种场景(scenarios),在scenarios\single目录有很多配置项,我们这里是拿env-CVE-2019-9193.json这个场景为例训练的模型。如果需要训练其他场景,修改下面命令中ENV_FILE的值即可:
dockerrun--rm-it--gpusall-vD:/workspace/April-AE/NLP_Module/Embedding_models:/app/NLP_Module/Embedding_models-vD:/workspace/April-AE/log:/app/log-vD:/workspace/April-AE/runs:/app/runs-eENV_FILE=single/env-CVE-2019-9193.json-eAGENT=April-AE-eGPU=0--nameapril-ae april-ae:latest模型训练结束之后,在log/checkpoints目录下会生成模型结果,比如:
/April-AE-Sep24_15-57-50-single/April-AE-actor.pt /April-AE-Sep24_15-57-50-single/env-CVE-2019-9193/April-AE-critic_1.pt /April-AE-Sep24_15-57-50-single/env-CVE-2019-9193/April-AE-critic_2.pt /April-AE-Sep24_15-57-50-single/env-CVE-2019-9193/state_norm_mean.pt /April-AE-Sep24_15-57-50-single/env-CVE-2019-9193/state_norm_std.pt这些结果,我们会在模型评估中用到。
- 评估
模型评估阶段,我们会调用evaluate.py对模型结果做评估验证,传入的参数中,我们需要修改CKPT_TITLE的值为上面的/April-AE-Sep24_15-57-50-single/env-CVE-2019-9193文件夹的相对路径。EVAL_ENV的值为场景值,即与模型训练阶段的传值保持一致ingle/env-CVE-2019-9193.json。
dockerrun--rm-it-vD:\workspace\April-AE\log:/app/log-vD:\workspace\April-AE\NLP_Module\Embedding_models:/app/NLP_Module/Embedding_models-eCKPT_TITLE="April-AE-Sep24_15-57-50-single/env-CVE-2019-9193"-eEVAL_ENV="single/env-CVE-2019-9193.json"--entrypointbashapril-ae:latest-lc"python evaluate.py"运行后我们得到结果:
--Running April-AE agent-- eval_return=915, steps=6, success_rate=1.0