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

ここに表示されているのは Apigee Edge のドキュメントです。
Go to the Apigee X のドキュメントに移動します
info

Apigee Edge では、API を保護するための OAuth 2.0 フレームワークが 用意されています。OAuth2 は、オープン標準かつトークンベースの、最も普及している認証および 承認スキームの 1 つです。これにより、ユーザーにユーザー名とパスワードの提供を要求しなくても、クライアントアプリケーションがユーザーに代わって 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 へのトラフィックが 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 では、アクセス トークンと更新トークンは「kms」キースペース内の Cassandra に保存されます。この キースペースのコンパクション戦略が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 日など)に減らすこともできます。

関連情報