Sécurité des API

Les API sont l'épine dorsale des applications modernes. Protéger les endpoints REST et GraphQL contre les accès non autorisés, l'injection de code et les abus est fondamental pour la sécurité de l'application.

OWASP API Security Top 10

1. Broken Object Level Authorization

Failles permettant d'accéder aux objets d'autres utilisateurs en manipulant les IDs dans les requêtes.

  • Toujours valider que l'utilisateur a la permission d'accéder à la ressource demandée
  • Utiliser des identifiants aléatoires (UUID) au lieu d'IDs séquentiels
  • Mettre en place des tests automatisés d'autorisation

2. Broken Authentication

Vulnérabilités dans les mécanismes d'authentification permettant d'usurper l'identité d'autres utilisateurs.

  • Mettre en place le MFA (Multi-Factor Authentication)
  • Utiliser des tokens avec un temps d'expiration court
  • Mettre en place le rate limiting sur les endpoints de connexion
  • Valider les tokens sur toutes les requêtes

3. Broken Object Property Level Authorization

Exposition ou modification de propriétés qui devraient être restreintes (mass assignment).

4. Unrestricted Resource Consumption

Absence de limites sur les requêtes permettant le DoS et une consommation excessive de ressources.

5. Broken Function Level Authorization

Utilisateurs accédant à des fonctions administratives en manipulant les endpoints.

Authentification et Autorisation

OAuth 2.0

Framework d'autorisation standard de l'industrie pour la délégation d'accès.

  • Authorization Code Flow : Pour les applications web server-side
  • PKCE : Proof Key for Code Exchange pour les SPAs et le mobile
  • Client Credentials : Pour la communication machine-to-machine
  • Refresh Tokens : Pour maintenir les sessions sans ré-authentification

JSON Web Tokens (JWT)

  • Utiliser des algorithmes sécurisés (RS256, ES256) au lieu de HS256 lorsque possible
  • Valider l'issuer (iss), l'audience (aud) et l'expiration (exp)
  • Ne pas stocker de données sensibles dans le payload (le JWT est décodable)
  • Mettre en place la token rotation et le blacklisting pour le logout
  • Utiliser des short-lived access tokens (15 min) avec des refresh tokens

API Keys

  • Utiliser pour l'authentification de services, pas des utilisateurs finaux
  • Faire tourner les keys périodiquement
  • Mettre en place différents niveaux de permission par key
  • Surveiller l'utilisation et détecter les anomalies

Rate Limiting et Throttling

Stratégies de Rate Limiting

  • Fixed Window : Limite fixe par fenêtre de temps (ex : 100 req/min)
  • Sliding Window : Fenêtre glissante plus précise
  • Token Bucket : Permet des bursts contrôlés
  • Leaky Bucket : Traite les requêtes à un débit constant

Implémentation

  • Limites différentes par endpoint et tier d'utilisateur
  • Headers informatifs : X-RateLimit-Limit, X-RateLimit-Remaining
  • Réponse 429 Too Many Requests avec le header Retry-After
  • Utiliser Redis pour le stockage distribué des compteurs

API Gateways

Couche centralisée pour gérer, surveiller et protéger les API.

Fonctionnalités Principales

  • Authentication & Authorization : Validation centralisée
  • Rate Limiting : Protection contre les abus
  • Request/Response Transformation : Adaptation des formats
  • Logging & Monitoring : Visibilité complète
  • Caching : Amélioration des performances
  • Load Balancing : Répartition de la charge

Solutions Populaires

  • Kong : Gateway open-source basé sur Nginx
  • AWS API Gateway : Solution managed d'AWS
  • Apigee : Plateforme enterprise de Google
  • Azure API Management : Gateway de Microsoft
  • Tyk : Gateway open-source en Go

Sécurité REST vs GraphQL

REST API Security

  • Utiliser le versioning (/v1/, /v2/) pour la backward compatibility
  • Mettre en place HATEOAS pour la découverte des ressources
  • Valider les headers Content-Type et Accept
  • Utiliser HTTPS exclusivement
  • Mettre en place CORS correctement

GraphQL Security

  • Query Depth Limiting : Empêcher les queries récursives
  • Query Complexity Analysis : Calculer le coût avant d'exécuter
  • Disable Introspection : En production, désactiver le schema introspection
  • Field-Level Authorization : Contrôler l'accès par champ
  • Persistent Queries : Whitelist des queries autorisées

Validation et Assainissement des Inputs

Validation des Input

  • Valider le type, le format, la longueur et la plage de tous les inputs
  • Utiliser des schemas (JSON Schema, OpenAPI) pour la validation automatique
  • Whitelist des valeurs acceptées lorsque possible
  • Rejeter les requêtes avec des données invalides (fail securely)

Prévention de l'Injection

  • SQL Injection : Utiliser des prepared statements et des ORMs
  • NoSQL Injection : Valider et assainir les queries
  • Command Injection : Éviter l'exécution de commandes système
  • LDAP Injection : Échapper les caractères spéciaux

Surveillance et Logging

Logs Essentiels

  • Toutes les tentatives d'authentification (succès et échec)
  • Modifications des données sensibles
  • Échecs d'autorisation
  • Rate limiting violations
  • Erreurs et exceptions

Métriques de Sécurité

  • Taux de requêtes par endpoint
  • Latence et timeouts
  • Status codes (notamment 401, 403, 429)
  • Schémas de trafic anormaux

Meilleures Pratiques

  • Utiliser HTTPS/TLS 1.3 exclusivement
  • Mettre en place des security headers (HSTS, CSP, X-Frame-Options)
  • Versionner les API pour permettre des updates sécurisés
  • Documenter les API avec OpenAPI/Swagger
  • Mettre en place des health checks et une graceful degradation
  • Utiliser des UUIDs au lieu d'IDs séquentiels
  • Ne pas exposer les stack traces ni les messages d'erreur détaillés
  • Mettre en place un timeout sur toutes les opérations
  • Réaliser des tests de sécurité automatisés (DAST)

Outils de Test

  • Postman : Tests manuels et automatisés d'API
  • Burp Suite : Proxy et scanner de vulnérabilités
  • OWASP ZAP : Scanner automatique open-source
  • Insomnia : Client REST et GraphQL
  • GraphQL Voyager : Visualisation du schema GraphQL

La sécurité des API nécessite une approche multicouche, combinant une authentification robuste, une autorisation granulaire, une validation rigoureuse des inputs, le rate limiting, une surveillance continue et des tests réguliers. Les API devenant de plus en plus la cible principale des attaques, investir dans la sécurité dès la conception est fondamental pour protéger les données et maintenir la confiance des utilisateurs.