Apache APISIX renforce la sécurité des API avec le plugin CSRF
API7.ai
February 23, 2022
Le point clé du lancement d'une attaque CSRF (cross-site request forgery) est de rendre le serveur cible incapable de distinguer si la source de nombreuses requêtes provient d'un utilisateur réel ou d'un attaquant. Le flux général de l'attaque est que l'attaquant attire d'abord l'utilisateur à naviguer vers une page web fournie par l'attaquant. Cette page contient une requête qui est automatiquement envoyée au serveur cible. La page se charge normalement et la requête est automatiquement envoyée au serveur. Pour le serveur, la requête semble exactement la même que celle normalement envoyée par l'utilisateur, sans savoir qu'elle a été initiée par l'attaquant à l'insu de l'utilisateur. Comme la requête transporte certaines des informations d'identification de l'utilisateur, l'attaquant peut accéder aux informations de l'utilisateur en analysant ces informations d'identification, créant ainsi un risque de sécurité.
Cet article présente csrf
, le plugin de sécurité CSRF pour Apache APISIX, et détaille comment sécuriser vos informations API dans Apache APISIX à l'aide du plugin csrf
.
Introduction au Plugin
Le plugin csrf
est implémenté sur la base du schéma Double Submit Cookie
. Comme défini dans RFC 7231#section-4.2.1, nous considérons les méthodes GET
, HEAD
et OPTIONS
comme des méthodes sécurisées. Selon cette convention, le plugin csrf
laissera passer directement ces trois méthodes, mais vérifiera les autres méthodes et interceptera toute requête non sécurisée.
Pour se défendre contre les attaques CSRF, nous devons créer un jeton ou un identifiant qui ne peut pas être forgé et nous assurer qu'il n'est pas envoyé avec la requête de l'attaquant. L'utilisateur doit porter dans l'en-tête de la requête le jeton sur lequel repose le plugin csrf
, et le jeton est calculé à l'aide d'une clé de signature. Cela garantit que le jeton ne peut pas être forgé par d'autres, sécurisant ainsi l'API.
Lorsque le plugin csrf
est activé sur une route, toutes les réponses aux requêtes de cette route contiendront un Cookie portant un csrf token
.
L'utilisateur doit porter ce Cookie dans une requête non sécurisée pour cette route et ajouter un champ supplémentaire dans l'en-tête de la requête pour porter le contenu du cookie. Le champ est la valeur name
dans la configuration du plugin, afin que la requête passe les vérifications du plugin CSRF.
L'utilisateur fournit une clé aléatoire dans la configuration du plugin, qui est utilisée par le plugin pour chiffrer les informations du jeton avec un hachage sha256 et générer un jeton CSRF, garantissant ainsi que le jeton ne peut pas être forgé.
Comment Utiliser le Plugin
Activer le Plugin CSRF sur une Route
Créez une route dans APISIX en utilisant l'API Admin et activez le plugin csrf.
curl -i http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"uri": "/hello",
"plugins": {
"csrf": {
"key": "edd1c9f034335f136f87ad84b625c8f1"
}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"127.0.0.1:9001": 1
}
}
}'
Il y a trois paramètres de configuration pour le plugin.
key
: Champ obligatoire, la valeur de la clé secrète aléatoire. L'utilisateur doit fournir une clé aléatoire.expires
: Optionnel, le temps d'expiration de la clé secrète aléatoire, la valeur par défaut est de 7200 secondes. Comme le jeton CSRF est envoyé au client via un Cookie, cette configuration est placée dans la configuration du Cookie pour contrôler le temps d'expiration du Cookie. De plus, le plugin calculera également le temps pour déterminer si le jeton a expiré.name
: Optionnel, le nom du jeton CSRF, la valeur par défaut estapisix-csrf-token
.
Envoyer une Requête
La route est d'abord accédée en utilisant une requête POST
.
curl -i http://127.0.0.1:9080/hello -X POST
Apache APISIX interceptera la requête et retournera une erreur 401
. Dans l'en-tête retourné, vous trouverez un Cookie défini, qui devrait être la valeur par défaut apisix-csrf-token=....
à l'intérieur du Cookie si le champ name
du plugin n'est pas configuré. C'est le jeton CSRF généré par le plugin CSRF. Dans la requête, vous devez vous assurer que la requête porte ce Cookie et que le jeton est écrit dans l'en-tête de la requête.
HTTP/1.1 401 Unauthorized
Set-Cookie: apisix-csrf-token= ${apisix-csrf-token};path=/;Expires=Mon, 13-Dec-21 09:33:55 GMT
{"error_msg":"no csrf token in headers"}
Exemple d'utilisation de JavaScript côté client : lire les Cookies avec js-cookie
et envoyer des requêtes avec axios
.
const token = Cookie.get('apisix-csrf-token');
const instance = axios.create({
headers: {'apisix-csrf-token': token}
});
Si le jeton dans le Cookie ne correspond pas au jeton dans l'en-tête de la requête, la requête sera interceptée par le plugin csrf
, comme montré dans l'exemple suivant.
curl -i http://127.0.0.1:9080/hello -X POST -H 'apisix-csrf-token: ${apisix-csrf-token}' -b 'apisix-csrf-token= ${apisix-csrf-token}'
HTTP/1.1 401 Unauthorized
Set-Cookie: apisix-csrf-token= ${apisix-csrf-token};path=/;Expires=Mon, 13-Dec-21 09:33:55 GMT
{"error_msg":"csrf token mismatch"}
Enfin, utilisez curl
pour vérifier l'accès régulier.
curl -i http://127.0.0.1:9080/hello -X POST -H 'apisix-csrf-token: ${apisix-csrf-token}' -b 'apisix-csrf-token= ${apisix-csrf-token}'
HTTP/1.1 200 OK
En interne, le plugin doit vérifier que le jeton dans le Cookie correspond au jeton porté dans l'en-tête de la requête et recalculer la signature pour vérifier que le jeton est valide.
Désactiver le Plugin
Supprimez les informations de configuration pertinentes pour le plugin csrf
, puis envoyez une requête pour mettre à jour la route afin de désactiver le plugin.
curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"uri": "/hello",
"upstream": {
"type": "roundrobin",
"nodes": {
"127.0.0.1:1980": 1
}
}
}'
Résumé
Cet article décrit en détail comment fonctionne le plugin csrf
et comment l'utiliser. Nous espérons que cet article vous donnera une compréhension plus claire de l'utilisation du plugin pour intercepter les attaques CSRF dans Apache APISIX et facilitera son application dans des scénarios pratiques.
Apache APISIX travaille également actuellement sur des plugins supplémentaires pour soutenir l'intégration de services supplémentaires, donc si vous êtes intéressé, n'hésitez pas à démarrer une discussion dans GitHub Discussion, ou via la liste de diffusion pour communiquer.