Les API exposent des données et des services essentiels, ce qui en fait des cibles privilégiées pour les attaquants.
Cet article couvre les modèles d’authentification, la gestion des permissions, la protection contre les attaques courantes et la mise en place d’une surveillance proactive pour vos API REST et GraphQL.
Plan de l’article
- Modèles d’authentification : OAuth2, JWT, API Keys
- Gestion des permissions : RBAC et ABAC
- Sécurisation dans Express (Node.js)
- Sécurisation dans Django REST Framework
- Sécurisation dans Apollo Server (GraphQL)
- Protection contre les attaques : injection, brute-force, DoS
- Monitoring et alerting des API
- Automatisation des tests de sécurité
- Conclusion et recommandations
Modèles d’authentification
OAuth2
# Exemple de configuration d’un flow "authorization_code" avec Express
const oauth2 = require('simple-oauth2').create({
client: { id: CLIENT_ID, secret: CLIENT_SECRET },
auth: { tokenHost: 'https://auth.example.com' }
});
Astuce : Préférez le flow
authorization_code
avec PKCE pour les applications publiques (mobile, SPAs).
JSON Web Tokens (JWT)
// Création d’un JWT
const jwt = require('jsonwebtoken');
const token = jwt.sign({ userId: user.id }, JWT_SECRET, { expiresIn: '1h' });
Attention : Stockez JWT_SECRET de façon sécurisée (ex. HashiCorp Vault).
API Keys
- Génération d’API Key unique pour chaque client
- Transmission dans l’en-tête
Authorization: ApiKey <clé>
Gestion des permissions
RBAC (Role-Based Access Control)
# Django REST Framework: définition d’un groupe et permissions
from django.contrib.auth.models import Group, Permission
admin_group, _ = Group.objects.get_or_create(name='API Admin')
perm = Permission.objects.get(codename='change_user')
admin_group.permissions.add(perm)
ABAC (Attribute-Based Access Control)
- Politique basée sur les attributs utilisateur, la ressource et le contexte
- Exemple : autoriser la lecture si
user.department == resource.owner_department
Sécurisation dans Express (Node.js)
// Protection HTTP et rate limit
const helmet = require('helmet');
const rateLimit = require('express-rate-limit');
app.use(helmet());
app.use(rateLimit({ windowMs: 15 * 60 * 1000, max: 100 }));
Astuce : Activez CORS de façon restrictive (origins autorisés seulement).
Sécurisation dans Django REST Framework
# settings.py
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': ('rest_framework.authentication.TokenAuthentication',),
'DEFAULT_THROTTLE_CLASSES': ('rest_framework.throttling.UserRateThrottle',),
'DEFAULT_THROTTLE_RATES': {'user': '100/hour'}
}
Sécurisation dans Apollo Server (GraphQL)
const depthLimit = require('graphql-depth-limit');
const { ApolloServer } = require('apollo-server');
const server = new ApolloServer({
typeDefs,
resolvers,
context: ({ req }) => {
const token = req.headers.authorization || '';
return { user: authenticate(token) };
},
validationRules: [depthLimit(5)]
});
Attention : Limitez la profondeur et la complexité des requêtes GraphQL pour prévenir les attaques par requête lourde.
Protection contre les attaques
- Injection (SQL, NoSQL) : utilisez des requêtes paramétrées ou ORM
- Brute-force : limitez les tentatives et bannissez automatiquement
- DoS : déployez des WAF (ModSecurity, Cloudflare) et rate limiting
Monitoring et alerting des API
# Exemple configuration Prometheus pour un endpoint d’API
- job_name: 'api'
static_configs:
- targets: ['api.example.com:9000']
Astuce : Surveillez spécialement les codes 4xx/5xx et les latences élevées.
Automatisation des tests de sécurité
- Postman avec scripts Newman
- OWASP ZAP pour scans DAST
- Trivy pour l’analyse des images Docker
newman run collection.json --environment env.json
zap-cli quick-scan http://api.example.com
Conclusion et recommandations
La sécurité des API nécessite une approche globale :
- Authentification forte (OAuth2, JWT)
- Contrôle fin des permissions (RBAC/ABAC)
- Protection contre les attaques courantes
- Surveillance et tests automatisés
Mettez en place ces bonnes pratiques pour garantir la fiabilité et la sécurité de vos API.