medienkompetenz-lernplattform/PLATFORM_DOCUMENTATION.md
2026-02-05 22:42:30 +01:00

897 lines
20 KiB
Markdown

# Security Awareness Learning Platform - Documentation
Complete technical documentation for the containerized security awareness training platform.
---
## Table of Contents
1. [Platform Overview](#platform-overview)
2. [Architecture](#architecture)
3. [Getting Started](#getting-started)
4. [User Roles & Workflows](#user-roles--workflows)
5. [Lessons System](#lessons-system)
6. [API Reference](#api-reference)
7. [Database Schema](#database-schema)
8. [Frontend Components](#frontend-components)
9. [Deployment](#deployment)
10. [Development Guide](#development-guide)
---
## Platform Overview
### Purpose
A containerized web application for security awareness training featuring:
- **Hub-based architecture** - Participants join events with pseudonyms
- **Modular lessons** - Easily expandable lesson system
- **Interactive content** - Hands-on security demonstrations
- **Weighted scoring** - Flexible point configuration per event
### Technology Stack
- **Backend:** Node.js 18 + Express
- **Frontend:** React 18 + Vite 5
- **Database:** PostgreSQL 15
- **Deployment:** Docker Compose
- **Lesson Format:** YAML configs + JavaScript modules
### Key Features
- ✅ No registration required for participants (pseudonym-based)
- ✅ Admin panel with password authentication
- ✅ Interactive security lessons (SQL injection, phishing demos)
- ✅ Progress tracking and analytics
- ✅ Weighted scoring system
- ✅ Containerized deployment (production-ready)
---
## Architecture
### High-Level Architecture
```
┌─────────────────────────────────────────────┐
│ User (Browser) │
└─────────────┬───────────────────────────────┘
├─── http://localhost (Frontend - Nginx)
│ ├─ Hub (Join Events)
│ ├─ Lesson Player
│ ├─ Admin Panel
│ └─ Progress Dashboard
├─── http://localhost:3000/api (Backend - Express)
│ ├─ Participant API
│ ├─ Admin API
│ ├─ Lesson API
│ └─ Lesson Modules
└─── PostgreSQL:5432 (Database)
├─ Events & Participants
├─ Lessons & Progress
└─ Answers & Scores
```
### Container Architecture
```yaml
services:
database:
- PostgreSQL 15 Alpine
- Volume: lesson_platform_data
- Health checks enabled
backend:
- Node.js 18 Alpine
- Depends on: database (healthy)
- Volumes: ./backend/lessons (lessons)
- Health endpoint: /health
frontend:
- Nginx Alpine
- Serves: React SPA
- Reverse proxy: API calls to backend
```
### Data Flow
```
Participant Flow:
Hub → Join Event → View Lessons → Complete Lesson → View Progress
Admin Flow:
Login → Dashboard → Manage Events → Assign Lessons → View Analytics
Lesson Execution:
Start → Navigate Steps → Answer Questions → Submit → Complete
```
---
## Getting Started
### Prerequisites
- Docker Desktop or Docker Engine + Docker Compose
- 2GB RAM minimum
- Ports 80, 3000, 5432 available
### Quick Start
1. **Clone and Setup:**
```bash
cd lernplattform
cp .env.example .env
# Edit .env with your settings
```
2. **Start Platform:**
```bash
docker-compose up -d
```
3. **Verify Health:**
```bash
docker-compose ps # All should be "healthy"
curl http://localhost:3000/health
```
4. **Access:**
- **Participants:** http://localhost
- **Admin:** http://localhost/admin/login
- Username: `admin`
- Password: `admin123`
5. **Seed Lessons (if needed):**
```bash
docker exec lernplattform_backend node seed-lessons.js
```
### First Time Setup
1. **Create an Event:**
- Login to admin panel
- Click "Manage Events"
- Create new event with name and dates
2. **Assign Lessons:**
- Click "Manage Lessons" on event
- Assign lessons with weights
- Configure max points
3. **Test as Participant:**
- Go to http://localhost
- Join the event with a pseudonym
- Complete a lesson
---
## User Roles & Workflows
### Participant Role
**Capabilities:**
- Join events with pseudonym (no registration)
- View assigned lessons
- Complete interactive lessons
- Submit answers and receive immediate feedback
- View personal progress and score
- Complete lessons in any order (unless locked)
**Workflow:**
1. Navigate to hub page
2. Select event from dropdown
3. Enter pseudonym
4. Click "Join Event"
5. View lesson list
6. Click lesson to start
7. Navigate through steps
8. Answer questions
9. Complete lesson
10. View updated score
**Session Management:**
- Session token stored in localStorage
- Remains logged in across browser sessions
- Can logout to join different event
### Admin Role
**Capabilities:**
- Create, edit, delete events
- Assign lessons to events
- Configure lesson weights and points
- View participant data and progress
- See detailed answers submitted
- Export analytics
**Workflow:**
**Event Management:**
1. Login to admin panel
2. Navigate to Event Management
3. Create/edit/delete events
4. Set dates and active status
**Lesson Configuration:**
1. Select event
2. Click "Manage Lessons"
3. Assign lessons from catalog
4. Set order, weights, points
5. Mark as required/optional
**Monitor Progress:**
1. Select event
2. Click "View Participants"
3. See completion rates
4. Click participant for details
5. Review submitted answers
---
## Lessons System
### Architecture
Every lesson consists of:
1. **YAML Configuration** - Structure, questions, scoring
2. **JavaScript Module** - Validation, interactive data
3. **Database Entry** - Metadata, catalog reference
### Lesson Flow
```
Load Config → Initialize Module → Render Steps → Validate Answers → Calculate Score
```
### Step Types
**1. Content Step**
```yaml
- id: "intro"
type: "content"
title: "Introduction"
content: "Educational content..."
```
**2. Question Step**
```yaml
- id: "question-1"
type: "question"
questionType: "single_choice|multiple_choice|free_text"
question: "Question text?"
options: [...]
maxPoints: 25
```
**3. Interactive Step**
```yaml
- id: "demo"
type: "interactive"
title: "Interactive Demo"
interactiveComponent: "ComponentName"
content: "Instructions..."
```
### Available Lessons
| Lesson | Key | Difficulty | Duration | Interactive |
|--------|-----|-----------|----------|-------------|
| Phishing Email Detection | `phishing-email-basics` | Beginner | 15 min | No |
| SQL Injection Shop | `sql-injection-shop` | Intermediate | 20 min | Yes |
| Browser-in-the-Browser | `browser-in-browser-attack` | Advanced | 25 min | Yes |
**Detailed Documentation:**
- [Comprehensive Lesson Docs](backend/lessons/LESSONS_DOCUMENTATION.md)
- [Quick Reference](LESSON_QUICK_REFERENCE.md)
- [Lesson README](backend/lessons/README.md)
---
## API Reference
### Base URL
```
http://localhost:3000/api
```
### Authentication
**Participant:**
- Header: `Authorization: Bearer <session_token>`
- Token obtained on event join
**Admin:**
- Header: `Authorization: Bearer <jwt_token>`
- Token obtained on login
### Participant Endpoints
```
POST /participant/join
Body: { pseudonym, eventId }
→ { sessionToken, participant, event }
GET /participant/events
→ { events: [...] }
GET /participant/progress
Auth: Bearer session_token
→ { totalScore, completedLessons, ... }
```
### Lesson Endpoints
```
GET /lesson/event/:eventId/lessons
Auth: Bearer session_token
→ { lessons: [...] }
GET /lesson/:eventLessonId
Auth: Bearer session_token
→ { title, steps, maxPoints, progress }
POST /lesson/:eventLessonId/start
Auth: Bearer session_token
→ { progressId, status }
POST /lesson/:eventLessonId/answer
Auth: Bearer session_token
Body: { questionId, answer }
→ { isCorrect, pointsAwarded, totalScore }
POST /lesson/:eventLessonId/complete
Auth: Bearer session_token
→ { completedAt, finalScore }
POST /lesson/:eventLessonId/action/:action
Auth: Bearer session_token
Body: { ...actionData }
→ { result }
```
### Admin Endpoints
```
POST /admin/login
Body: { username, password }
→ { token, admin }
GET /admin/events
Auth: Bearer admin_token
→ { events: [...] }
POST /admin/events
Auth: Bearer admin_token
Body: { name, description, startDate, endDate }
→ { event }
GET /admin/events/:eventId/participants
Auth: Bearer admin_token
→ { participants: [...] }
GET /admin/lessons
Auth: Bearer admin_token
→ { lessons: [...] }
POST /admin/events/:eventId/lessons
Auth: Bearer admin_token
Body: { lessonId, orderIndex, maxPoints, weight }
→ { eventLesson }
```
### Error Responses
```json
{
"success": false,
"error": {
"message": "Error description",
"statusCode": 400
}
}
```
---
## Database Schema
### Core Tables
**events**
```sql
id, name, description, start_date, end_date, is_active,
created_at, updated_at
```
**participants**
```sql
id, pseudonym, event_id, session_token,
created_at, last_active
UNIQUE(pseudonym, event_id)
```
**lessons**
```sql
id, lesson_key, title, description,
module_path, config_path, difficulty_level, estimated_duration,
created_at, updated_at
```
**event_lessons**
```sql
id, event_id, lesson_id, order_index, max_points, weight,
is_required, unlock_after_lesson_id,
created_at, updated_at
UNIQUE(event_id, order_index)
```
**lesson_progress**
```sql
id, participant_id, event_lesson_id, status,
started_at, completed_at, score, attempts, current_step
```
**lesson_answers**
```sql
id, lesson_progress_id, question_key, answer_data (JSONB),
is_correct, points_awarded, feedback, submitted_at
```
**admin_users**
```sql
id, username, password_hash, created_at, updated_at
```
### Relationships
```
events (1) → (*) event_lessons → (*) lesson_progress
events (1) → (*) participants → (*) lesson_progress
lessons (1) → (*) event_lessons
lesson_progress (1) → (*) lesson_answers
```
### Indexes
- `participants(session_token)` - Session lookup
- `event_lessons(event_id, order_index)` - Lesson ordering
- `lesson_progress(participant_id, event_lesson_id)` - Progress tracking
- `lesson_answers(lesson_progress_id)` - Answer retrieval
---
## Frontend Components
### Page Structure
```
src/
├── pages/
│ ├── Hub.jsx # Join event
│ ├── EventLanding.jsx # Lesson list
│ ├── LessonView.jsx # Lesson player
│ ├── ParticipantProgress.jsx # Progress view
│ └── admin/
│ ├── AdminLogin.jsx
│ ├── AdminDashboard.jsx
│ ├── EventManagement.jsx
│ ├── LessonConfiguration.jsx
│ └── ParticipantData.jsx
├── components/
│ ├── common/ # Shared components
│ └── lessons/
│ └── InteractiveContent/
│ ├── SQLShopDemo.jsx
│ └── BitBDemo.jsx
├── contexts/
│ ├── ParticipantContext.jsx # Participant auth
│ └── AdminContext.jsx # Admin auth
├── services/
│ ├── api.service.js # API client
│ └── session.service.js # Session mgmt
└── routes/
└── AppRoutes.jsx # Route config
```
### State Management
**Context Providers:**
- `ParticipantContext` - Session, authentication, profile
- `AdminContext` - Admin auth, profile
**Local State:**
- Component-level useState for UI state
- No Redux/Zustand needed for current scale
### Routing
```javascript
/ → Hub (public)
/event → EventLanding (protected: participant)
/lesson/:id LessonView (protected: participant)
/progress → ParticipantProgress (protected: participant)
/admin/login → AdminLogin (public)
/admin → AdminDashboard (protected: admin)
/admin/events → EventManagement (protected: admin)
/admin/events/:id/lessons → LessonConfiguration (protected: admin)
/admin/events/:id/participants → ParticipantData (protected: admin)
```
### Interactive Components
**SQLShopDemo:**
- Fake e-commerce search interface
- Executes vulnerable SQL queries
- Real-time injection detection
- Safe vs vulnerable comparison
**BitBDemo:**
- Fake OAuth popup simulator
- Drag-test demonstration
- Right-click inspection
- Educational feedback system
---
## Deployment
### Environment Variables
```bash
# Database
DB_HOST=database
DB_PORT=5432
DB_NAME=lernplattform_db
DB_USER=lernplattform_user
DB_PASSWORD=your_secure_password
# Backend
NODE_ENV=production
PORT=3000
JWT_SECRET=your_jwt_secret_key
SESSION_SECRET=your_session_secret
# Admin
ADMIN_PASSWORD=your_admin_password
```
### Docker Compose Commands
```bash
# Start all services
docker-compose up -d
# Stop all services
docker-compose down
# View logs
docker-compose logs -f [service]
# Rebuild specific service
docker-compose up -d --build [service]
# Check status
docker-compose ps
# Execute command in container
docker exec [container] [command]
```
### Health Checks
**Backend Health:**
```bash
curl http://localhost:3000/health
```
Expected response:
```json
{
"status": "healthy",
"timestamp": "2026-01-12T...",
"environment": "production",
"database": "connected"
}
```
**Container Status:**
```bash
docker-compose ps
# All should show "Up" and "healthy"
```
### Backup & Restore
**Backup Database:**
```bash
docker exec lernplattform_db pg_dump -U lernplattform_user lernplattform_db > backup.sql
```
**Restore Database:**
```bash
cat backup.sql | docker exec -i lernplattform_db psql -U lernplattform_user lernplattform_db
```
### Production Considerations
1. **Change Default Passwords** in `.env`
2. **Enable HTTPS** with reverse proxy (nginx/traefik)
3. **Set Up Regular Backups** of database
4. **Configure CORS** for production domain
5. **Enable Rate Limiting** on API endpoints
6. **Set Up Monitoring** (logs, metrics)
7. **Configure Log Rotation**
8. **Use Strong JWT/Session Secrets**
---
## Development Guide
### Local Development Setup
1. **Install Dependencies:**
```bash
cd backend && npm install
cd ../frontend && npm install
```
2. **Run Without Docker:**
```bash
# Terminal 1: Database
docker run -p 5432:5432 -e POSTGRES_PASSWORD=pass postgres:15-alpine
# Terminal 2: Backend
cd backend && npm run dev
# Terminal 3: Frontend
cd frontend && npm run dev
```
3. **Access Development Server:**
- Frontend: http://localhost:5173
- Backend: http://localhost:3000
### Adding a New Lesson
**Step-by-Step:**
1. Create YAML config:
```bash
nano backend/lessons/configs/my-lesson.yaml
```
2. Create module directory:
```bash
mkdir backend/lessons/modules/my-lesson
nano backend/lessons/modules/my-lesson/index.js
```
3. Extend base class:
```javascript
const LessonModule = require('../base/LessonModule');
class MyLesson extends LessonModule {
constructor(config) {
super(config);
}
}
module.exports = MyLesson;
```
4. Seed to database:
```bash
# Add to seed script
docker exec lernplattform_backend node seed-lessons.js
```
5. (Optional) Create interactive component:
```bash
nano frontend/src/components/lessons/InteractiveContent/MyComponent.jsx
```
6. Register in LessonView.jsx
7. Test thoroughly
### Code Style
**Backend:**
- Use async/await (not callbacks)
- Validate inputs with ApiError
- Use prepared statements for SQL
- Handle errors in asyncHandler
- Comment complex logic
**Frontend:**
- Functional components + hooks
- PropTypes for type checking (optional)
- CSS-in-JS for styling
- Destructure props
- Keep components small
### Testing
**Manual Testing Checklist:**
- [ ] Can join event
- [ ] Lessons appear correctly
- [ ] Questions validate properly
- [ ] Scoring calculates correctly
- [ ] Progress saves
- [ ] Admin can assign lessons
- [ ] Interactive components work
- [ ] Session persists
**API Testing:**
```bash
# Health check
curl http://localhost:3000/health
# Get events (as participant)
curl http://localhost:3000/api/participant/events
```
### Debugging
**Backend Logs:**
```bash
docker logs -f lernplattform_backend
```
**Frontend Console:**
- Open browser DevTools (F12)
- Check Console tab for errors
- Check Network tab for API calls
**Database Query:**
```bash
docker exec -it lernplattform_db psql -U lernplattform_user lernplattform_db
\dt -- List tables
SELECT * FROM lessons;
```
---
## Troubleshooting
### Common Issues
**1. Port already in use**
```bash
# Find process using port
lsof -i :80 # or 3000, 5432
# Kill process or change port in docker-compose.yml
```
**2. Database connection failed**
```bash
# Check database is running
docker-compose ps database
# Check logs
docker logs lernplattform_db
# Verify credentials in .env
```
**3. Frontend shows blank page**
```bash
# Check frontend logs
docker logs lernplattform_frontend
# Rebuild frontend
docker-compose up -d --build frontend
# Check browser console
```
**4. Admin login fails**
```bash
# Verify password hash in database
docker exec lernplattform_db psql -U lernplattform_user lernplattform_db -c "SELECT username, password_hash FROM admin_users;"
# Regenerate hash if needed
```
**5. Lesson won't assign**
```bash
# Check backend logs for constraint errors
docker logs lernplattform_backend
# Verify lesson exists
docker exec lernplattform_db psql -U lernplattform_user lernplattform_db -c "SELECT * FROM lessons;"
# Check for duplicate order_index (fixed in latest version)
```
---
## Security Notes
### Authentication
- Participants: UUID session tokens (stateless)
- Admins: JWT tokens with bcrypt password hashing
- No password recovery (admin must reset manually)
### Data Protection
- No PII collected from participants (pseudonyms only)
- Session tokens in localStorage (XSS risk mitigated)
- SQL injection prevented (parameterized queries)
- Input validation on frontend and backend
### Production Security
- Change all default passwords
- Use strong JWT secrets
- Enable HTTPS
- Configure CORS properly
- Implement rate limiting
- Regular security updates
- Monitor logs for attacks
---
## Performance
### Current Scale
- Handles ~100 concurrent users
- Database pool: 20 connections
- Frontend: Static files, fast load
### Optimization Options
- Add Redis for session caching
- Enable frontend caching (service worker)
- CDN for static assets
- Database read replicas
- Horizontal scaling (multiple backend instances)
---
## Future Enhancements
### Planned Features
- [ ] More lessons (XSS, CSRF, password security)
- [ ] Email notifications
- [ ] Bulk participant import
- [ ] Certificate generation
- [ ] Advanced analytics dashboard
- [ ] Lesson scheduling
- [ ] Mobile responsive improvements
- [ ] Dark mode
### Extension Points
- Custom lesson modules
- Additional interactive components
- Third-party integrations (LDAP, SSO)
- LMS integration (SCORM)
- API webhooks
---
## Support & Resources
### Documentation
- **This File:** Platform overview
- **[LESSONS_DOCUMENTATION.md](backend/lessons/LESSONS_DOCUMENTATION.md):** Comprehensive lesson guide
- **[LESSON_QUICK_REFERENCE.md](LESSON_QUICK_REFERENCE.md):** Quick reference for instructors
- **[lessons/README.md](backend/lessons/README.md):** Lesson development guide
### Useful Commands
```bash
# View all containers
docker ps -a
# Clean up
docker-compose down -v # Remove volumes
docker system prune # Clean unused resources
# Database access
docker exec -it lernplattform_db psql -U lernplattform_user lernplattform_db
# Backend shell
docker exec -it lernplattform_backend sh
# Tail logs
docker-compose logs -f --tail=100
```
---
**Version:** 1.0.0
**Last Updated:** 2026-01-12
**License:** MIT (or your license)
**Repository:** https://github.com/your-org/lernplattform (if applicable)