Antimodèle: ne définir aucun délai d'expiration pour les jetons OAuth

Vous consultez la documentation d'Apigee Edge.
Consultez la documentation Apigee X.
en savoir plus

Apigee Edge fournit le framework OAuth 2.0 pour sécuriser les API. OAuth2 est l'un des schémas les plus courants d'autorisation et d'authentification basée sur les jetons de norme ouverte. Il permet aux applications clientes d'accéder aux API pour le compte d'utilisateurs sans que ces derniers aient besoin de divulguer leur nom d'utilisateur et leur mot de passe.

Apigee Edge permet aux développeurs de générer des jetons d'accès et/ou d'actualisation en implémentant l'un des quatre types d'attribution OAuth2 (identifiants client, mot de passe, implicite et code d'autorisation) à l'aide de la stratégie OAuthv2. Les applications clientes utilisent des jetons d'accès pour utiliser des API sécurisées. Chaque jeton d'accès possède son propre délai d'expiration, qui peut être défini dans la stratégie OAuthv2.

Les jetons d'actualisation sont éventuellement fournis avec des jetons d'accès avec certains types de subvention. Les jetons d'actualisation permettent d'obtenir de nouveaux jetons d'accès valides une fois que le jeton d'accès d'origine a expiré ou a été révoqué. Le délai d'expiration des jetons d'actualisation peut également être défini dans la règle OAuthv2.

Cet antischéma est lié à l'antischéma consistant à définir un délai d'expiration long pour les jetons OAuth.

Antimodèle

Si vous ne définissez aucun délai d'expiration pour un jeton d'actualisation dans la règle OAuthv2, les jetons OAuth s'accumulent et l'espace disque utilisé sur les nœuds Cassandra augmente.

L'exemple de stratégie OAuthV2 suivant montre une configuration manquante pour <RefreshTokenExpiresIn> :

<OAuthV2 name="GenerateAccessToken">
    <Operation>GenerateAccessToken</Operation>
    <ExpiresIn>1800000</ExpiresIn> <!-- 30 minutes -->
    <!--<RefreshTokenExpiresIn> is missing -->
    <SupportedGrantTypes>
      <GrantType>password</GrantType>
    </SupportedGrantTypes>
    <GenerateResponse enabled="true"/>
</OAuthV2>

Dans l'exemple ci-dessus:

  • Le jeton d'accès est défini avec un délai d'expiration raisonnablement faible de 30 minutes.
  • La date d'expiration du jeton d'actualisation n'est pas définie.
  • Le jeton d'actualisation est conservé indéfiniment dans le data store (Cassandra), ce qui entraîne l'accumulation des données.
  • Un jeton d'actualisation généré sans expiration peut être utilisé indéfiniment pour générer des jetons d'accès.
  • Si le trafic vers cette API est de 10 requêtes par seconde, elle peut générer jusqu'à 864 000 jetons par jour.

Impact

  • Si le jeton d'actualisation est créé sans expiration, cela entraîne deux conséquences majeures :
    • Le jeton d'actualisation peut être utilisé à tout moment, voire pendant des années, pour obtenir un jeton d'accès. Cela peut avoir des implications sur la sécurité.
    • La ligne Cassandra contenant le jeton d'actualisation ne sera jamais supprimée. Cela entraîne l'accumulation de données dans Cassandra.
  • Si vous n'utilisez pas le jeton d'actualisation pour obtenir un nouveau jeton d'accès, mais créez un jeton d'actualisation et un jeton d'accès, l'ancien jeton d'actualisation restera dans Cassandra. Par conséquent, les jetons d'actualisation continueront de s'accumuler dans Cassandra, ce qui augmentera davantage les données surchargées, l'utilisation accrue du disque et les compactages plus importants. À terme, cela entraînera des latences de lecture/écriture dans Cassandra.

Bonnes pratiques

Utilisez un délai d'expiration suffisamment faible pour les jetons d'actualisation et d'accès. Consultez les bonnes pratiques pour définir les délais d'expiration des jetons d'actualisation et d'accès. Veillez à spécifier une configuration d'expiration pour le jeton d'accès et d'actualisation dans la stratégie. Pour en savoir plus sur la configuration des règles, consultez la documentation sur les règles OauthV2.

Les meilleures pratiques spécifiques aux clients Edge for Private Cloud

La section décrit les meilleures pratiques spécifiquement pour les clients Edge for Private Cloud.

Spécifier un délai d'expiration par défaut du jeton d'actualisation

Par défaut, si le délai d'expiration du jeton d'actualisation n'est pas spécifié dans la configuration d'une règle, Edge crée un jeton d'actualisation sans expiration. Vous pouvez ignorer ce comportement en procédant comme suit:

  1. Sur un nœud de processeur de messages, modifiez ou créez le fichier de remplacement de configuration $APIGEE_ROOT/customer/application/message-processor.properties. Assurez-vous que ce fichier est lisible par l'utilisateur apigee.
  2. Ajoutez la ligne suivante au fichier :
    conf_keymanagement_oauth_refresh_token_expiry_time_in_millis=3600000
    Le délai d'expiration du jeton d'actualisation par défaut sera défini sur une heure si aucun n'est spécifié dans une stratégie. Vous pouvez modifier cette valeur par défaut en fonction des besoins de votre entreprise.
  3. Redémarrez le service de processeur de messages :
    apigee-service edge-message-processor restart
  4. Répétez les étapes ci-dessus un par un dans tous les nœuds de traitement des messages.

Bonnes pratiques dans Cassandra

Essayez d'installer la dernière version d'Apigee accessible au public. Apigee continue de publier des correctifs et des améliorations qui continuent d'améliorer et d'optimiser la gestion des jetons dans Apigee. Dans Apigee, les jetons d'accès et d'actualisation sont stockés dans Cassandra dans l'espace de clés "kms". Vous devez vous assurer que la stratégie de compactage de cet espace de clés est définie sur LeveledCompactionStrategy. Vérifiez que les indices suivants ne sont pas :
  • kms.oauth_20_access_tokens.oauth_20_access_tokens_organization_name_idx#f0f0f0 et
  • kms.oauth_20_access_tokens.oauth_20_access_tokens_status_idx

Vous pouvez également réduire le paramètre gc_grace_seconds de la table kms.oauth_20_access_tokens en le faisant passer de la valeur par défaut (10 jours) à une valeur inférieure (par exemple, 3 jours) pour vous assurer que les tombstones générés en raison de la suppression des jetons sont supprimés plus rapidement du data store.

Complément d'informations