アンチパターン: OAuth トークンに有効期限を設定しない

現在、Apigee Edge のドキュメントを表示しています。
Apigee X のドキュメントをご確認ください
情報

Apigee Edge には、API を保護するための OAuth 2.0 フレームワークが用意されています。OAuth2 は、オープン標準でトークンベースの認証と認可のスキームの中で最も普及しているものの一つです。これにより、ユーザーにユーザー名とパスワードを明かすことを要求することなく、クライアント アプリケーションがユーザーに代わって API にアクセスできるようになります。

Apigee Edge では、デベロッパーは OAuthv2 ポリシーを使用して、クライアント認証情報パスワード暗黙的認可コードの 4 つの OAuth2 権限付与タイプのいずれかを実装することで、アクセス トークンや更新トークンを生成できます。クライアント アプリケーションはアクセス トークンを使用して、安全な API を使用します。各アクセス トークンには固有の有効期限があり、OAuthv2 ポリシーで設定できます。

一部の権限付与タイプのアクセス トークンとともに、更新トークンもオプションで発行されます。更新トークンは、元のアクセス トークンの有効期限が切れるか、取り消された場合に、新しい有効なアクセス トークンを取得する目的で使用されます。更新トークンの有効期限も OAuthv2 ポリシーで設定できます。

このアンチパターンは、OAuth トークンに長い有効期限を設定するというアンチパターンに関連しています。

アンチパターン

OAuthv2 ポリシーで更新トークンに有効期限を設定しないと、OAuth トークンが蓄積され、Cassandra ノード上でディスク容量が増加します。

次の OAuthV2 ポリシーの例は、<RefreshTokenExpiresIn> の欠落している構成を示しています。

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

上記の例では、次のようになります。

  • アクセス トークンの有効期限は 30 分程度に短く設定されています。
  • 更新トークンの有効期限が設定されていません。
  • 更新トークンはデータストア(Cassandra)に永続的に保持されるため、データが蓄積されます。
  • 有効期限なしで作成された更新トークンを使用して、アクセス トークンを無期限に生成できます。
  • この API へのトラフィックが 1 秒あたり 10 件のリクエストの場合、1 日に 864,000 個のトークンを生成できます。

効果

  • 更新トークンを有効期限なしで作成した場合、主に次の 2 つの影響があります。
    • 更新トークンは、将来的にいつでも(場合によっては数年間)アクセス トークンの取得に使用できます。セキュリティ上の問題が生じる可能性があります。
    • 更新トークンを含む Cassandra の行は削除されません。これにより、Cassandra にデータが蓄積されます。
  • 更新トークンを使用して新しいアクセス トークンを取得せず、代わりに新しい更新トークンとアクセス トークンを作成した場合、古い更新トークンは Cassandra に残ります。その結果、更新トークンが Cassandra で蓄積され続けると、肥大化、ディスク使用量の増加、重度の圧縮が発生し、最終的に Cassandra で読み取り/書き込みレイテンシが発生します。

ベスト プラクティス

更新トークンとアクセス トークンの両方に、適切な短い有効期限を設定します。更新トークンとアクセス トークンの有効期限の設定については、ベスト プラクティスをご覧ください。ポリシーにアクセス トークンと更新トークンの両方の有効期限構成を指定してください。ポリシー構成の詳細については、OauthV2 ポリシーのドキュメントをご覧ください。

Edge for Private Cloud のお客様に特化したベスト プラクティス

このセクションでは、Edge for Private Cloud のお客様を対象としたベスト プラクティスについて説明します。

デフォルトの更新トークンの有効期限を指定する

デフォルトでは、ポリシー構成で更新トークンの有効期限が指定されていない場合、Edge は有効期限のない更新トークンを作成します。この動作は次の手順でオーバーライドできます。

  1. Message Processor ノードで、構成オーバーライド ファイル $APIGEE_ROOT/customer/application/message-processor.properties を編集または作成します。このファイルを apigee ユーザーが読み取り可能であることを確認してください。
  2. ファイルに次の行を追加します。
    conf_keymanagement_oauth_refresh_token_expiry_time_in_millis=3600000
    これにより、デフォルトの更新トークンの有効期限が(ポリシーで指定されていない場合)1 時間に設定されます。 このデフォルト値は、ビジネスニーズに応じて変更できます。
  3. Message Processor サービスを再起動します。
    apigee-service edge-message-processor restart
  4. すべての Message Processor ノードで、上記の手順を 1 つずつ繰り返します。

Cassandra のベスト プラクティス

一般公開されている最新バージョンの Apigee にアップグレードしてみてください。Apigee は修正と機能強化を継続的にリリースし、Apigee 内のトークン管理の改善と最適化を継続しています。Apigee では、アクセス トークンと更新トークンが Cassandra の kms キースペースに保存されます。このキースペースのコンパクション戦略が LeveledCompactionStrategy に設定されていることを確認してください。次のインデックスが存在しないことを確認します。
  • kms.oauth_20_access_tokens.oauth_20_access_tokens_organization_name_idx#f0f0f0 および
  • kms.oauth_20_access_tokens.oauth_20_access_tokens_status_idx

また、テーブル kms.oauth_20_access_tokensgc_grace_seconds をデフォルトの 10 日間から低い値(3 日など)に短縮して、トークンの削除により生成された Tombstone がデータストアから迅速にパージされるようにすることもできます。

参考資料