proxy-oidcv2/README.md
2025-12-03 21:34:44 +01:00

329 lines
8.0 KiB
Markdown

# 🔐 Secure Proxy - Reverse Proxy avec OIDC
Un service complet de reverse proxy qui protège les services non-OIDC derrière une authentification Keycloak, avec panel admin pour gérer les services et les redirections.
## ✨ Fonctionnalités
- **Authentification OIDC** : Intégration complète avec Keycloak
- **Reverse Proxy** : Cache les services internes derrière une URL publique
- **Panel Admin** : Interface web complète pour gérer les services
- **Gestion des Services** : Créer, modifier, supprimer les services protégés
- **Logs d'Audit** : Tracer toutes les actions administrateur
- **Logs d'Accès** : Enregistrer tous les accès aux services
- **Contrôle d'Authentification** : Choisir quels services nécessitent l'authentification
- **Sécurité** : Rate limiting, CSRF protection, headers de sécurité
## 📦 Installation
### Prérequis
- Node.js 16+
- npm
- Keycloak instance (pour l'authentification)
- SQLite (inclus via npm)
### Étapes d'installation
1. **Cloner et installer les dépendances**
```bash
cd /Users/alexandre/projet/openidv2
npm install
```
2. **Configuration**
Copier `.env.example` vers `.env` et configurer :
```bash
cp .env.example .env
```
Éditer `.env` avec vos paramètres :
```env
# Server
PORT=3000
NODE_ENV=production
PROXY_URL=https://secure.k2r.ovh
# OIDC Configuration
OIDC_ISSUER=https://keycloak.example.com/auth/realms/master
OIDC_CLIENT_ID=openidv2-client
OIDC_CLIENT_SECRET=your_secret_here
OIDC_CALLBACK_URL=https://secure.k2r.ovh/callback
# Admin
ADMIN_USERNAME=admin@example.com
ADMIN_PASSWORD=your_secure_password
# Session
SESSION_SECRET=generate_random_string_here
```
3. **Initialiser la base de données**
```bash
npm run init-db
```
4. **Optionnel : Charger des données de test**
```bash
npm run seed-db
```
## 🚀 Démarrage
### Développement
```bash
npm run dev
```
### Production
```bash
npm start
```
Le serveur démarre sur `http://localhost:3000` (ou le port configuré).
## 🔑 Configuration Keycloak
### Créer un client OIDC dans Keycloak
1. Aller dans **Clients****Create**
2. **Client ID** : `openidv2-client`
3. **Client Protocol** : openid-connect
4. **Root URL** : `https://secure.k2r.ovh`
5. Dans **Settings** :
- **Valid Redirect URIs** : `https://secure.k2r.ovh/callback`
- **Valid Post Logout Redirect URIs** : `https://secure.k2r.ovh/`
6. Dans **Credentials**, copier le **Secret**
7. Mettre à jour `.env` avec le client ID et secret
## 📋 Utilisation
### Accès au Panel Admin
1. Naviguer vers `https://secure.k2r.ovh/admin`
2. Authentification avec Keycloak
3. Vous devez être administrateur (email doit correspondre à `ADMIN_USERNAME`)
### Créer un Service
1. Cliquer sur **+ New Service**
2. Remplir le formulaire :
- **Service Name** : Nom unique du service
- **Path** : Chemin public (ex: `/myapp`)
- **Target URL** : URL du service interne (ex: `http://localhost:8080`)
- **Description** : Description optionnelle
- **Require Authentication** : Cocher pour protéger par OIDC
3. Cliquer **Create Service**
### Exemple de Configuration
**Service Public** :
- Path: `/public-app`
- Target: `http://internal-server:5000`
- Auth: Décochée
- URL d'accès: `https://secure.k2r.ovh/public-app`
**Service Privé** :
- Path: `/admin-dashboard`
- Target: `http://admin-server:4200`
- Auth: Cochée
- URL d'accès: `https://secure.k2r.ovh/admin-dashboard` (nécessite login)
## 🔌 API Routes
### Authentification
- `GET /auth/login-page` - Page de connexion
- `GET /auth/login` - Initier le login OIDC
- `POST /auth/callback` - Callback OIDC
- `GET /auth/logout` - Déconnexion
- `GET /auth/profile` - Profil utilisateur
### Services (Admin seulement)
- `POST /api/services` - Créer un service
- `GET /api/services` - Lister tous les services
- `GET /api/services/:id` - Récupérer un service
- `PUT /api/services/:id` - Modifier un service
- `DELETE /api/services/:id` - Supprimer un service
- `PATCH /api/services/:id/toggle` - Activer/désactiver un service
- `GET /api/services/:id/logs` - Logs d'accès du service
### Dashboard (Admin seulement)
- `GET /dashboard/stats` - Statistiques
- `GET /dashboard/logs` - Logs d'audit
## 🗂️ Structure du Projet
```
openidv2/
├── src/
│ ├── server.js # Serveur Express principal
│ ├── config.js # Configuration
│ ├── db.js # Gestion base de données
│ ├── middleware/
│ │ ├── oidcMiddleware.js # OIDC et authentification
│ │ ├── security.js # Sécurité, rate limiting, etc.
│ │ └── proxyMiddleware.js # Reverse proxy
│ ├── routes/
│ │ ├── authRoutes.js # Routes d'authentification
│ │ ├── adminRoutes.js # Routes d'administration
│ │ └── dashboardRoutes.js # Routes dashboard
│ ├── services/
│ │ └── serviceManager.js # Logique de gestion des services
│ └── controllers/
│ ├── authController.js # Contrôleurs auth
│ ├── serviceController.js # Contrôleurs services
│ └── adminController.js # Contrôleurs admin
├── public/
│ └── admin.html # Interface admin
├── db/
│ └── services.db # Base de données SQLite
├── scripts/
│ ├── initDb.js # Initialiser la DB
│ └── seedDb.js # Charger des données
├── .env.example # Configuration d'exemple
├── package.json
└── README.md
```
## 🔒 Sécurité
- **HTTPS obligatoire** en production
- **Rate limiting** sur toutes les routes
- **CSRF protection** sur les formulaires
- **Headers de sécurité** (Helmet.js)
- **Sessions sécurisées** (httpOnly, sameSite)
- **Validation des entrées** sur tous les chemins
- **Logs d'audit** pour toutes les actions
- **Isolation des services** : Chaque service a son propre log d'accès
## 📊 Logs et Monitoring
### Logs d'Audit
Enregistre :
- Actions administrateur (création, modification, suppression de services)
- Utilisateur, IP, détails
### Logs d'Accès
Enregistre pour chaque accès à un service :
- Utilisateur, chemin, méthode HTTP
- Code de réponse, temps de réponse
- Adresse IP
### Vue des Logs
Accédez aux logs dans le panel admin sous l'onglet **Audit Logs**
## 🔧 Dépannage
### Le panel admin ne s'affiche pas
1. Vérifier que vous êtes admin : `ADMIN_USERNAME` doit correspondre à votre email Keycloak
2. Vérifier les logs du serveur
### La redirection OIDC échoue
1. Vérifier la configuration Keycloak
2. Vérifier les URLs dans `.env`
3. S'assurer que HTTPS est utilisé en production
### Les services n'apparaissent pas
1. Vérifier que la DB est initialisée : `npm run init-db`
2. Vérifier le chemin de la DB dans `.env`
## 📝 Exemples d'Utilisation
### Proxy un service Grafana local
```env
Service Name: Grafana
Path: /grafana
Target URL: http://localhost:3000
Require Auth: Checked
```
Puis accéder via : `https://secure.k2r.ovh/grafana`
### Proxy un service public (sans auth)
```env
Service Name: Public Docs
Path: /docs
Target URL: http://docs-server:8000
Require Auth: Unchecked
```
Accessible à : `https://secure.k2r.ovh/docs`
## 🚀 Déploiement
### Avec Docker (optionnel)
```dockerfile
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
```
### Avec systemd
Créer `/etc/systemd/system/openidv2.service` :
```ini
[Unit]
Description=Secure Proxy OIDC
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/var/www/openidv2
ExecStart=/usr/bin/node /var/www/openidv2/src/server.js
Restart=on-failure
Environment="NODE_ENV=production"
Environment="PORT=3000"
[Install]
WantedBy=multi-user.target
```
Puis :
```bash
systemctl start openidv2
systemctl enable openidv2
```
## 📄 Licence
MIT
## 👤 Support
Pour les problèmes, consultez les logs :
```bash
tail -f /var/log/openidv2.log
```
---
**Made with ❤️ for secure internal services**