Edu-Kit - Gérer les réseaux proxmox et le bastion warpgat avec les APIs
1. Vue d’ensemble
Ce document décrit les appels API que le backend edu-kit doit effectuer pour gérer le réseau Proxmox (SDN) et le bastion SSH (Warpgate) lors des différentes actions de la plateforme.
Architecture
┌──────────────┐ ┌─────────────────────────────────────────────┐
│ Edu-Kit │ │ Proxmox Client (PVE 9.x) │
│ (Cluster) │ │ │
│ │ API │ vmbr0 (réseau école) │
│ - App web │◄───────►│ │ │
│ - Keycloak │ SSH │ ├── VM Warpgate (Docker, port 2222/8888) │
│ │ │ │ │
└──────────────┘ │ ├── [SDN] Zone env-{id} │
│ │ └── VNet vnet-{id} (10.200.{id}.0/24)│
│ │ ├── VM étudiant A │
│ │ └── VM étudiant B │
│ │ │
│ └── [SDN] Zone env-{id2} │
│ └── VNet vnet-{id2} │
└─────────────────────────────────────────────┘
APIs utilisées
| Service | Base URL | Authentification |
|---|---|---|
| Proxmox VE | https://{proxmox_host}:8006/api2/json |
Token API PVE PVEAPIToken={user}@{realm}!{tokenid}={secret} |
| Warpgate | https://{warpgate_host}:8888/@warpgate/admin/api |
Bearer token (Authorization: Bearer {token}) |
| Keycloak | https://{keycloak_host}/admin/realms/{realm} |
Bearer token OIDC |
2. Setup initial d’un Proxmox client (une seule fois)
Ce setup est exécuté une seule fois lors du déploiement d’un nouveau Proxmox client. Il peut être automatisé dans un script ou playbook.
2.1 Prérequis serveur (SSH)
# Installer dnsmasq (nécessaire pour le DHCP SDN)
apt install -y dnsmasq
systemctl disable --now dnsmasq
# Vérifier la config réseau
grep -q "source /etc/network/interfaces.d/*" /etc/network/interfaces || \
echo "source /etc/network/interfaces.d/*" >> /etc/network/interfaces
2.2 Firewall Datacenter (API Proxmox)
Configurer le firewall une seule fois. Ces règles ne changent jamais.
D’abord, ajouter les règles fixes (le firewall est encore désactivé, les règles sont prêtes mais inactives) :
POST /cluster/firewall/rules
{ "type": "in", "action": "ACCEPT", "proto": "tcp", "dport": "2244", "enable": 1, "comment": "SSH access" }
POST /cluster/firewall/rules
{ "type": "in", "action": "ACCEPT", "proto": "tcp", "dport": "8006", "enable": 1, "comment": "Web UI & API access" }
POST /cluster/firewall/rules
{ "type": "in", "action": "ACCEPT", "macro": "DHCPfwd", "enable": 1, "comment": "DHCP global" }
POST /cluster/firewall/rules
{ "type": "in", "action": "ACCEPT", "macro": "DNS", "enable": 1, "comment": "DNS global" }
Ensuite, activer le firewall (les règles sont déjà en place, pas de coupure) :
PUT /cluster/firewall/options
{
"enable": 1,
"policy_in": "DROP"
}
2.3 Firewall Nœud (API Proxmox)
D’abord, ajouter la règle FORWARD DROP globale (inactive tant que nftables n’est pas activé) :
POST /nodes/{node}/firewall/rules
{
"type": "forward",
"action": "DROP",
"source": "10.200.0.0/16",
"dest": "10.200.0.0/16",
"enable": 1,
"comment": "Block inter-zone"
}
Cette règle doit toujours rester en dernière position. Toutes les règles FORWARD ACCEPT ajoutées par la suite doivent être insérées avant elle.
Ensuite, activer nftables (la règle DROP est déjà en place) :
PUT /nodes/{node}/firewall/options
{
"enable": 1,
"nftables": 1
}
2.4 Déployer la VM Warpgate (à voir pour automatiser)
Créer une VM Debian cloud-init sur vmbr0, installer Docker, déployer Warpgate, configurer le SSO Keycloak. Voir le plan d’implémentation pour les détails.
Dans keycloak :
Ajouter un client dans keycloak :
- Client type : OpenId Connect
- Client ID : warpgate-pve5
- Name : warpgate-pve5
- Client authetification : On
- Authorization : off
- Authentification flow :
- Standard flow : on
- Direct access grants : on
- tout le reste en off
- Valid redirect URIs :
https://<ip-ou-domaine-warpgate>:8888/@warpgate/api/sso/return
Ensuite, une fois le client créé, récupérer le Client Secret dans l’onglet credentials.
Ensuite dans le fichier de config de warpgate, ajouter la partie sso_providers :
Voici une partie du fichier de configuration de warpgate (warpgate.yaml) :
sso_providers:
- name: keycloak
label: "Se connecter avec Edu-Kit"
provider:
type: custom
client_id: warpgate-pve4
client_secret: WceJlnpob34CEFb4TcMJhi6Pb0bMhyH3
issuer_url: https://keycloak.edu-kit.fr/realms/edukit
scopes: ["openid", "email"]
recordings:
enable: true
path: /data/recordings
external_host: 10.4.0.137:8888
database_url: sqlite:/data/db
ssh:
enable: true
listen: '[::]:2222'
external_port: null
external_host: null
keys: /data/ssh-keys
host_key_verification: prompt
inactivity_timeout: 5m
keepalive_interval: null
http:
listen: '[::]:8888'
external_port: null
external_host: null
certificate: /data/tls.certificate.pem
key: /data/tls.key.pem
trust_x_forwarded_headers: false
session_max_age: 30m
cookie_max_age: 1day
sni_certificates: []
kubernetes:
enable: true
listen: '[::]:8443'
external_port: null
external_host: null
certificate: /data/tls.certificate.pem
key: /data/tls.key.pem
session_max_age: 30m
mysql:
enable: true
listen: '[::]:33306'
external_port: null
external_host: null
Redémarrer ensuite le conteneur warpgate.
Ajouter une route statique sur la VM Warpgate (dans /etc/netplan/50-cloud-init.yaml) :
Il faut spécifier l’IP du proxmox dans via: …
network:
version: 2
ethernets:
eth0:
match:
macaddress: "bc:24:11:4a:6a:f0"
dhcp4: true
set-name: "eth0"
# Ajouter la routes ci-dessous (à adapter selon votre configuration)
routes:
- to: 10.200.0.0/16
via: <ip proxmox>
netplan apply
Ensuite, il faut créer un token API warpgate. Cliquer en haut à droite sur le nom d’utilisateur (admin) puis cliquer sur “API tokens” et enfin sur “create a token”.
Récupérer le token.
Pour utiliser l’api warpgate :
authentification dans postman : api key
key = X-Warpgate-Token
valut = token
3. Création d’un utilisateur dans edu-kit
Déclencheur : un prof crée un utilisateur (étudiant ou prof) dans l’application.
Étape 1 - Créer l’utilisateur dans Keycloak
L’application crée déjà l’utilisateur dans Keycloak. S’assurer que l’email est renseigné et vérifié.
Étape 2 - Créer l’utilisateur dans Warpgate
POST /@warpgate/admin/api/users
{
"username": "{email_utilisateur}"
}
Réponse : retourne l’objet utilisateur avec son
id.
Ensuite il faut récupérer la liste des utilisateurs afin de récupérer l’id de l’utilisateur créé :
GET /@warpgate/admin/api/users
Étape 3 - Associer le SSO à l’utilisateur Warpgate
Ajouter le credential SSO avec l’email correspondant au compte Keycloak :
POST /@warpgate/admin/api/users//credentials/sso
{
"provider": "keycloak",
"email": "student1@edukit.dev"
}
Étape 4 - Créer un rôle personnel pour l’utilisateur
POST /@warpgate/admin/api/roles
{
"name": "",
"description": "string"
}
Pour récupérer l’id du role, lister les roles et récupérer l’id du bon rôle :
GET /@warpgate/admin/api/roles
Étape 5 - Assigner le rôle à l’utilisateur
POST /@warpgate/admin/api/users//roles/
{
}
Résumé du flux
Prof crée un utilisateur
│
├──► Keycloak : créer le compte avec email
│
├──► Warpgate : créer l'utilisateur
│
├──► Warpgate : ajouter le credential SSO (email)
│
├──► Warpgate : créer le rôle "user-{user_id}"
│
└──► Warpgate : assigner le rôle à l'utilisateur
4. Création d’un environnement de travail
Déclencheur : un prof crée un environnement de travail dans edu-kit et y associe un groupe + un modèle de VM.
Étape 1 - Créer la zone SDN
POST /cluster/sdn/zones
{
"zone": "env{id}",
"type": "simple",
"ipam": "pve",
"dhcp": "dnsmasq"
}
Contrainte : l’ID de zone est alphanumérique, max 8 caractères. Actuellement nous déployons des réseaux en /24 soit 254 réseaux disponible donc max 254 environnement de travail. l’id doit strictement correspondre à l’addresse du réseau. Exemple :
- env1
- réseau env1 : 10.200.1.0/24
- env2
- réseau env2 : 10.200.2.0/24
Il faut donc soit faire une requête api pour récupérer les env{id} existant et donc déduire les env{id} disponibles, ou alors, stocker en base les env id.
Étape 2 - Créer le VNet
POST /cluster/sdn/vnets
{
"vnet": "vnet{id}",
"zone": "env{id}"
}
Idem que ci-dessus, il faudra utiliser un env. A savoir que pour respecter une certaine logique, l’id d’un vnet sera le même que celui de son env associé. (ex: env1 avec vnet1).
Étape 3 - Créer le Subnet
POST /cluster/sdn/vnets/vnet{id}/subnets
{
"subnet": "10.200.{id}.0/24",
"type": "subnet",
"gateway": "10.200.{id}.1",
"snat": 1,
"dhcp-range": "start-address=10.200.{id}.10,end-address=10.200.{id}.200"
}
Étape 4 - Appliquer le SDN
PUT /cluster/sdn
Important : attendre que la tâche se termine avec succès avant de continuer.
Étape 5 - Ajouter la règle firewall FORWARD ACCEPT
POST /nodes/{node}/firewall/rules
{
"type": "forward",
"action": "ACCEPT",
"source": "+sdn/vnet{id}-all",
"dest": "+sdn/vnet{id}-all",
"enable": 1,
"comment": "Allow intra env{id}"
}
Important : cette règle doit être insérée AVANT la règle “Block inter-zone” (DROP). Utiliser le paramètre
pospour spécifier la position, ou réordonner après insertion. Vérifier le format exact de référence aux IPSets (+sdn/vnet{id}-allou+vnet{id}-all).En gros, idem que ci-dessus, il faut utiliser l’id cohérentes aux éléments précédents.
Étape 6 - Ajouter un target group dans warpgate
POST /@warpgate/admin/api/target-groups
{
"name": "Environnement de travail x",
"description": "string",
"color": "Primary"
}
Étape 7 - Créer un rôle pour l’environnement de travail
POST /@warpgate/admin/api/roles
{
"name": "Environnement de travail x",
"description": "string"
}
Ensuite on peut lister tous les rôles pour pouvoir récupérer l’id du rôle créé :
GET /@warpgate/admin/api/roles
On peut aussi lister tous les utilisateurs pour récupérer l’id des user profs :
GET /@warpgate/admin/api/users
Étape 8 - Assigner tous les utilisateurs prof au rôle de l’environnement de travail
A faire pour chaque professeur
POST /@warpgate/admin/api/users//roles/
{
}
Résumé du flux
Prof crée un environnement
│
├──► Proxmox SDN : créer zone → VNet → subnet
│
├──► Proxmox SDN : appliquer
│
└──► Proxmox Firewall : ajouter FORWARD ACCEPT intra-VNet
│
└──► Warpgate Target groupe : ajouter un target group dans warpget
│
└──► Warpgate Rôle env travail : créer rôle pour l'environnement de travail
│
└──► Warpgate Rôle en travail prof : Ajouter tous les porfs dans le groupe de l'env de travail
5. Provisionnement des VMs
Déclencheur : le prof clique sur “Provisionner” dans la section Machines Virtuelles. Edu-kit crée X VMs (une par membre du groupe) et les affecte automatiquement.
Étape 1 - Créer/cloner les VMs (existant)
Edu-kit fait déjà ça via l’API Proxmox et cloud-init. La seule modification : configurer l’interface réseau sur le VNet SDN au lieu de vmbr0. A savoir qu’il faudra utiliser le bon id du vnet selon l’environnement de travail.
Pour lister les différents vnet :
GET /api2/json/cluster/sdn/vnets
Ensuite pour modifier la carte réseau d’une vm pour y associer le bon vnet :
(à savoir qu’il faut utiliser le vnet id correspondant à l’environnement de travail comme détaillé plus haut)
PUT /api2/json/nodes/{node}/qemu/{vmid}/config
{
"net0": "virtio,bridge=vnet{id}",
"ipconfig0": "ip=dhcp"
}
Étape 2 - Créer un target SSH dans Warpgate pour chaque VM
Attendre que la VM ait reçu son IP DHCP (vérifiable via l’IPAM Proxmox ou le guest agent).
Dès qu’on a récupérer l’ip de la VM, il faut créer le target de la vm dans warpgate.
Nous allons avoir besoins de récupérer l’id du groupe de target. Pour cela, lister les groupes de target :
POST /@warpgate/admin/api/target-groups
Pour le paramètre host, c’est ici qu’il faudra mettre l’ip de la vm.
Il faudra également que la vm ait la clé publique de warpgate.
POST /@warpgate/admin/api/targets
{
"name": "env-vm",
"options": {
"kind": "Ssh",
"host": "10.200.1.1",
"port": 22,
"username": "root",
"allow_insecure_algos": true,
"auth": {
"kind": "PublicKey"
}
},
"groupe_id": ""
}
Possibilité de récupérer la clé publique de wargate de cette façon :
GET /@warpgate/admin/api/ssh/own-keys
Étape 3 - Assigner le target au rôle de l’étudiant, au rôle de l’environnement de travail et au rôle admin
Chaque étudiant a un rôle personnel user-{user_id} (créé à l’étape 3 de la section “Création d’un utilisateur”).
Il faut également ajouter le target au role de l’environnement de travail, et aussi au role admin.
Pour récupérer la liste des targets :
GET /@warpgate/admin/api/targets
Pour récupérer la liste des rôles :
GET /@warpgate/admin/api/targets
Puis utiliser l’id du target et des rôles souhaité pour chacun des rôles.
A faire 3 fois avec les différents rôles (role élèves, rôle environnement de travail et rôle admin)
POST /@warpgate/admin/api/targets//roles/
Résumé du flux
Prof provisionne les VMs
│
├──► Proxmox : créer/cloner les VMs sur vnet{id} (existant)
│
│ Pour chaque VM :
│ │
│ ├──► Proxmox : Configurer la carté réseau de la vm pour utiliser le bon vnet
│ │
│ ├──► Warpgate : créer le target SSH avec le bon groupe de target
│ │
│ ├──► Warpgate : assigner le target au rôle de l'étudiant
│ │
│ └──► Warpgate : assigner le target au rôle de l'environnement de travail
│ │
│ └──► Warpgate : assigner le target au rôle de l'admin
│
└──► Fin
6. Ouverture de ports (accès services web des VMs)
Déclencheur : l’étudiant ou le prof ajoute l’url de sont web (http://ip_de_la_vm:port) dans les paramètres d’une VM depuis l’interface edu-kit afin de pouvoir accéder l’interface web de ce qu’il a installé sur sa vm (exemple : glpi, ou tout autre service ayant une interface web.)
Étape 1 - Créer un target HTTP dans Warpgate
En description, on peut mettre l’id de la vm ou autre élément afin d’identifier à quel vm appartient ce target http.
POST /@warpgate/admin/api/targets
{
"name": "le site web de ma vm",
"description" : "<vmid>",
"options": {
"kind": "Http",
"url": "",
"allow_insecure_algos": true,
"tls": {
"mode": "Preferred",
"verify": false
}
},
"group_id": ""
}
Réponse : retourne l’objet target avec son
id. Vérifier le format exact du payload dans la doc API de votre instance Warpgate.
Étape 2 - Assigner les rôles de l’étudiant, de l’environnement de travail et de l’admin au target
(à faire pour chaque rôle)
POST /@warpgate/admin/api/targets//roles/
Étape 4 - Récupérer le lien d’accès depuis Warpgate
On peut lister tous les targets pour pouvoir ensuite filtrer le résultat par rôle et par type. Le but étant de pouvoir avoir directement l’url qui redirige sur la page web du target http.
GET /@warpgate/admin/api/targets
L’URL d’accès pour l’étudiant est au format :
https://{warpgate_host}:8888/?warpgate-target={target_name}
Edu-kit récupère cette information via l’API et affiche le lien cliquable dans l’interface de la VM.
Étape 5 - Suppression d’un target http
Quand l’étudiant ou le prof retire un “port” :
DELETE /@warpgate/admin/api/targets/{target_id}
Résumé du flux
Étudiant ajoute le port 80 sur sa VM
│
├──► Warpgate : créer target HTTP "env1-vm102-http-80"
│ (url: http://10.200.1.11:80)
│
├──► Warpgate : assigner au rôle étudiant
│
├──► Warpgate : assigner au rôle de l'environnement de travail
│
├──► Warpgate : assigner au rôle de l'utilisateur admin
│
├──► Warpgate : récupérer les infos du target via l'API
│
├──► Edu-kit : afficher le lien dans l'interface
│ L'étudiant clique → SSO Keycloak → service web affiché
└──► Edu-kit : supprimer un port http d'une vm
Warpgate supprimer le target http
7. Connexion SSH d’un étudiant
Aucune action côté edu-kit. L’étudiant se connecte directement :
ssh {username}:{target_name}@{ip_warpgate} -p 2222
Exemple :
ssh jean.dupont@edukit.dev:env1-vm102@10.4.0.170 -p 2222
Warpgate redirige vers la page de login Keycloak (SSO). L’étudiant s’authentifie, puis sa session SSH s’ouvre sur la VM.
L’étudiant ne voit que les targets associés à son rôle. Le prof voit toutes les VMs de ses environnements.
8. Destruction des VMs
Déclencheur : le prof détruit les VMs d’un environnement.
Pour chaque VM :
Étape 1 - Supprimer les targets Warpgate (SSH + HTTP) :
Supprimer le target SSH et tous les targets HTTP associés à la VM :
/@warpgate/admin/api/targets
DELETE /@warpgate/admin/api/targets/{target_id_http_port1}
...
Étape 2 - Arrêter et supprimer la VM (existant) :
Déjà géré par edu-kit
9. Destruction d’un environnement
Déclencheur : le prof supprime un environnement de travail.
Étape 1 - Détruire les VMs et les éléments associés à l’environnement de travail.
Pour lister toutes les vm à supprimer d’un environnement de travail, il faut lister les targets groups
GET /@warpgate/admin/api/target-groups
Ensuite, quand on liste les vms, on peut voir leur target groups
GET /@warpgate/admin/api/targets
Ainsi, à partir de ces données, on peut supprimer toutes les vm comprenant l’id du target group.
DELETE /@warpgate/admin/api/targets/
Une fois cela fait, on peut supprimer le targets group
DELETE /@warpgate/admin/api/target-groups/{id}
Ensuite il faut également lister les rôles pour récupérer l’id du rôle associé à l’environnement de travail
GET /@warpgate/admin/api/roles
Une fois l’id du rôle récupéré, on peut supprimer le rôle en question
DELETE /@warpgate/admin/api/role/{id}
Étape 2 - Supprimer la règle firewall FORWARD ACCEPT
Lister les règles du nœud pour trouver celle correspondant à l’environnement :
GET /api2/json/nodes//firewall/rules
Identifier la règle par son commentaire (Allow intra env{id}) et la supprimer :
DELETE /api2/json/nodes//firewall/rules/
Attention : la suppression se fait par position (
pos= position). S’assurer de ne pas supprimer la mauvaise règle.
Étape 3 - Supprimer le SDN
# Lister les subnets
GET /api2/json/cluster/sdn/vnets/{vnet}/subnets
# Supprimer le subnet
DELETE /api2/json/cluster/sdn/vnets/vnet/subnets/
# Lister les vnets
GET /api2/json/cluster/sdn/vnets
# Supprimer le VNet
DELETE /cluster/sdn/vnets/vnet{id}
# Lister les zones
GET /api2/json/cluster/sdn/zones
# Supprimer la zone
DELETE /api2/json/cluster/sdn/zones/
# Appliquer
PUT /api2/json/cluster/sdn
Note : le format de l’ID du subnet dans l’API est probablement
vnet{id}-10.200.{id}.0-24. Vérifier sur votre installation.
10. Suppression d’un utilisateur
Déclencheur : un utilisateur est supprimé de edu-kit.
Étape 1 - Supprimer les targets associés
Si l’utilisateur a encore des VMs actives, supprimer les targets Warpgate correspondants.
Pour cela, lister les utilisateurs warpgate afin de trouver son id
GET /@warpgate/admin/api/users
Lister les rôles de l’utilisateurs afin de récupérer l’id du rôle personnel de l’utilisateur
GET /@warpgate/admin/api/users/{id}/roles
Lister tous les targets associés au rôle de l’utilisateur
GET /@warpgate/admin/api/role/{id}/targets
Pour chaque target associé à ce rôle, les supprimer
DELETE /@warpgate/admin/api/targets/{id}
Étape 2 - Supprimer le rôle personnel
DELETE /@warpgate/admin/api/roles/{role_id}
Étape 3 - Supprimer l’utilisateur Warpgate
DELETE /@warpgate/admin/api/users/{user_id}
Étape 4 - Supprimer l’utilisateur Keycloak
Fait par edu-kit (existant).
Points d’attention
SNAT et iptables
Le SNAT est toujours activé. Ne jamais utiliser le toggle SNAT dans l’UI ou l’API Proxmox pour activer/désactiver internet - il cause des doublons de règles iptables (bug connu Proxmox). Si un contrôle internet on/off est nécessaire à l’avenir, gérer les règles iptables directement en SSH.
Ordre des règles firewall du nœud
Les règles FORWARD ACCEPT doivent toujours être avant la règle FORWARD DROP globale. Quand on ajoute une nouvelle règle, utiliser le paramètre pos pour l’insérer à la bonne position.
IPSets auto-générés
Les IPSets +sdn/vnet{id}-all sont auto-générés par Proxmox SDN après un Apply. Ils contiennent le subnet du VNet et se mettent à jour automatiquement. Ne pas les créer manuellement.
Warpgate API
La documentation interactive de l’API Warpgate est accessible sur chaque instance : https://{warpgate_host}:8888/@warpgate/admin/. Les payloads exacts peuvent varier selon la version - toujours se référer à cette doc.
Tech preview
Le SDN DHCP et le firewall nftables de Proxmox sont en “tech preview”. Surveiller les mises à jour Proxmox pour d’éventuels changements de comportement.