Aller au contenu

Rotation sécurisée et révocation des tokens API et admin de Strapi

Apprenez à configurer, automatiser et auditer la rotation et la révocation des tokens dans Strapi 5, à garder les clés visibles pour les opérations, à répondre aux exigences du RGPD et à rester protégé contre les fuites de tokens.

Par l’équipe Revisionary · · 5 min de lecture

MacBook Pro
Photo de AltumCode sur Unsplash

Les développeurs peuvent mettre en place une rotation et une révocation sécurisées et automatisées des tokens API et admin de Strapi 5 en configurant le chiffrement, en utilisant le point d’accès de régénération intégré, en stockant les secrets dans un coffre et en s’appuyant sur les journaux d’audit pour la visibilité et la conformité. Le processus maintient des durées de vie de token courtes, invalide instantanément les anciens tokens et fournit une trace anti‑altération répondant aux exigences d’audit du RGPD.

Pourquoi la rotation des tokens est importante

  • Exposition limitée – Les tokens à courte durée réduisent la fenêtre pendant laquelle un attaquant peut exploiter une clé volée.
  • Conformité – Le RGPD exige la capacité de démontrer quand des données personnelles ont été accédées et par qui ; les journaux d’audit des événements de token fournissent cette preuve.
  • Hygiène opérationnelle – La rotation automatisée supprime le besoin de changements de clés manuels, réduisant les erreurs humaines.
a bunch of blue wires connected to each other
Photo de Scott Rodgerson sur Unsplash

1. Configurer la visibilité persistante des tokens

Strapi n’affiche un token qu’une seule fois après sa création, sauf si une clé de chiffrement est définie. Pour que vos outils CI/CD ou de gestion de secrets puissent lire les tokens, définissez admin.secrets.encryptionKey dans /config/admin.js.

js
// /config/admin.js
module.exports = ({ env }) => ({
  admin: {
    // Chaîne base64 de 32 octets – conservez‑la en sécurité dans un coffre
    secrets: {
      encryptionKey: env('STRAPI_ENCRYPTION_KEY'),
    },
    // Optionnel : personnalisez le sel utilisé pour tous les tokens
    apiToken: {
      salt: env('API_TOKEN_SALT'),
    },
  },
});

Stockez STRAPI_ENCRYPTION_KEY et API_TOKEN_SALT dans un gestionnaire de secrets (p. ex. : HashiCorp Vault, AWS Secrets Manager) et référencez‑les via des variables d’environnement.

2. Choisir des durées de vie appropriées pour les tokens

Strapi 5 vous permet de définir l’expiration des tokens à 7 jours, 30 jours, 90 jours ou Illimitée. Pour les services en production, une durée de 30 jours équilibre sécurité et charge opérationnelle.

bash
# Exemple : créer un token API de 30 jours via l’API REST
curl -X POST https://cms.example.com/admin/api-tokens \
  -H "Authorization: Bearer <admin-token>" \
  -H "Content-Type: application/json" \
  -d '{"name":"frontend‑service","expiresIn":"30d"}'

La réponse contient le token en texte clair une seule fois ; par la suite il est stocké chiffré à l’aide de la clé ci‑dessus.

3. Automatiser la rotation avec le point d’accès de régénération

Strapi a ajouté un point d’accès programmatique permettant de faire pivoter un token sans le supprimer et le recréer :

code
POST /admin/api-tokens/:id/regenerate

Le point d’accès renvoie une nouvelle clé d’accès tout en révoquant automatiquement la précédente.

js
// rotation‑script.js – exécuté depuis le CI tous les 30 jours
const fetch = require('node-fetch');
require('dotenv').config();

const ADMIN_TOKEN = process.env.STRAPI_ADMIN_TOKEN; // stocké dans le coffre
const TOKEN_ID = process.env.TARGET_API_TOKEN_ID; // ID du token à faire pivoter

async function rotate() {
  const res = await fetch(
    `https://cms.example.com/admin/api-tokens/${TOKEN_ID}/regenerate`,
    {
      method: 'POST',
      headers: { Authorization: `Bearer ${ADMIN_TOKEN}` },
    }
  );
  if (!res.ok) throw new Error('Rotation failed');
  const { accessKey } = await res.json();
  console.log('New token:', accessKey);
  // Stockez la nouvelle clé dans le gestionnaire de secrets
  // p. ex. : AWS Secrets Manager put‑secret-value …
}

rotate().catch(console.error);

Ajoutez le script à un travail planifié (GitHub Actions, GitLab CI, Jenkins) et mettez à jour les services dépendants pour qu’ils lisent le secret rafraîchi depuis le coffre.

4. Révocation immédiate lorsqu’une compromission est suspectée

Si vous suspectez la fuite d’un token, révoquez‑le immédiatement via l’interface admin ou l’API :

bash
curl -X DELETE https://cms.example.com/admin/api-tokens/<id> \
  -H "Authorization: Bearer <admin-token>"

Comme le même apiToken.salt est partagé entre les tokens API et admin, modifier le sel invalide tous les tokens existants. C’est une mesure d’urgence puissante.

js
// emergency‑salt‑rotation.js (rotation d’urgence du sel)
require('dotenv').config();
const fetch = require('node-fetch');

const ADMIN_TOKEN = process.env.STRAPI_ADMIN_TOKEN;
const NEW_SALT = require('crypto').randomBytes(32).toString('base64');

async function rotateSalt() {
  const res = await fetch('https://cms.example.com/admin/settings', {
    method: 'PUT',
    headers: {
      Authorization: `Bearer ${ADMIN_TOKEN}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({ apiToken: { salt: NEW_SALT } }),
  });
  if (!res.ok) throw new Error('Salt rotation failed');
  console.log('All tokens invalidated');
}

rotateSalt().catch(console.error);

Après exécution, générez de nouveaux tokens pour les services qui ont encore besoin d’accès.

5. Activer et configurer la journalisation d’audit

Les journaux d’audit capturent les événements create, update, delete et regenerate des tokens, sans stocker les valeurs secrètes réelles. Ils enregistrent également l’adresse IP du demandeur et, le cas échéant, le corps de la requête – des données requises pour des enregistrements compatibles RGPD.

5.1 Activer les journaux d’audit (Enterprise uniquement)

Ajoutez ce qui suit à /config/admin.js :

js
module.exports = ({ env }) => ({
  admin: {
    auditLogs: {
      enabled: true,
      retentionDays: env.int('AUDIT_LOG_RETENTION_DAYS', 180), // conserver 6 mois
      exportMaxRows: env.int('AUDIT_LOG_EXPORT_MAX', 2000000),
    },
  },
});

La rétention par défaut est de 90 jours ; l’allonger aide à satisfaire les attentes du RGPD en matière de « conservation des données ».

5.2 Exporter les journaux pour les revues de conformité

bash
curl -X GET https://cms.example.com/admin/audit-logs/export \
  -H "Authorization: Bearer <admin-token>" \
  -o audit-logs.csv

Le CSV peut être stocké dans un bucket immuable (p. ex. : AWS S3 avec Object Lock) afin de fournir une trace d’audit anti‑altération.

6. Considérations centrées sur le RGPD

ExigenceComment Strapi aide
Minimisation des donnéesLes tokens ne sont jamais stockés en clair après création ; seule la version chiffrée réside dans la base de données.
Droit d’accèsLes journaux d’audit exportés offrent aux personnes concernées une visibilité sur le moment où leurs données personnelles ont été accédées via un token.
Droit à l’effacementSupprimer un token (ou faire pivoter le sel) supprime instantanément sa capacité d’authentification, répondant à une demande de « oubliez‑moi ».
Conservation des donnéesLa rétention configurable des journaux d’audit jusqu’à 180 jours (ou plus) correspond aux politiques de conservation typiques du RGPD.

7. Checklist des meilleures pratiques

  • Définissez admin.secrets.encryptionKey dans /config/admin.js et stockez la clé dans un coffre.
  • Définissez un apiToken.salt unique ; ne le faites pivoter qu’en cas d’urgence.
  • Choisissez une durée de vie (TTL) du token de 30 jours (ou moins) pour tous les services en production.
  • Automatisez la rotation avec le point d’accès POST /admin/api-tokens/:id/regenerate.
  • Stockez les nouveaux tokens dans le gestionnaire de secrets, jamais dans le code ou le dépôt.
  • Activez les journaux d’audit et configurez la rétention pour répondre aux exigences réglementaires.
  • Exportez régulièrement les journaux et archivez‑les dans un stockage immuable.
  • Documentez les procédures de révocation (suppression UI, rotation du sel) dans votre manuel d’intervention.
  • Passez en revue les permissions – assurez‑vous que seuls les rôles privilégiés peuvent créer ou régénérer des tokens (voir /docs/reference/configuration).
  • Testez la rotation dans un environnement de préproduction avant de la déployer en production.

8. Intégration avec Revisionary (optionnel)

Si votre projet utilise déjà le plugin Revisionary, vous pouvez lier les événements liés aux tokens aux audits de modifications de contenu. Le journal d’audit enregistre déjà les actions sur les tokens ; les entrées d’audit de Revisionary peuvent être corrélées par ID utilisateur pour offrir une vue complète de qui a modifié le contenu et quel token a été utilisé. Cette synergie améliore la traçabilité tant pour les équipes de contenu que de sécurité.

A combination lock rests on a computer keyboard
Photo de Sasun Bughdaryan sur Unsplash

9. Exemple de flux de travail complet

  1. Pipeline CI récupère STRAPI_ENCRYPTION_KEY, API_TOKEN_SALT et STRAPI_ADMIN_TOKEN depuis le coffre.
  2. Job nocturne exécute rotation‑script.js pour chaque token de service.
  3. Le script écrit le nouveau token dans le coffre et met à jour l’environnement du service.
  4. Le journal d’audit enregistre automatiquement l’événement de régénération (horodatage, IP, ID utilisateur).
  5. Exécution mensuelle de conformité exporte les journaux d’audit, valide qu’aucun token ne dépasse le TTL et archive le CSV.

En suivant ce flux de travail, votre installation Strapi reste conforme, réduit la surface d’attaque et offre la visibilité requise par le RGPD et les politiques de sécurité internes.

Pour en savoir plus sur les fonctionnalités de sécurité de Strapi, consultez la documentation officielle et les articles de blog ci‑dessus.

Mots-clésStrapisécurité APIrotation de tokensjournaux d’auditRGPD

Sources

  1. API Tokens – Strapi Documentation
  2. Admin Tokens – Strapi Documentation
  3. How to store API keys securely – Strapi Blog
  4. Audit Logs – Strapi Documentation
  5. Programmatic token regeneration PR
  6. Strapi security plugins overview

L’équipe Revisionary

Les développeurs de Revisionary, un plugin d’historique des versions pour Strapi 5. Nous écrivons sur Strapi, le développement web, l’IA et la sécurité des applications.

Cet article a été rédigé avec l'aide d'une IA.

Tous les articles