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, 安全防御评估, 实时告警, 版权保护, 特权提升, 自动化部署, 请求拦截, 逆向工具