Utiliser le WAF avec des WebSockets
Cet article vous permettra de configurer Visiativ Cyber WAF pour fonctionner dans un environnement applicatif utilisant le protocole WebSocket.
Préambule
WebSocket est un protocole de communication utilisé pour établir une connexion interactive en temps réel entre un client (comme un navigateur web) et un serveur. Contrairement au modèle classique HTTP où le client doit demander les informations au serveur, les WebSockets permettent une communication bidirectionnelle. La plupart des navigateurs modernes prennent en charge WebSocket, notamment Chrome, Firefox, Microsoft Edge, Opera et Safari.
Le protocole WebSocket est différent du protocole HTTP, mais son utilisation est pleinement compatible avec HTTP ce qui permet aux applications utilisant WebSocket de s'intégrer plus facilement dans les infrastructures existantes en utilisant les ports HTTP standards 80 et 443, permettant ainsi l'utilisation des règles de pare-feu existantes.
Le mécanisme utilisé pour mettre à niveau la connexion de HTTP vers WebSocket utilise les en-têtes Upgrade
et Connection
. Il est à noter que l'en-tête Upgrade
est un en-tête de type saut par saut, donc lorsqu'un serveur proxy (comme Visiativ Cyber WAF) intercepte une demande de mise à niveau d'un client, il doit envoyer sa propre demande de mise à niveau au serveur destinataire.
Le paramétrage nécessaire pour une utilisation avec Visiativ Cyber WAF est réalisé à l'aide de la fonctionnalité En-têtes HTTP.
Paramétrage des en-têtes HTTP
Création du groupe de sécurité
La première étape consiste à créer un nouveau groupe de sécurité avec un paramétrage des en-têtes HTTP permettant la mise à niveau de la connexion HTTP vers WebSocket. Les en-têtes sont à positionner comme ci-dessous.
- Groupe de sécurité
- Json
Sens | Opération | En-tête | Valeur | Protocole | Description |
---|---|---|---|---|---|
Requête | Ajout | Upgrade | Valeur de l'en-tête Upgrade fournit par le client | HTTPS | L'en-tête Upgrade doit être explicitement transmis au serveur applicatif |
Requête | Ajout | Connection | Upgrade | HTTPS | Mise à niveau de la connexion |
Réponse | Ajout | Server | - | HTTP + HTTPS | Le type de serveur est masqué par sécurité |
{
...
"security": [
...
{
"description": "WebSockets",
"headers": {
"request": [
{
"description": "Upgrade header value is not forwarded by default (hop-by-hop header). Need to be explicitly forwarded",
"action": "create",
"name": "Upgrade",
"value": [
{
"headerType": "http",
"headerValue": "Upgrade"
}
],
"protocol": [
"https"
]
},
{
"description": "Upgrade connection to websocket",
"action": "create",
"name": "Connection",
"value": [
{
"headerType": "static",
"headerValue": "Upgrade"
}
],
"protocol": [
"https"
]
}
],
"response": [
{
"description": "Override Server header",
"action": "create",
"name": "Server",
"value": [
{
"headerType": "static",
"headerValue": ""
}
],
"protocol": [
"http",
"https"
]
}
]
}
}
]
...
}
Création du groupe d'URL
Une fois le nouveau groupe de sécurité créé, il vous suffit de l'affecter à un nouveau groupe d'URL's correspondant aux WebSockets de votre application. Si vous avez de multiples URL's concernées par des WebSockets, il est conseillé de cibler les URL's par une expression régulière.
Dans l'exemple ci-dessous, les WebSockets sont activées pour les URL's commençant par /api/websocket
et /backoffice-websocket
.
- Groupe d'URL's
- Json
Paramètre | Valeur |
---|---|
Type | Expression régulière sensible à la casse |
URL | ^/(api/websocket|backoffice-websocket) |
Description | WebSockets URL's |
WAF | Activé |
Cache | Désactivé |
Groupe de serveurs | Backend concerné |
Groupe de sécurité | Nouveau groupe de sécurité créé précédement |
{
...
"locations": [
...
{
"description": "WebSockets URLs",
"url": {
"path": "^/(api/websocket|backoffice-websocket)",
"type": "regex-case-sensitive"
},
"waf": {
"enabled": true
},
"cache": {
"enabled": false
},
"backend": <Backend index value>,
"security": <Security group index value>
}
],
...
}