OrLev-Ari/llm-security-platform-backend-containers
GitHub: OrLev-Ari/llm-security-platform-backend-containers
该项目提供了一套在 AWS EC2 上通过 Docker 自动化部署 LLM 安全平台后端所有容器服务的完整方案与脚本。
Stars: 0 | Forks: 0
# EC2 部署指南
## 快速入门概述
本指南将引导您在 AWS EC2 上部署 LLM Security Platform。该过程包括:
1. **创建 EC2 实例**并满足所需配置
2. **安装前置条件**(Docker、AWS CLI、Git)
3. **配置 AWS 凭证**和权限
4. **克隆代码库**到 EC2 实例
5. **运行自动化部署脚本**以启动所有服务
## 第 1 步:创建 EC2 实例
### 实例规格
- **实例类型**:`m7i-flex.large`(或更大规格)
- **最低内存**:**8GB**(适用于默认的 Llama-3.2-1B 模型)或 **16GB+**(适用于推荐的 Ministral-8B)
- **操作系统**:Amazon Linux 2023 或 Ubuntu 22.04 LTS
- **存储**:至少 20GB EBS 卷
- **安全组**:允许来自您的 IP 的入站 SSH(端口 22)
### IAM 角色设置(推荐)
如果您使用过 llm-security-platform-backend 代码库,您的账户中应该已经部署了名为 EC2LLMPlatformSecurityInstanceProfile 的角色。
如果没有,请创建一个具有以下权限的 IAM 角色并将其附加到您的 EC2 实例中:
**所需权限:**
- `ssm:GetParameter` - 用于从 Parameter Store 获取 HuggingFace token
- `sqs:GetQueueUrl` - 用于获取 SQS 队列 URL
- `dynamodb:GetItem`、`dynamodb:PutItem`、`dynamodb:UpdateItem`、`dynamodb:Query` - 用于访问 DynamoDB 表
**IAM 策略示例:**
```
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ssm:GetParameter"
],
"Resource": "arn:aws:ssm:us-east-1:*:parameter/llmplatformsecurity/hftoken"
},
{
"Effect": "Allow",
"Action": [
"sqs:GetQueueUrl",
"sqs:ReceiveMessage",
"sqs:DeleteMessage"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"dynamodb:GetItem",
"dynamodb:PutItem",
"dynamodb:UpdateItem",
"dynamodb:Query"
],
"Resource": [
"arn:aws:dynamodb:us-east-1:*:table/PromptsTable",
"arn:aws:dynamodb:us-east-1:*:table/ChallengeSessionsTable",
"arn:aws:dynamodb:us-east-1:*:table/ChallengesTable"
]
}
]
}
```
### 启动实例
```
# 使用 AWS CLI 的示例
aws ec2 run-instances \
--image-id ami-xxxxxxxx \
--instance-type m7i-flex.large \
--iam-instance-profile Name=YourIAMRoleName \
--key-name YourKeyPair \
--security-group-ids sg-xxxxxxxx \
--block-device-mappings '[{"DeviceName":"/dev/xvda","Ebs":{"VolumeSize":50}}]'
```
或者使用 AWS 控制台手动启动实例。
## 第 2 步:连接到 EC2 实例
通过 SSH 连接到您新创建的实例:
```
ssh -i /path/to/your-key.pem ec2-user@
```
对于 Ubuntu 实例,请改用 `ubuntu@`。
## 第 3 步:安装前置条件
### 更新系统软件包
**Amazon Linux 2023:**
```
sudo yum update -y
```
**Ubuntu:**
```
sudo apt update && sudo apt upgrade -y
```
### 安装 Docker
**Amazon Linux 2023:**
```
sudo yum install -y docker
sudo systemctl start docker
sudo systemctl enable docker
sudo usermod -a -G docker ec2-user
```
**Ubuntu:**
```
sudo apt install -y docker.io
sudo systemctl start docker
sudo systemctl enable docker
sudo usermod -a -G docker ubuntu
```
**注销并重新登录**以使组成员身份生效:
```
exit
# 通过 SSH 重新登录
ssh -i /path/to/your-key.pem ec2-user@
```
验证 Docker 安装:
```
docker --version
docker ps # Should work without sudo
```
### 安装 Docker Compose
```
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
```
### 安装 Git
**Amazon Linux 2023:**
```
sudo yum install -y git
```
**Ubuntu:**
```
sudo apt install -y git
```
### 安装/验证 AWS CLI
Amazon Linux 上已预装 AWS CLI。如需在 Ubuntu 上安装或更新:
```
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
sudo apt install unzip -y
unzip awscliv2.zip
sudo ./aws/install
aws --version
```
## 第 4 步:配置 AWS 凭证
### 选项 1:IAM 角色(推荐)
如果您在创建期间已将 IAM 角色附加到您的 EC2 实例,请验证其是否有效:
```
aws sts get-caller-identity
```
您应该会看到您的实例角色信息。**无需进行额外配置。**
### 选项 2:手动配置凭证
如果不使用 IAM 角色,请配置 AWS 凭证:
```
aws configure
```
输入:
- AWS Access Key ID
- AWS Secret Access Key
- 默认区域:`us-east-1`
- 默认输出格式:`json`
## 第 5 步:在 SSM 中设置 HuggingFace Token
系统需要存储在 AWS Systems Manager Parameter Store 中的 HuggingFace token。
### 创建 SSM 参数
**从您的本地计算机**(需具有相应的 AWS 权限):
```
aws ssm put-parameter \
--name "/llmplatformsecurity/hftoken" \
--value "YOUR_HUGGINGFACE_TOKEN" \
--type "SecureString" \
--region us-east-1
```
将 `YOUR_HUGGINGFACE_TOKEN` 替换为您实际的 HuggingFace token(从 https://huggingface.co/settings/tokens 获取)。
### 验证参数是否存在
从 EC2 实例中执行:
```
aws ssm get-parameter \
--name /llmplatformsecurity/hftoken \
--with-decryption \
--query Parameter.Value \
--output text
```
## 第 6 步:克隆代码库
```
cd ~
git clone https://github.com/OrLev-Ari/llm-security-platform-backend-containers.git
cd llm-security-platform-backend-containers
```
## 第 7 步:将 GGUF 模型复制到 EC2
**重要:** 代码库中不包含 GGUF 模型文件,必须单独复制。
### 从您的本地计算机
模型容器需要位于 `containers/model/models/qwen2.5-0.5b-instruct-q3_k_m.gguf` 的 GGUF 模型文件。(当然,您可以将其切换为其他模型)
**使用 SCP 复制模型文件:**
```
# 从您的本地机器(相应地替换路径和 IP)
scp -i /path/to/your-key.pem \
/path/to/qwen2.5-0.5b-instruct-q3_k_m.gguf \
ec2-user@:~/llm-security-platform-backend-containers/containers/model/models/
```
**对于 Ubuntu 实例**,请将 `ec2-user` 替换为 `ubuntu`。
**替代方案** - 如果您需要先创建目录:
```
# 通过 SSH 登录 EC2
ssh -i /path/to/your-key.pem ec2-user@
# 创建 models 目录
mkdir -p ~/llm-security-platform-backend-containers/containers/model/models
# 退出并从本地机器复制
exit
# 复制该文件
scp -i /path/to/your-key.pem \
/path/to/qwen2.5-0.5b-instruct-q3_k_m.gguf \
ec2-user@:~/llm-security-platform-backend-containers/containers/model/models/
```
**验证文件是否已复制:**
```
# 通过 SSH 重新登录 EC2
ssh -i /path/to/your-key.pem ec2-user@
# 检查文件是否存在
ls -lh ~/llm-security-platform-backend-containers/containers/model/models/
```
您应该会看到列出的 GGUF 文件。
## 第 8 步:运行部署脚本
现在您已经准备好进行部署了!
```
cd EC2
chmod +x deploy.sh
./deploy.sh
```
### 脚本的功能
部署脚本会自动执行以下操作:
1. ✓ 验证 AWS 凭证是否已配置
2. ✓ 从 SSM Parameter Store 获取 HuggingFace token (`/llmplatformsecurity/hftoken`)
3. ✓ 使用 AWS CLI 获取 SQS 队列 URL
4. ✓ 导出环境变量(`HF_TOKEN`、`QUEUE_URL`、`AWS_REGION`)
5. ✓ 导航至 `containers/` 目录
6. ✓ 运行 `docker-compose up -d --build` 启动所有服务
如果任何步骤失败,脚本将**快速失败**并显示清晰的错误消息。
### 预期输出
```
==========================================
LLM Security Platform Deployment Script
==========================================
[1/5] Verifying AWS credentials...
✓ AWS credentials verified
[2/5] Fetching HuggingFace token from SSM...
✓ HuggingFace token retrieved
[3/5] Fetching SQS queue URL...
✓ SQS queue URL retrieved: https://sqs.us-east-1.amazonaws.com/...
[4/5] Setting AWS region...
✓ AWS region set to: us-east-1
[5/5] Starting Docker containers...
Creating network "containers_default" ...
Building model...
Building verifier...
Building worker...
...
✓ Deployment successful!
==========================================
```
## 第 9 步:验证部署
### 检查运行中的容器
```
cd ~/llm-security-platform-backend-containers/containers
docker ps
```
您应该会看到三个正在运行的容器:
- `model`(端口 8000)
- `verifier`(端口 9000)
- `worker`(后台)
### 查看日志
```
docker-compose logs -f
```
按下 `Ctrl+C` 退出日志。
### 测试模型 API
```
curl -X POST http://localhost:8000/generate \
-H "Content-Type: application/json" \
-d '{"prompt": "Hello, how are you?"}'
```
## 管理部署
### 停止服务
```
cd ~/llm-security-platform-backend-containers/containers
docker-compose down
```
### 重启服务
```
docker-compose up -d
```
### 代码更改后重新构建
```
docker-compose up -d --build
```
### 查看单个容器日志
```
docker-compose logs -f model
docker-compose logs -f verifier
docker-compose logs -f worker
```
## 手动部署(替代方案)
如果您不想使用自动化脚本,可以手动部署:
### 导出环境变量
```
export HF_TOKEN=$(aws ssm get-parameter \
--name /llmplatformsecurity/hftoken \
--with-decryption \
--query Parameter.Value \
--output text)
export QUEUE_URL=$(aws sqs get-queue-url \
--queue-name LLmSecurityPlatformMessageQueue \
--query QueueUrl \
--output text)
export AWS_REGION=us-east-1
```
### 启动 Docker 容器
```
cd ~/llm-security-platform-backend-containers/containers
docker-compose up -d --build
```
## 前置条件摘要
- **实例类型**:`m7i-flex.large`(或更大规格)
- **最低内存**:**20GB**(Mistral-3-8B 评估模型所需)
- **预装软件**:Docker 和 docker-compose
### AWS 配置
在部署之前,请确保您的 EC2 实例上已正确配置 AWS 凭证:
#### 选项 1:IAM 角色(推荐用于 EC2)
将具有以下权限的 IAM 角色附加到您的 EC2 实例:
- `ssm:GetParameter` - 用于从 Parameter Store 获取 HuggingFace token
- `sqs:GetQueueUrl` - 用于获取 SQS 队列 URL
- `dynamodb:*` - 用于访问 DynamoDB 表(PromptsTable、ChallengeSessionsTable、ChallengesTable)
#### 选项 2:AWS CLI 配置
如果不使用 IAM 角色,请手动配置凭证:
```
aws configure
```
输入您的 AWS Access Key ID、Secret Access Key 和默认区域(`us-east-1`)。
### HuggingFace Token 设置
系统需要 HuggingFace token 才能下载 Mistral-3-8B 模型。此 token 必须存储在 AWS Systems Manager Parameter Store 中:
**参数名称**:`/llmplatformsecurity/hftoken`
如果该参数不存在,请创建它:
```
aws ssm put-parameter \
--name "/llmplatformsecurity/hftoken" \
--value "YOUR_HUGGINGFACE_TOKEN" \
--type "SecureString" \
--region us-east-1
```
## 故障排除
### "AWS credentials not configured"
- 验证 IAM 角色是否已附加:`aws sts get-caller-identity`
- 或者运行 `aws configure` 手动设置凭证
### "Failed to retrieve HuggingFace token from SSM"
- 验证参数是否存在:`aws ssm get-parameter --name /llmplatformsecurity/hftoken`
- 检查 IAM 权限是否包含 `ssm:GetParameter`
- 如果缺少该参数,请创建它(参见第 5 步)
### "Failed to retrieve SQS queue URL"
- 验证队列是否存在:`aws sqs list-queues`
- 检查队列名称是否确切为 `LLmSecurityPlatformMessageQueue`
- 验证区域是否正确(`us-east-1`)
### "Docker: permission denied"
- 您需要在将用户添加到 docker 组后注销并重新登录
- 或者运行:`newgrp docker`
### 容器内存不足
- 检查您正在使用的模型(默认的 Llama-3.2-1B 或 Ministral-8B)
- Llama-3.2-1B 需要约 6GB 内存,Ministral-8B 需要约 16-20GB 内存
- 验证可用内存:`free -h`
- 考虑添加 swap 交换空间(参见下文的架构说明)
- 对于 Ministral-8B,请升级到具有 16GB+ 内存的实例
## 架构说明
### Verifier 模型
**默认配置(低内存):**
系统目前使用 **Llama-3.2-1B-Instruct** (`meta-llama/Llama-3.2-1B-Instruct`) 作为安全评估器。这个轻量级模型仅需约 4-6GB 内存,适用于测试和资源有限的环境。
**推荐的生产环境配置:**
对于具有充足资源(16GB+ 内存)的生产环境部署,请使用 **Ministral-8B-Instruct** (`mistralai/Ministral-8B-Instruct-2410`),以获得显著更好的准确性和可靠性。
**如何切换到 Ministral-8B:**
1. 确保您的实例至少具有 16GB 内存(例如 `m7i-flex.large` 或更大规格)
2. 编辑 `containers/verifier/app.py` 并更改 `MODEL_NAME`:
# 修改为:
MODEL_NAME = "meta-llama/Llama-3.2-1B-Instruct"
# 改为:
MODEL_NAME = "mistralai/Ministral-8B-Instruct-2410"
3. **重要:** 修改聊天模板配置:
- 当前的实现使用 Llama 的聊天模板格式
- Ministral 可能使用不同的格式 - 如有需要,请测试并调整 `apply_chat_template` 部分
- 根据 Ministral 的要求,您可能需要删除或修改聊天模板代码
4. 重新构建并重启容器:
cd ~/llm-security-platform-backend-containers/containers
docker-compose down
docker-compose up -d --build
**超时配置:**
worker 有一个 **60 秒的超时**时间,用于等待 verifier 的响应,以适应 LLM 推理时间。这对两种模型都适用,但如果您遇到超时错误:
- 监控日志:`docker-compose logs -f worker verifier`
- 如果 verifier 耗时超过 60 秒,请编辑 `containers/worker/worker.py`:
# 找到这一行并增加超时时间:
timeout=60 # 如果需要,更改为 90 或 120
- 重新构建:`docker-compose up -d --build`
**验证逻辑:**
- 评估器接收 **system prompt** + **模型响应**(出于安全考虑,排除了用户 prompt)
- 返回 JSON 结论:`{"result": "YES"}`(违规)或 `{"result": "NO"}`(安全)
- `YES` → 标记为 `JAILBREAK`,会话以 `completed_at` 时间戳关闭
- `NO` → 标记为 `SAFE`,会话继续
- 解析错误 → 标记为 `UNVERIFIED`
### 内存注意事项
**当前模型(Llama-3.2-1B)**:需要约 4-6GB 内存
**推荐模型(Ministral-8B)**:需要约 16-20GB 内存
如果要在物理内存有限的实例上使用 Ministral-8B,请配置 swap 交换空间:
```
sudo fallocate -l 8G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
```
通过将其添加到 `/etc/fstab` 使 swap 持久化:
```
/swapfile none swap sw 0 0
```
验证 swap 是否处于活动状态:
```
free -h
```
## 安全最佳实践
1. **使用 IAM 角色**,而不是硬编码凭证
2. **限制安全组** - 仅允许来自您的 IP 的 SSH
3. **加密 SSM 参数** - 使用 SecureString 类型
4. **定期更新** - 运行 `docker-compose pull && docker-compose up -d --build`
5. **监控日志** - 检查 worker 日志中是否有可疑活动
6. **轮换凭证** - 定期更新 HuggingFace token
## 其他资源
- **HuggingFace Token**:https://huggingface.co/settings/tokens
- **AWS SSM 文档**:https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter.html
- **Docker 文档**:https://docs.docker.com/
- **代码库**:https://github.com/OrLev-Ari/llm-security-platform-backend-containers
## 致谢
这项工作由欧盟资助,并由 ERC 拨款支持:(AGI-Safety, 101222135)。
然而,表达的观点和意见仅代表作者本人的观点,并不一定反映
欧盟或欧洲研究委员会执行机构的观点。无论是
欧盟还是拨款机构都不对其负责。
标签:AWS, Cutter, Docker, DPI, EC2, IaC, 安全防御评估, 实时告警, 版权保护, 特权提升, 自动化部署, 请求拦截, 逆向工具