607 lines
12 KiB
Markdown
607 lines
12 KiB
Markdown
# Aegis API Documentation
|
|
|
|
This document provides an overview of the Aegis REST API. For interactive documentation with request/response examples, visit:
|
|
|
|
- **Swagger UI**: http://localhost:8000/docs
|
|
- **ReDoc**: http://localhost:8000/redoc
|
|
|
|
## Base URL
|
|
|
|
All API endpoints are prefixed with `/api/v1`.
|
|
|
|
## Authentication
|
|
|
|
The API uses JWT (JSON Web Token) for authentication. Include the token in the `Authorization` header:
|
|
|
|
```
|
|
Authorization: Bearer <your-token>
|
|
```
|
|
|
|
### Obtaining a Token
|
|
|
|
```bash
|
|
curl -X POST http://localhost:8000/api/v1/auth/login \
|
|
-d "username=admin&password=admin123"
|
|
```
|
|
|
|
Response:
|
|
```json
|
|
{
|
|
"access_token": "eyJ...",
|
|
"token_type": "bearer"
|
|
}
|
|
```
|
|
|
|
## Endpoints
|
|
|
|
### Authentication
|
|
|
|
#### POST /auth/login
|
|
Authenticate and receive a JWT token.
|
|
|
|
**Request** (form data):
|
|
- `username`: string
|
|
- `password`: string
|
|
|
|
**Response** (200):
|
|
```json
|
|
{
|
|
"access_token": "string",
|
|
"token_type": "bearer"
|
|
}
|
|
```
|
|
|
|
#### GET /auth/me
|
|
Get current authenticated user.
|
|
|
|
**Headers**: `Authorization: Bearer <token>`
|
|
|
|
**Response** (200):
|
|
```json
|
|
{
|
|
"id": "uuid",
|
|
"username": "string",
|
|
"email": "string|null",
|
|
"role": "string",
|
|
"is_active": true
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### Techniques
|
|
|
|
#### GET /techniques
|
|
List all techniques with optional filters.
|
|
|
|
**Query Parameters**:
|
|
- `tactic` (optional): Filter by tactic name
|
|
- `status` (optional): Filter by status (`not_evaluated`, `in_progress`, `validated`, `partial`, `not_covered`)
|
|
- `review_required` (optional): Filter by review flag (`true`/`false`)
|
|
|
|
**Response** (200):
|
|
```json
|
|
[
|
|
{
|
|
"id": "uuid",
|
|
"mitre_id": "T1059",
|
|
"name": "Command and Scripting Interpreter",
|
|
"tactic": "execution",
|
|
"status_global": "validated"
|
|
}
|
|
]
|
|
```
|
|
|
|
#### GET /techniques/{mitre_id}
|
|
Get a single technique with associated tests.
|
|
|
|
**Response** (200):
|
|
```json
|
|
{
|
|
"id": "uuid",
|
|
"mitre_id": "T1059",
|
|
"name": "Command and Scripting Interpreter",
|
|
"description": "...",
|
|
"tactic": "execution",
|
|
"platforms": ["windows", "linux"],
|
|
"status_global": "validated",
|
|
"review_required": false,
|
|
"tests": [...]
|
|
}
|
|
```
|
|
|
|
#### POST /techniques
|
|
Create a new technique. **Admin only.**
|
|
|
|
**Request**:
|
|
```json
|
|
{
|
|
"mitre_id": "T1059",
|
|
"name": "Command and Scripting Interpreter",
|
|
"description": "...",
|
|
"tactic": "execution",
|
|
"platforms": ["windows", "linux"]
|
|
}
|
|
```
|
|
|
|
#### PATCH /techniques/{mitre_id}
|
|
Update a technique. **Admin only.**
|
|
|
|
**Request**:
|
|
```json
|
|
{
|
|
"name": "Updated Name",
|
|
"status_global": "validated"
|
|
}
|
|
```
|
|
|
|
#### PATCH /techniques/{mitre_id}/review
|
|
Mark a technique as reviewed. **Leads/Admin only.**
|
|
|
|
---
|
|
|
|
### Tests
|
|
|
|
#### POST /tests
|
|
Create a new test. **Red Tech/Admin only.**
|
|
|
|
**Request**:
|
|
```json
|
|
{
|
|
"technique_id": "uuid",
|
|
"name": "My Test",
|
|
"description": "Test description",
|
|
"platform": "windows",
|
|
"procedure_text": "Step by step...",
|
|
"tool_used": "Atomic Red Team"
|
|
}
|
|
```
|
|
|
|
#### GET /tests/{id}
|
|
Get a test with associated evidences.
|
|
|
|
#### PATCH /tests/{id}
|
|
Update a test. **Creator/Admin only.** Only allowed when state is `draft` or `rejected`.
|
|
|
|
#### POST /tests/{id}/validate
|
|
Validate a test. **Leads/Admin only.**
|
|
|
|
**Request**:
|
|
```json
|
|
{
|
|
"result": "detected",
|
|
"comments": "Optional comment"
|
|
}
|
|
```
|
|
|
|
Valid results: `detected`, `not_detected`, `partially_detected`
|
|
|
|
#### POST /tests/{id}/reject
|
|
Reject a test. **Leads/Admin only.**
|
|
|
|
---
|
|
|
|
### Evidence
|
|
|
|
#### POST /tests/{test_id}/evidence
|
|
Upload an evidence file.
|
|
|
|
**Request**: `multipart/form-data` with `file` field.
|
|
|
|
**Response** (201):
|
|
```json
|
|
{
|
|
"id": "uuid",
|
|
"test_id": "uuid",
|
|
"file_name": "screenshot.png",
|
|
"sha256_hash": "abc123...",
|
|
"uploaded_at": "2024-01-01T00:00:00Z",
|
|
"download_url": "https://..."
|
|
}
|
|
```
|
|
|
|
#### GET /evidence/{id}
|
|
Get evidence metadata with presigned download URL.
|
|
|
|
---
|
|
|
|
### Metrics
|
|
|
|
#### GET /metrics/summary
|
|
Get global coverage summary.
|
|
|
|
**Response** (200):
|
|
```json
|
|
{
|
|
"total_techniques": 200,
|
|
"validated": 50,
|
|
"partial": 20,
|
|
"not_covered": 30,
|
|
"in_progress": 10,
|
|
"not_evaluated": 90,
|
|
"coverage_percentage": 35.0
|
|
}
|
|
```
|
|
|
|
#### GET /metrics/by-tactic
|
|
Get coverage breakdown by tactic.
|
|
|
|
**Response** (200):
|
|
```json
|
|
[
|
|
{
|
|
"tactic": "execution",
|
|
"total": 15,
|
|
"validated": 5,
|
|
"partial": 2,
|
|
"not_covered": 3,
|
|
"not_evaluated": 5,
|
|
"in_progress": 0
|
|
}
|
|
]
|
|
```
|
|
|
|
---
|
|
|
|
### Users (Admin Only)
|
|
|
|
#### GET /users
|
|
List all users.
|
|
|
|
#### POST /users
|
|
Create a new user.
|
|
|
|
**Request**:
|
|
```json
|
|
{
|
|
"username": "newuser",
|
|
"email": "user@example.com",
|
|
"password": "securepassword",
|
|
"role": "red_tech"
|
|
}
|
|
```
|
|
|
|
Valid roles: `admin`, `red_tech`, `blue_tech`, `red_lead`, `blue_lead`, `viewer`
|
|
|
|
#### PATCH /users/{id}
|
|
Update a user.
|
|
|
|
**Request**:
|
|
```json
|
|
{
|
|
"email": "new@email.com",
|
|
"role": "blue_tech",
|
|
"is_active": false,
|
|
"password": "newpassword"
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### Audit Logs (Admin Only)
|
|
|
|
#### GET /audit-logs
|
|
List audit logs with pagination and filters.
|
|
|
|
**Query Parameters**:
|
|
- `user_id` (optional): Filter by user UUID
|
|
- `action` (optional): Filter by action type
|
|
- `entity_type` (optional): Filter by entity type
|
|
- `start_date` (optional): Filter from date (ISO format)
|
|
- `end_date` (optional): Filter to date (ISO format)
|
|
- `offset` (optional): Pagination offset (default: 0)
|
|
- `limit` (optional): Page size (default: 50, max: 100)
|
|
|
|
**Response** (200):
|
|
```json
|
|
{
|
|
"items": [
|
|
{
|
|
"id": "uuid",
|
|
"user_id": "uuid",
|
|
"username": "admin",
|
|
"action": "create_technique",
|
|
"entity_type": "technique",
|
|
"entity_id": "uuid",
|
|
"timestamp": "2024-01-01T00:00:00Z",
|
|
"details": {"mitre_id": "T1059"}
|
|
}
|
|
],
|
|
"total": 100,
|
|
"offset": 0,
|
|
"limit": 50
|
|
}
|
|
```
|
|
|
|
#### GET /audit-logs/actions
|
|
List distinct action types.
|
|
|
|
#### GET /audit-logs/entity-types
|
|
List distinct entity types.
|
|
|
|
---
|
|
|
|
### System (Admin Only)
|
|
|
|
#### POST /system/sync-mitre
|
|
Trigger MITRE ATT&CK synchronization.
|
|
|
|
**Response** (200):
|
|
```json
|
|
{
|
|
"message": "MITRE sync completed",
|
|
"new": 5,
|
|
"updated": 10
|
|
}
|
|
```
|
|
|
|
#### POST /system/run-intel-scan
|
|
Trigger threat intelligence scan.
|
|
|
|
**Response** (200):
|
|
```json
|
|
{
|
|
"message": "Intel scan completed",
|
|
"new_items": 3
|
|
}
|
|
```
|
|
|
|
#### GET /system/scheduler-status
|
|
Get background scheduler status.
|
|
|
|
**Response** (200):
|
|
```json
|
|
{
|
|
"running": true,
|
|
"jobs": [
|
|
{
|
|
"id": "mitre_sync",
|
|
"name": "MITRE ATT&CK Sync",
|
|
"next_run_time": "2024-01-02T00:00:00Z"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## V2 Endpoints — Red/Blue Workflow
|
|
|
|
### Tests — Red/Blue Workflow
|
|
|
|
#### `GET /api/v1/tests`
|
|
|
|
List tests with advanced filters.
|
|
|
|
**Query Parameters:**
|
|
- `state` (string) — Filter by test state
|
|
- `technique_id` (UUID) — Filter by technique
|
|
- `platform` (string) — Filter by platform
|
|
- `created_by` (UUID) — Filter by creator
|
|
- `pending_validation_side` (string: `red` / `blue`) — Filter tests in_review pending validation
|
|
- `offset` (int, default 0) — Pagination offset
|
|
- `limit` (int, default 50, max 200) — Page size
|
|
|
|
#### `POST /api/v1/tests/from-template`
|
|
|
|
Create a test from a template. Pre-populates name, description, platform, procedure, tool, and remediation steps.
|
|
|
|
**Body:**
|
|
```json
|
|
{
|
|
"template_id": "uuid",
|
|
"technique_id": "uuid"
|
|
}
|
|
```
|
|
|
|
#### `PATCH /api/v1/tests/{id}/red`
|
|
|
|
Red Team updates their fields. Allowed in `draft` and `red_executing` states.
|
|
|
|
**Body:**
|
|
```json
|
|
{
|
|
"procedure_text": "...",
|
|
"tool_used": "...",
|
|
"attack_success": true,
|
|
"red_summary": "..."
|
|
}
|
|
```
|
|
|
|
#### `PATCH /api/v1/tests/{id}/blue`
|
|
|
|
Blue Team updates their fields. Allowed only in `blue_evaluating` state.
|
|
|
|
**Body:**
|
|
```json
|
|
{
|
|
"detection_result": "detected | not_detected | partially_detected",
|
|
"blue_summary": "..."
|
|
}
|
|
```
|
|
|
|
#### `PATCH /api/v1/tests/{id}/remediation`
|
|
|
|
Update remediation fields on a test.
|
|
|
|
**Body:**
|
|
```json
|
|
{
|
|
"remediation_steps": "Step 1: ...\nStep 2: ...",
|
|
"remediation_status": "pending | in_progress | completed | not_applicable",
|
|
"remediation_assignee": "user-uuid"
|
|
}
|
|
```
|
|
|
|
#### `POST /api/v1/tests/{id}/start-execution`
|
|
|
|
Transition: `draft` → `red_executing`. Sets `execution_date`.
|
|
|
|
#### `POST /api/v1/tests/{id}/submit-red`
|
|
|
|
Transition: `red_executing` → `blue_evaluating`. Notifies all blue_tech users.
|
|
|
|
#### `POST /api/v1/tests/{id}/submit-blue`
|
|
|
|
Transition: `blue_evaluating` → `in_review`. Notifies red_lead and blue_lead.
|
|
|
|
#### `POST /api/v1/tests/{id}/validate-red`
|
|
|
|
Red Lead approves or rejects. Triggers dual validation check.
|
|
|
|
**Body:**
|
|
```json
|
|
{
|
|
"red_validation_status": "approved | rejected",
|
|
"red_validation_notes": "optional notes"
|
|
}
|
|
```
|
|
|
|
#### `POST /api/v1/tests/{id}/validate-blue`
|
|
|
|
Blue Lead approves or rejects. Triggers dual validation check.
|
|
|
|
**Body:**
|
|
```json
|
|
{
|
|
"blue_validation_status": "approved | rejected",
|
|
"blue_validation_notes": "optional notes"
|
|
}
|
|
```
|
|
|
|
#### `POST /api/v1/tests/{id}/reopen`
|
|
|
|
Move a `rejected` test back to `draft`. Clears all validation fields.
|
|
|
|
---
|
|
|
|
### Test Templates
|
|
|
|
#### `GET /api/v1/test-templates`
|
|
|
|
List templates with filters: `source`, `platform`, `severity`, `search`, `mitre_technique_id`, `is_active`.
|
|
|
|
#### `POST /api/v1/test-templates` (Admin)
|
|
|
|
Create a custom template with `suggested_remediation`.
|
|
|
|
#### `GET /api/v1/test-templates/stats` (Admin)
|
|
|
|
Returns catalog statistics: total, active, inactive, by source, by platform.
|
|
|
|
#### `POST /api/v1/test-templates/{id}/toggle-active` (Admin)
|
|
|
|
Toggle a template's active/inactive status.
|
|
|
|
---
|
|
|
|
### Notifications
|
|
|
|
#### `GET /api/v1/notifications`
|
|
|
|
List notifications for the current user (paginated, newest first).
|
|
|
|
**Query Parameters:** `offset` (default 0), `limit` (default 20, max 100)
|
|
|
|
#### `GET /api/v1/notifications/unread-count`
|
|
|
|
Returns `{ "unread_count": N }`.
|
|
|
|
#### `PATCH /api/v1/notifications/{id}/read`
|
|
|
|
Mark a single notification as read.
|
|
|
|
#### `POST /api/v1/notifications/read-all`
|
|
|
|
Mark all notifications for the current user as read.
|
|
|
|
**Automatic Notifications:**
|
|
- `red_executing` → notifies creator
|
|
- `blue_evaluating` → notifies all blue_tech users
|
|
- `in_review` → notifies red_lead and blue_lead
|
|
- `rejected` → notifies creator
|
|
- `validated` → notifies creator
|
|
|
|
---
|
|
|
|
### Reports
|
|
|
|
#### `GET /api/v1/reports/coverage-summary`
|
|
|
|
Full technique coverage report as JSON. Includes summary and technique-by-technique breakdown.
|
|
|
|
**Filters:** `tactic`, `platform`
|
|
|
|
#### `GET /api/v1/reports/coverage-csv`
|
|
|
|
Downloadable CSV of coverage data.
|
|
|
|
**Filters:** `tactic`, `platform`
|
|
|
|
#### `GET /api/v1/reports/test-results`
|
|
|
|
Test results report with state and detection breakdowns.
|
|
|
|
**Filters:** `state`, `date_from` (ISO), `date_to` (ISO)
|
|
|
|
#### `GET /api/v1/reports/remediation-status`
|
|
|
|
Remediation status report across all tests with assigned steps.
|
|
|
|
**Filter:** `status` (pending, in_progress, completed, not_applicable)
|
|
|
|
---
|
|
|
|
### V2 Metrics
|
|
|
|
#### `GET /api/v1/metrics/test-pipeline`
|
|
|
|
Test counts by state across the pipeline.
|
|
|
|
#### `GET /api/v1/metrics/team-activity`
|
|
|
|
Red/Blue team activity: tests completed, pending.
|
|
|
|
#### `GET /api/v1/metrics/validation-rate`
|
|
|
|
Approval/rejection rates for Red Lead and Blue Lead.
|
|
|
|
#### `GET /api/v1/metrics/recent-tests`
|
|
|
|
Last 10 most recently updated tests.
|
|
|
|
---
|
|
|
|
## Error Responses
|
|
|
|
All errors follow a consistent format:
|
|
|
|
```json
|
|
{
|
|
"detail": "Error message",
|
|
"code": "ERROR_CODE"
|
|
}
|
|
```
|
|
|
|
State transition errors include additional context:
|
|
|
|
```json
|
|
{
|
|
"detail": {
|
|
"message": "Cannot transition from 'draft' to 'validated'. Valid transitions: ['red_executing']",
|
|
"code": "INVALID_TRANSITION",
|
|
"current_state": "draft",
|
|
"target_state": "validated",
|
|
"valid_transitions": ["red_executing"]
|
|
}
|
|
}
|
|
```
|
|
|
|
Common HTTP status codes:
|
|
- `400` - Bad Request (validation error, invalid transition, invalid input)
|
|
- `401` - Unauthorized (missing or invalid token)
|
|
- `403` - Forbidden (insufficient permissions)
|
|
- `404` - Not Found (resource doesn't exist)
|
|
- `409` - Conflict (duplicate resource)
|
|
- `500` - Internal Server Error
|