VikkramVigneswaranJai/policy-as-code-platform
GitHub: VikkramVigneswaranJai/policy-as-code-platform
基于Flask和OPA构建的策略即代码平台,实现声明式属性访问控制和集中化授权管理。
Stars: 1 | Forks: 0
## Policy-as-Code 平台
一个基于 Flask 的综合授权系统,利用 Open Policy Agent (OPA) 实现基于属性访问控制 (ABAC) 的 Policy-as-Code 原则。
### 🎯 项目概述
本平台展示了使用 Rego 编写的声明式策略的现代授权模式。它提供了一个完整的 Web 应用程序,包含用户管理、策略评估和全面的审计日志记录。
## 主要特性
• 🔐 认证与授权**:基于 JWT 的认证与 OPA 策略评估
• 👥 用户管理**:完整的用户注册、登录和个人资料管理
• 📜 策略管理**:通过 Web 界面创建、更新和管理 Rego 策略
• 🔍 审计日志**:全面记录所有授权决策
• ⏰ 基于时间的访问控制**:考虑一天中的时间和一周中的某天的策略
• 🏢 基于部门的访问**:基于用户和资源部门的 ABAC 策略
• 🎨 现代 UI**:使用 Tailwind CSS 构建的精美、响应式界面
• 🧪 全面测试**:覆盖所有端点和边缘情况的完整测试套件
## 📋 目录
- [安装](#installation)
- [快速开始](#quick-start)
- [架构](#architecture)
- [API 文档](#api-documentation)
- [策略示例](#policy-examples)
- [测试](#testing)
- [部署](#deployment)
- [故障排除](#troubleshooting)
## 🚀 安装
### 前置条件
- Python 3.8 或更高版本
- pip (Python 包管理器)
- OPA (Open Policy Agent) - 可选但推荐
### 第一步:克隆仓库
```
git clone
cd PolicyAsCodePlatform
```
### 第二步:创建虚拟环境
```
# Windows
python -m venv venv
venv\Scripts\activate
# Linux/Mac
python3 -m venv venv
source venv/bin/activate
```
### 第三步:安装依赖
```
pip install -r requirements.txt
```
### 第四步:安装 OPA(可选)
#### Windows
1. 从此处下载 OPA:https://www.openpolicyagent.org/docs/latest/#running-opa
2. 或使用直接链接:https://openpolicyagent.org/downloads/latest/opa_windows_amd64.exe
3. 重命名为 `opa.exe` 并添加到 PATH
#### Linux
```
curl -L -o opa https://openpolicyagent.org/downloads/latest/opa_linux_amd64
chmod +x opa
sudo mv opa /usr/local/bin/
```
#### Mac
```
brew install opa
```
### 第五步:初始化数据库
```
python init_db.py
```
这将创建 SQLite 数据库并用示例用户和策略填充它。
## ⚡ 快速开始
### 选项 1:集成启动(推荐)
同时启动 OPA 服务器和 Flask 应用程序:
```
python start_app.py
```
### 选项 2:手动启动
**终端 1 - 启动 OPA 服务器:**
```
python start_opa.py
# 或手动:
opa run --server --addr localhost:8181 opa_policies/
```
**终端 2 - 启动 Flask 应用程序:**
```
python run.py
```
### 访问应用程序
- **Web 界面**:http://localhost:5000
- **仪表盘**:http://localhost:5000/dashboard
- **登录**:http://localhost:5000/login
- **注册**:http://localhost:5000/register
- **API 文档**:http://localhost:5000/api-docs
- **OPA 服务器**:http://localhost:8181 (如果正在运行)
### 默认测试凭据
| 用户名 | 密码 | 角色 | 部门 |
|----------|----------|------|------------|
| admin | admin123 | admin | management |
| manager | manager123 | manager | engineering |
| employee | employee123 | employee | engineering |
| hr_manager | hr123 | manager | hr |
| finance_employee | finance123 | employee | finance |
## 🏗️ 架构
### 系统组件
```
┌─────────────────────────────────────────────────────────────┐
│ Web Browser (Client) │
└───────────────────────────┬─────────────────────────────────┘
│ HTTP/HTTPS
▼
┌─────────────────────────────────────────────────────────────┐
│ Flask Application │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Auth Routes │ │Policy Routes │ │ Audit Routes │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ OPA Client Module │ │
│ └──────────────────────────────────────────────────────┘ │
└──────────────┬────────────────────────┬────────────────────┘
│ │
▼ ▼
┌───────────────────┐ ┌───────────────────────┐
│ SQLite Database │ │ OPA Server │
│ - Users │ │ - Policy Engine │
│ - Policies │ │ - Rego Policies │
│ - Audit Logs │ │ - REST API │
└───────────────────┘ └───────────────────────┘
```
### 技术栈
- **后端**:Flask 2.3.3
- **数据库**:SQLite 与 SQLAlchemy ORM
- **认证**:JWT (Flask-JWT-Extended)
- **策略引擎**:Open Policy Agent (OPA)
- **策略语言**:Rego
- **前端**:HTML5, Tailwind CSS, Vanilla JavaScript
- **测试**:pytest
### 目录结构
```
PolicyAsCodePlatform/
├── app/
│ ├── __init__.py # Application factory
│ ├── models.py # Database models
│ ├── opa_client.py # OPA integration
│ ├── routes.py # Main routes
│ ├── auth/
│ │ └── routes.py # Authentication endpoints
│ ├── policy/
│ │ └── routes.py # Policy management endpoints
│ ├── resources/
│ │ └── routes.py # Resource access endpoints
│ ├── audit/
│ │ └── routes.py # Audit log endpoints
│ └── templates/ # HTML templates
│ ├── base.html
│ ├── login.html
│ ├── register.html
│ ├── dashboard.html
│ └── ...
├── opa_policies/
│ ├── authz.rego # Main authorization policy
│ ├── rbac.rego # Role-based access control
│ ├── time_based.rego # Time-based policies
│ └── department.rego # Department-based policies
├── config.py # Configuration settings
├── run.py # Application entry point
├── start_app.py # Integrated startup script
├── start_opa.py # OPA startup script
├── init_db.py # Database initialization
├── test_app.py # Comprehensive test suite
├── requirements.txt # Python dependencies
└── README.md # This file
```
## 📚 API 文档
### 认证端点
#### POST /auth/register
注册一个新用户账户。
**请求体:**
```
{
"username": "string",
"email": "string",
"password": "string",
"role": "admin|manager|employee",
"department": "string",
"designation": "string (optional)"
}
```
**响应 (201):**
```
{
"status": "success",
"message": "User registered successfully",
"data": {
"user": { ... }
}
}
```
#### POST /auth/login
进行认证并接收 JWT token。
**请求体:**
```
{
"username": "string",
"password": "string"
}
```
**响应 (200):**
```
{
"status": "success",
"data": {
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGc...",
"token_type": "Bearer",
"user": { ... }
}
}
```
#### GET /auth/profile
获取当前用户资料(需要认证)。
**请求头:**
```
Authorization: Bearer
```
**响应 (200):**
```
{
"status": "success",
"data": {
"user": {
"id": 1,
"username": "admin",
"email": "admin@example.com",
"role": "admin",
"department": "management"
}
}
}
```
### 策略端点
#### POST /policy/evaluate
评估策略决策。
**请求头:**
```
Authorization: Bearer
```
**请求体:**
```
{
"action": "read|write|delete",
"resource": {
"type": "document|report|settings",
"department": "string",
"id": "string (optional)"
},
"environment": {
"hour": 14,
"day": "Monday"
}
}
```
**响应 (200):**
```
{
"status": "success",
"data": {
"allow": true,
"reason": "Admin has full access to all resources"
}
}
```
### 审计端点
#### GET /audit/logs
检索审计日志(仅限管理员)。
**查询参数:**
- `page`:页码(默认:1)
- `per_page`:每页条目数(默认:20)
- `decision`:按决策筛选(allow/deny)
- `action`:按操作筛选(read/write/delete)
## 🔒 策略示例
### 示例 1:管理员完全访问权限
```
allow if {
input.user.role == "admin"
}
```
### 示例 2:经理办公时间
```
allow if {
input.user.role == "manager"
input.environment.hour >= 9
input.environment.hour < 18
input.action in ["read", "write"]
}
```
### 示例 3:员工部门访问
```
allow if {
input.user.role == "employee"
input.action == "read"
input.user.department == input.resource.department
}
```
## 🧪 测试
### 运行所有测试
```
python -m pytest test_app.py -v
```
### 运行特定测试类
```
python -m pytest test_app.py::TestAuthEndpoints -v
```
### 测试覆盖范围
测试套件涵盖:
- ✅ 用户注册(成功、重复、验证)
- ✅ 用户登录(成功、无效凭据)
- ✅ JWT token 处理
- ✅ 策略评估(所有角色和场景)
- ✅ 基于时间的访问控制
- ✅ 基于部门的访问控制
- ✅ 审计日志记录
- ✅ 边缘情况(SQL 注入、XSS、格式错误的输入)
- ✅ 错误处理
## 🌐 部署
### 生产环境注意事项
1. **环境变量**:设置生产环境密钥
export SECRET_KEY="your-secret-key"
export JWT_SECRET_KEY="your-jwt-secret"
export FLASK_ENV="production"
2. **数据库**:使用 PostgreSQL 或 MySQL 代替 SQLite
SQLALCHEMY_DATABASE_URI = "postgresql://user:pass@localhost/dbname"
3. **OPA 服务器**:将 OPA 作为单独的服务部署
opa run --server --addr 0.0.0.0:8181 /path/to/policies
4. **WSGI 服务器**:使用 Gunicorn 或 uWSGI
gunicorn -w 4 -b 0.0.0.0:5000 run:app
## 🔧 故障排除
### OPA 服务器无法启动
**问题**:找不到 OPA 可执行文件
**解决方案**:
- 确保 OPA 已安装并在 PATH 中
- 或使用本地回退模式(应用程序可在没有 OPA 的情况下工作)
### 数据库错误
**问题**:数据库锁定或权限错误
**解决方案**:
```
# 删除并重建数据库
rm pac_platform.db
python init_db.py
```
### 端口已被占用
**问题**:端口 5000 或 8181 已被占用
**解决方案**:
```
# 更改 Flask 端口
export FLASK_PORT=8000
python run.py
# 或杀死现有进程
# Windows
netstat -ano | findstr :5000
taskkill /PID /F
# Linux/Mac
lsof -ti:5000 | xargs kill -9
```
### 登录无效
**问题**:Token 未被存储
**解决方案**:
- 检查浏览器控制台是否有错误
- 确保已启用 JavaScript
- 清除浏览器 localStorage
- 尝试隐身/无痕模式
## 📝 配置
### 环境变量
- `FLASK_ENV`:环境(development/production/testing)
- `FLASK_DEBUG`:启用调试模式(True/False)
- `FLASK_HOST`:主机地址(默认:0.0.0.0)
- `FLASK_PORT`:端口号(默认:5000)
- `SECRET_KEY`:Flask 密钥
- `JWT_SECRET_KEY`:JWT 签名密钥
- `OPA_SERVER_URL`:OPA 服务器 URL(默认:http://localhost:8181)
- `DATABASE_URL`:数据库连接字符串
### 配置文件
- `config.py`:主配置
- `.env`:环境变量(从 `.env.example` 创建)
## 🤝 贡献
这是一个学术项目。如需改进:
1. Fork 仓库
2. 创建功能分支
3. 进行更改
4. 添加测试
5. 提交 Pull Request
## 📄 许可证
本项目为学术目的而创建。
## 👥 作者
- 学术项目 - Policy-as-Code 平台
- Vikkram Vigneswaran KJ
- Velmurugan A
- Velsabarinaath B
- Sri haran R
## 🙏 致谢
- Open Policy Agent (OPA) 团队
- Flask 框架贡献者
- Tailwind CSS 团队
## 📞 支持
如有问题或疑问:
- 查看故障排除部分
- 查看 API 文档
- 运行测试套件以验证设置
## 邮件联系-
- Vikkram Vigneswaran - vvigneswarankj@gmail.com
**使用 Flask、OPA 和现代 Web 技术用 ❤️ 构建**
标签:ABAC, Flask, Groq API, JSONLines, JWT, OPA, PE 加载器, Policy-as-Code, Python, Rego, Streamlit, Tailwind CSS, 人工智能安全, 合规性, 后端开发, 基于属性的访问控制, 安全规则引擎, 审计日志, 授权系统, 无后门, 用户管理, 策略即代码, 结构化提示词, 聊天机器人安全, 访问控制, 逆向工具, 零信任, 靶场