🔐 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
- Cloner et installer les dépendances
cd /Users/alexandre/projet/openidv2
npm install
- Configuration
Copier .env.example vers .env et configurer :
cp .env.example .env
Éditer .env avec vos paramètres :
# 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
- Initialiser la base de données
npm run init-db
- Optionnel : Charger des données de test
npm run seed-db
🚀 Démarrage
Développement
npm run dev
Production
npm start
Le serveur démarre sur http://localhost:3000 (ou le port configuré).
🔑 Configuration Keycloak
Créer un client OIDC dans Keycloak
- Aller dans Clients → Create
- Client ID :
openidv2-client - Client Protocol : openid-connect
- Root URL :
https://secure.k2r.ovh - Dans Settings :
- Valid Redirect URIs :
https://secure.k2r.ovh/callback - Valid Post Logout Redirect URIs :
https://secure.k2r.ovh/
- Valid Redirect URIs :
- Dans Credentials, copier le Secret
- Mettre à jour
.envavec le client ID et secret
📋 Utilisation
Accès au Panel Admin
- Naviguer vers
https://secure.k2r.ovh/admin - Authentification avec Keycloak
- Vous devez être administrateur (email doit correspondre à
ADMIN_USERNAME)
Créer un Service
- Cliquer sur + New Service
- 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
- 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 connexionGET /auth/login- Initier le login OIDCPOST /auth/callback- Callback OIDCGET /auth/logout- DéconnexionGET /auth/profile- Profil utilisateur
Services (Admin seulement)
POST /api/services- Créer un serviceGET /api/services- Lister tous les servicesGET /api/services/:id- Récupérer un servicePUT /api/services/:id- Modifier un serviceDELETE /api/services/:id- Supprimer un servicePATCH /api/services/:id/toggle- Activer/désactiver un serviceGET /api/services/:id/logs- Logs d'accès du service
Dashboard (Admin seulement)
GET /dashboard/stats- StatistiquesGET /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
- Vérifier que vous êtes admin :
ADMIN_USERNAMEdoit correspondre à votre email Keycloak - Vérifier les logs du serveur
La redirection OIDC échoue
- Vérifier la configuration Keycloak
- Vérifier les URLs dans
.env - S'assurer que HTTPS est utilisé en production
Les services n'apparaissent pas
- Vérifier que la DB est initialisée :
npm run init-db - Vérifier le chemin de la DB dans
.env
📝 Exemples d'Utilisation
Proxy un service Grafana local
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)
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)
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 :
[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 :
systemctl start openidv2
systemctl enable openidv2
📄 Licence
MIT
👤 Support
Pour les problèmes, consultez les logs :
tail -f /var/log/openidv2.log
Made with ❤️ for secure internal services
Description
Languages
JavaScript
51.4%
Shell
25.7%
HTML
20.8%
Batchfile
1.6%
Dockerfile
0.5%