mirror of
https://github.com/BradGroux/veritas-kanban.git
synced 2026-10-09 13:17:52 +00:00
287 lines
9.8 KiB
Markdown
287 lines
9.8 KiB
Markdown
# Veritas Kanban Server - Security Guide
|
|
|
|
## Overview
|
|
|
|
The Veritas Kanban server includes a flexible authentication and authorization system to protect API endpoints and WebSocket connections from unauthorized access.
|
|
|
|
## Quick Start
|
|
|
|
### Development (Localhost Bypass)
|
|
|
|
For local development, enable localhost bypass:
|
|
|
|
```bash
|
|
# .env
|
|
VERITAS_AUTH_ENABLED=true
|
|
VERITAS_AUTH_LOCALHOST_BYPASS=true
|
|
```
|
|
|
|
This allows unauthenticated requests from `localhost`/`127.0.0.1` while still requiring auth for remote connections.
|
|
|
|
### Production
|
|
|
|
For production, configure API keys:
|
|
|
|
```bash
|
|
# .env
|
|
VERITAS_AUTH_ENABLED=true
|
|
VERITAS_AUTH_LOCALHOST_BYPASS=false
|
|
VERITAS_ADMIN_KEY=your-secure-admin-key
|
|
VERITAS_API_KEYS=agent1:key1:agent,dashboard:key2:read-only
|
|
```
|
|
|
|
## Authentication Methods
|
|
|
|
Clients can authenticate using any of these methods:
|
|
|
|
### 1. Authorization Header (Recommended)
|
|
|
|
```bash
|
|
curl -H "Authorization: Bearer your-api-key" \
|
|
http://localhost:3001/api/tasks
|
|
```
|
|
|
|
### 2. X-API-Key Header
|
|
|
|
```bash
|
|
curl -H "X-API-Key: your-api-key" \
|
|
http://localhost:3001/api/tasks
|
|
```
|
|
|
|
### 3. Query Parameter (WebSocket)
|
|
|
|
```javascript
|
|
const ws = new WebSocket('ws://localhost:3001/ws?api_key=your-api-key');
|
|
```
|
|
|
|
## Roles and Permissions
|
|
|
|
| Role | Read | Write | Admin Actions |
|
|
| ----------- | ---- | ----- | ------------- |
|
|
| `admin` | ✅ | ✅ | ✅ |
|
|
| `agent` | ✅ | ✅ | ❌ |
|
|
| `read-only` | ✅ | ❌ | ❌ |
|
|
|
|
### Role Details
|
|
|
|
- **admin**: Full access to all endpoints including sensitive operations
|
|
- **agent**: Can read/write tasks, run agents, manage worktrees. Intended for AI agents like [OpenClaw](https://github.com/openclaw/openclaw)
|
|
- **read-only**: Can only perform GET requests. Suitable for dashboards and monitoring
|
|
|
|
## Configuration Reference
|
|
|
|
### Environment Variables
|
|
|
|
| Variable | Default | Description |
|
|
| ------------------------------- | ------- | -------------------------------------------------- |
|
|
| `VERITAS_AUTH_ENABLED` | `true` | Enable/disable authentication |
|
|
| `VERITAS_AUTH_LOCALHOST_BYPASS` | `false` | Allow unauthenticated localhost requests |
|
|
| `VERITAS_ADMIN_KEY` | (none) | Admin API key with full access |
|
|
| `VERITAS_API_KEYS` | (none) | Comma-separated API keys (format: `name:key:role`) |
|
|
|
|
### API Key Format
|
|
|
|
```
|
|
name:key:role,name2:key2:role2
|
|
```
|
|
|
|
Example:
|
|
|
|
```
|
|
veritas:vk_abc123xyz:agent,dashboard:vk_def456uvw:read-only
|
|
```
|
|
|
|
## Generating API Keys
|
|
|
|
### Using OpenSSL
|
|
|
|
```bash
|
|
# Generate a random 32-character key
|
|
openssl rand -base64 32
|
|
```
|
|
|
|
### Using the Built-in Function
|
|
|
|
```typescript
|
|
import { generateApiKey } from './middleware/auth.js';
|
|
const key = generateApiKey('vk'); // e.g., vk_AbCdEf123...
|
|
```
|
|
|
|
## API Endpoints
|
|
|
|
### Auth Status (Unauthenticated)
|
|
|
|
Check the current authentication configuration:
|
|
|
|
```bash
|
|
curl http://localhost:3001/api/auth/status
|
|
```
|
|
|
|
Response:
|
|
|
|
```json
|
|
{
|
|
"enabled": true,
|
|
"localhostBypass": false,
|
|
"configuredKeys": 2,
|
|
"hasAdminKey": true
|
|
}
|
|
```
|
|
|
|
### Health Check (Unauthenticated)
|
|
|
|
```bash
|
|
curl http://localhost:3001/health
|
|
```
|
|
|
|
## WebSocket Authentication
|
|
|
|
WebSocket connections are authenticated on connect:
|
|
|
|
```javascript
|
|
// With API key
|
|
const ws = new WebSocket('ws://localhost:3001/ws?api_key=your-key');
|
|
|
|
ws.onclose = (event) => {
|
|
if (event.code === 4001) {
|
|
console.error('Authentication failed:', event.reason);
|
|
}
|
|
};
|
|
```
|
|
|
|
### WebSocket Close Codes
|
|
|
|
| Code | Meaning |
|
|
| ------ | ------------------------------ |
|
|
| `1000` | Normal close |
|
|
| `4001` | Authentication required/failed |
|
|
|
|
## Error Responses
|
|
|
|
### 401 Unauthorized
|
|
|
|
```json
|
|
{
|
|
"error": "Authentication required",
|
|
"code": "AUTH_REQUIRED",
|
|
"hint": "Provide API key via Authorization header (Bearer <key>), X-API-Key header, or api_key query parameter"
|
|
}
|
|
```
|
|
|
|
### 403 Forbidden
|
|
|
|
```json
|
|
{
|
|
"error": "Write access denied",
|
|
"code": "WRITE_FORBIDDEN",
|
|
"hint": "Your API key has read-only access"
|
|
}
|
|
```
|
|
|
|
## Security Best Practices
|
|
|
|
1. **Never commit API keys** - Use environment variables or `.env` files (add to `.gitignore`)
|
|
|
|
2. **Rotate keys regularly** - Update API keys periodically, especially if compromised
|
|
|
|
3. **Use HTTPS in production** - API keys are transmitted in headers/URLs
|
|
|
|
4. **Principle of least privilege** - Use `read-only` for dashboards, `agent` for automation
|
|
|
|
5. **Monitor access** - The server logs connection attempts with role information
|
|
|
|
## Migrating from No Auth
|
|
|
|
If you're upgrading from an earlier version without authentication:
|
|
|
|
1. **Before upgrading**: Document all clients that access the API
|
|
|
|
2. **During upgrade**:
|
|
- Start with `VERITAS_AUTH_LOCALHOST_BYPASS=true` for smooth transition
|
|
- Generate API keys for each client
|
|
- Update clients to include authentication headers
|
|
|
|
3. **After testing**: Disable localhost bypass for production
|
|
|
|
## Troubleshooting
|
|
|
|
### "Authentication required" for localhost
|
|
|
|
Check that `VERITAS_AUTH_LOCALHOST_BYPASS=true` is set, or provide an API key.
|
|
|
|
### "Invalid API key"
|
|
|
|
- Verify the key matches exactly (no extra spaces)
|
|
- Check that the key is in the `VERITAS_API_KEYS` or `VERITAS_ADMIN_KEY` variable
|
|
- Ensure the format is correct: `name:key:role`
|
|
|
|
### WebSocket immediately closes
|
|
|
|
- Check browser console for the close reason
|
|
- Ensure the API key is passed as a query parameter: `?api_key=...`
|
|
|
|
## Architecture
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────┐
|
|
│ Request Flow │
|
|
├─────────────────────────────────────────────────────────────┤
|
|
│ │
|
|
│ Client Request │
|
|
│ │ │
|
|
│ ▼ │
|
|
│ ┌──────────────┐ │
|
|
│ │ CORS/JSON │ (express middleware) │
|
|
│ └──────────────┘ │
|
|
│ │ │
|
|
│ ▼ │
|
|
│ ┌──────────────┐ ┌───────────────────────┐ │
|
|
│ │ /health │──▶│ Bypass auth │ │
|
|
│ │ /api/auth/* │ │ (unauthenticated) │ │
|
|
│ └──────────────┘ └───────────────────────┘ │
|
|
│ │ │
|
|
│ ▼ │
|
|
│ ┌──────────────┐ │
|
|
│ │ authenticate │ (middleware/auth.ts) │
|
|
│ │ │ │
|
|
│ │ - Check auth │ │
|
|
│ │ enabled │ │
|
|
│ │ - Localhost │ │
|
|
│ │ bypass? │ │
|
|
│ │ - Validate │ │
|
|
│ │ API key │ │
|
|
│ └──────────────┘ │
|
|
│ │ │
|
|
│ ▼ │
|
|
│ ┌──────────────┐ │
|
|
│ │ Route Handler│ (req.auth available) │
|
|
│ └──────────────┘ │
|
|
│ │
|
|
└─────────────────────────────────────────────────────────────┘
|
|
```
|
|
|
|
## Changelog
|
|
|
|
- **v3.3.0** (2026-02-15): Task intelligence security hardening
|
|
- Crash-recovery checkpointing with auto-sanitization of 20+ secret patterns plus regex value detection
|
|
- XSS prevention in observational memory via `sanitizeCommentText()`
|
|
- DFS cycle detection in task dependencies prevents infinite loop attacks
|
|
- Input sanitization on agent filter (trim + 100 char cap)
|
|
- Zod validation on all dependency and checkpoint routes
|
|
- **v3.0.0** (2026-02-09): Workflow engine security
|
|
- ReDoS protection on regex acceptance criteria
|
|
- Expression injection prevention in template evaluator
|
|
- Parallel DoS limits (max 50 concurrent sub-steps)
|
|
- Gate approval authentication and permission checks
|
|
- RBAC with ACL files for workflow access control
|
|
- Audit logging of all workflow changes
|
|
- **v2.0.0** (2026-02-06): Multi-agent security
|
|
- Agent permission levels (Intern/Specialist/Lead) with enforcement
|
|
- Agent registry with heartbeat-based liveness tracking
|
|
- MCP SDK patched to ^1.26.0 (GHSA-345p-7cg4-v4c7)
|
|
- Rate limiting documentation (reverse proxy recommended for public deployments)
|
|
- **v1.0.0** (2026-01-29): Initial authentication implementation
|
|
- API key authentication for HTTP and WebSocket
|
|
- Role-based authorization (admin, agent, read-only)
|
|
- Localhost bypass for development
|
|
- Configuration via environment variables
|