329 lines
8.0 KiB
Markdown
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**
|