Files
Remote-Control-Center/guacamole_test_11_26/docs/AUTHENTICATION_FLOW.md
2025-11-25 09:58:37 +03:00

386 lines
25 KiB
Markdown
Executable File
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 🔐 Authentication Flow Diagram
## 📊 Complete Authentication Flow
```
┌─────────────────────────────────────────────────────────────────────────┐
│ СИСТЕМА АУТЕНТИФИКАЦИИ │
│ │
│ ┌───────────────┐ ┌──────────────┐ ┌────────────────────┐ │
│ │ Environment │ │ Guacamole │ │ Application │ │
│ │ Variables │───▶│ Database │───▶│ Runtime │ │
│ │ (.env) │ │ (PostgreSQL) │ │ (FastAPI) │ │
│ └───────────────┘ └──────────────┘ └────────────────────┘ │
│ │ │ │ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ SYSTEM_ADMIN_USERNAME / PASSWORD │ │
│ │ (От вас, НЕ захардкожены) │ │
│ └─────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────┘
```
---
## 🔄 Startup Sequence
```
1⃣ API STARTUP
┌─────────────────────────────────────────────────────┐
│ docker compose up -d │
└──────────────────┬──────────────────────────────────┘
┌─────────────────────────────────────────────────────┐
│ GuacamoleAuthenticator.__init__() │
│ ├─ Read SYSTEM_ADMIN_USERNAME from env │
│ ├─ Read SYSTEM_ADMIN_PASSWORD from env │
│ └─ If missing → ValueError ❌ │
└──────────────────┬──────────────────────────────────┘
┌─────────────────────────────────────────────────────┐
│ wait_for_guacamole() │
│ └─ Wait for Guacamole API to be ready │
└──────────────────┬──────────────────────────────────┘
┌─────────────────────────────────────────────────────┐
│ cleanup_orphaned_guacamole_connections() │
│ ├─ Get system token (uses env credentials) │
│ ├─ List all Guacamole connections │
│ ├─ Check Redis for each connection │
│ └─ Delete orphaned connections │
└──────────────────┬──────────────────────────────────┘
┌─────────────────────────────────────────────────────┐
│ ✅ API Ready for User Requests │
└─────────────────────────────────────────────────────┘
```
---
## 👤 User Login Flow
```
1⃣ USER LOGIN REQUEST
┌─────────────────────────────────────────────────────┐
│ POST /auth/login │
│ { │
│ "username": "alice", │
│ "password": "user_password" │
│ } │
└──────────────────┬──────────────────────────────────┘
┌─────────────────────────────────────────────────────┐
│ guacamole_authenticator.authenticate_user() │
│ ├─ Send to Guacamole: username="alice" │
│ ├─ Send to Guacamole: password="user_password" │
│ ├─ Get Guacamole token for alice │
│ └─ Get user role and permissions │
└──────────────────┬──────────────────────────────────┘
┌─────────────────────────────────────────────────────┐
│ create_jwt_for_user() │
│ ├─ Create JWT with username="alice" │
│ ├─ Store Guacamole token in Redis session │
│ └─ Return JWT to client │
└──────────────────┬──────────────────────────────────┘
┌─────────────────────────────────────────────────────┐
│ ✅ User Authenticated │
│ Client has JWT → Can make API requests │
└─────────────────────────────────────────────────────┘
```
**ВАЖНО:**
-НЕ используется `SYSTEM_ADMIN_USERNAME/PASSWORD`
- ✅ Используются credentials самого пользователя (alice)
---
## 🔌 User Creates Connection
```
2⃣ CREATE CONNECTION REQUEST
┌─────────────────────────────────────────────────────┐
│ POST /connect │
│ Authorization: Bearer <JWT> │
│ { │
│ "hostname": "server01", │
│ "protocol": "rdp", │
│ "username": "remote_user", │
│ "password": "remote_password" │
│ } │
└──────────────────┬──────────────────────────────────┘
┌─────────────────────────────────────────────────────┐
│ JWT Middleware │
│ ├─ Extract session_id from JWT │
│ ├─ Get Guacamole token from Redis session │
│ ├─ Get user info (username="alice", role="USER") │
│ └─ Pass to endpoint handler │
└──────────────────┬──────────────────────────────────┘
┌─────────────────────────────────────────────────────┐
│ create_remote_connection() │
│ ├─ Use alice's Guacamole token │
│ ├─ Create connection in Guacamole │
│ ├─ Store connection info in Redis │
│ └─ Return connection URL │
└──────────────────┬──────────────────────────────────┘
┌─────────────────────────────────────────────────────┐
│ ✅ Connection Created │
│ Owner: alice (from JWT) │
│ Guacamole Token: alice's token (from Redis) │
└─────────────────────────────────────────────────────┘
```
**ВАЖНО:**
-НЕ используется `SYSTEM_ADMIN_USERNAME/PASSWORD`
- ✅ Используется Guacamole token самого пользователя (alice)
---
## 🗑️ User Deletes Connection
```
3⃣ DELETE CONNECTION REQUEST
┌─────────────────────────────────────────────────────┐
│ DELETE /connections/{id} │
│ Authorization: Bearer <JWT> │
└──────────────────┬──────────────────────────────────┘
┌─────────────────────────────────────────────────────┐
│ delete_connection() │
│ ├─ Get connection from Redis │
│ ├─ Check ownership (connection.owner == alice) │
│ ├─ Use alice's Guacamole token from Redis │
│ └─ Delete from Guacamole │
└──────────────────┬──────────────────────────────────┘
┌─────────────────────────────────────────────────────┐
│ ✅ Connection Deleted │
│ Used: alice's token (NOT system admin) │
└─────────────────────────────────────────────────────┘
```
**ВАЖНО:**
-НЕ используется `SYSTEM_ADMIN_USERNAME/PASSWORD`
- ✅ Используется Guacamole token владельца подключения
---
## 🧹 Background Cleanup (System)
```
4⃣ CLEANUP EXPIRED CONNECTIONS
┌─────────────────────────────────────────────────────┐
│ Background Task (every 60 seconds) │
└──────────────────┬──────────────────────────────────┘
┌─────────────────────────────────────────────────────┐
│ cleanup_expired_connections_once() │
│ ├─ Get all connections from Redis │
│ ├─ Find expired connections │
│ └─ For each expired connection: │
└──────────────────┬──────────────────────────────────┘
┌─────────────────────────────────────────────────────┐
│ delete_connection_with_user_token() │
│ ├─ Get user's token from Redis │
│ ├─ Delete from Guacamole using user's token │
│ └─ Delete from Redis │
└──────────────────┬──────────────────────────────────┘
┌─────────────────────────────────────────────────────┐
│ ✅ Expired Connections Cleaned │
│ Used: Each user's token (NOT system admin) │
└─────────────────────────────────────────────────────┘
```
**ВАЖНО:**
- ✅ Использует токен каждого пользователя (из Redis)
-НЕ используется `SYSTEM_ADMIN_USERNAME/PASSWORD`
---
## 🔧 Orphaned Cleanup (System)
```
5⃣ CLEANUP ORPHANED CONNECTIONS (Startup Only)
┌─────────────────────────────────────────────────────┐
│ API Startup Event │
└──────────────────┬──────────────────────────────────┘
┌─────────────────────────────────────────────────────┐
│ cleanup_orphaned_guacamole_connections() │
│ ├─ Get system token using env credentials │
│ ├─ List ALL connections from Guacamole │
│ ├─ Check if each exists in Redis │
│ └─ Delete if NOT in Redis (orphaned) │
└──────────────────┬──────────────────────────────────┘
┌─────────────────────────────────────────────────────┐
│ get_system_token() │
│ ├─ Read SYSTEM_ADMIN_USERNAME from env │
│ ├─ Read SYSTEM_ADMIN_PASSWORD from env │
│ ├─ Authenticate to Guacamole │
│ └─ Return system token │
└──────────────────┬──────────────────────────────────┘
┌─────────────────────────────────────────────────────┐
│ delete_connection_with_system_token() │
│ └─ Delete orphaned connections │
└──────────────────┬──────────────────────────────────┘
┌─────────────────────────────────────────────────────┐
│ ✅ Orphaned Connections Cleaned │
│ Used: SYSTEM_ADMIN credentials from env │
└─────────────────────────────────────────────────────┘
```
**ВАЖНО:**
- ✅ Это ЕДИНСТВЕННОЕ место где используется `SYSTEM_ADMIN`
- ✅ Работает ТОЛЬКО на старте API
- ✅ Credentials берутся из environment variables
---
## 🔐 Security Model
```
┌──────────────────────────────────────────────────────────────┐
│ БЕЗОПАСНОСТЬ CREDENTIALS │
└──────────────────────────────────────────────────────────────┘
┌─────────────────────┬──────────────┬──────────────────────┐
│ Credential Type │ Storage │ Usage │
├─────────────────────┼──────────────┼──────────────────────┤
│ SYSTEM_ADMIN │ .env file │ Startup cleanup │
│ (username/pass) │ ✅ Required │ (orphaned conns) │
├─────────────────────┼──────────────┼──────────────────────┤
│ User Guacamole │ Redis │ User operations │
│ token │ (ephemeral) │ (create/delete) │
├─────────────────────┼──────────────┼──────────────────────┤
│ User JWT │ Client │ API authorization │
│ token │ (ephemeral) │ (all endpoints) │
├─────────────────────┼──────────────┼──────────────────────┤
│ REDIS_PASSWORD │ .env file │ Redis connections │
│ │ ✅ Required │ (all components) │
├─────────────────────┼──────────────┼──────────────────────┤
│ POSTGRES_PASSWORD │ .env file │ DB connections │
│ │ ✅ Required │ (API + Guacamole) │
└─────────────────────┴──────────────┴──────────────────────┘
КРИТИЧНО:
Все credentials из .env (НЕ захардкожены)
✅ User tokens ephemeral (хранятся в Redis с TTL)
✅ System token используется ТОЛЬКО для cleanup
✅ Нет fallback значений (API упадет если нет .env)
```
---
## 📊 Token Types Comparison
```
┌───────────────────────────────────────────────────────────────┐
│ ТРИ ТИПА ТОКЕНОВ
└───────────────────────────────────────────────────────────────┘
1⃣ JWT TOKEN (User API Token)
├─ Создается: При login пользователя
├─ Хранится: На клиенте (LocalStorage/Memory)
├─ Срок жизни: 60 минут (configurable)
├─ Используется для: Авторизации API запросов
└─ Содержит: username, role, session_id
2⃣ GUACAMOLE TOKEN (User Session Token)
├─ Создается: При аутентификации в Guacamole
├─ Хранится: В Redis (по session_id из JWT)
├─ Срок жизни: Привязан к JWT сессии
├─ Используется для: Создания/удаления подключений
└─ Содержит: Guacamole authToken
3⃣ SYSTEM TOKEN (Service Account Token)
├─ Создается: При startup API
├─ Хранится: В памяти GuacamoleAuthenticator
├─ Срок жизни: До рестарта API
├─ Используется для: Cleanup orphaned connections
└─ Содержит: Guacamole authToken (for system admin)
ВАЖНО:
✅ User никогда не видит SYSTEM TOKEN
✅ SYSTEM TOKEN используется ТОЛЬКО внутри API
✅ User operations используют User's Guacamole token
```
---
## 🎯 Key Takeaways
### ✅ **Что МОЖНО менять:**
```env
SYSTEM_ADMIN_USERNAME=любое_имя # ✅ Любое имя
SYSTEM_ADMIN_PASSWORD=любой_пароль # ✅ Любой пароль
REDIS_PASSWORD=любой_пароль # ✅ Любой пароль
POSTGRES_PASSWORD=любой_пароль # ✅ Любой пароль
```
### ❌ **Что НЕЛЬЗЯ:**
```env
SYSTEM_ADMIN_USERNAME= # ❌ Пустое значение
SYSTEM_ADMIN_PASSWORD=guacadmin # ❌ Дефолтное значение
REDIS_PASSWORD=redis_pass # ❌ Дефолтное значение
```
### 🔒 **Где используются credentials:**
| Credential | Used By | Used For | User Visible? |
|------------|---------|----------|---------------|
| `SYSTEM_ADMIN_USERNAME/PASSWORD` | API (startup) | Orphaned cleanup | ❌ No |
| User's Guacamole token | API (runtime) | User operations | ❌ No (in Redis) |
| User's JWT | Client | API authorization | ✅ Yes (client-side) |
### 🎯 **Безопасность:**
1.**No hardcoded credentials** - Все из .env
2.**No fallback values** - API упадет без credentials
3.**System token isolated** - Только для cleanup
4.**User tokens ephemeral** - Срок жизни ограничен
5.**Role-based access** - GUEST/USER/ADMIN permissions
---
## 📚 Related Documentation
- `ENDPOINT_AUDIT_REPORT.md` - Detailed endpoint analysis
- `COMPATIBILITY_SUMMARY.md` - Quick compatibility check
- `DEPLOYMENT_CHECKLIST.md` - Deployment guide
---
**Last Updated:** 2025-10-29
**Version:** 1.0
**Status:** ✅ PRODUCTION READY