API のプロダクト構成について
スタートアップ時に、Apigee アダプタが Edge 組織 / 環境から API プロダクトの定義をダウンロードします。API プロダクトを作成するで説明されているとおり、アダプタはこの情報を使用して、Edge 環境内で API プロダクトにバインドした Istio サービスにポリシー(API キー検証の実行など)を適用します。
プロダクトの構成について、次の点に注意する必要があります。
- 対象のサービス名が API プロダクトにバインドされていない場合、ポリシーは適用されません。Binding コマンドもご覧ください。
- パスの照合は、Istio リクエストパスに対して行われます。
- パスの照合には、Apigee のプロダクト ドキュメントで説明されているワイルドカードと同様の意味合いがありますが、ベースパスがないため、次のようにまとめることができます。
- 単一のスラッシュ(
/
)のみで、任意のパスにマッチします。 *
はスラッシュに囲まれたセグメント内のどの場所でも有効で、任意の文字列に一致します。**
は末尾で有効で、行末までの任意の文字列に一致します。
- 単一のスラッシュ(
- 対象のサービスが API プロダクトにマッピングされている場合:
- リクエストパスに一致しないリクエストは拒否されます。
- リクエストパスに一致するリクエストに認証が適用されます。
- 認証されたリクエストは、関連する任意の割り当てに適用されます。
分析ロギングについて
リクエストは、認証や API プロダクトとのマッピングに関係なく、分析をロギングする場合があります。Mixer の Apigee 分析ハンドラに送信されたリクエストは、Edge Analytics に設定され、Edge Analytics UI からアクセスできるようになります。
JWT ベースの認証を使用する
API キーを使用する代わりに、有効な JSON ウェブトークン(JWT)を受け入れるように Apigee アダプタを構成できます。このセクションでは、JWT を受け入れるように Adapter を構成する方法について説明します。
cd
を実行して、Apigee アダプタがインストールされているディレクトリapigee-istio-adapter.
に移動します。samples/apigee/authentication-policy.yaml
ファイルを開きます。spec
セクションで、独自の組織と環境の値を使用して、JWT 構成 URL を編集します。次に例を示します。issuer: https://org-env.apigee.net/istio-auth/token jwks_uri: https://org-env.apigee.net/istio-auth/certs
例:
spec: origins: - jwt: issuer: https://jdoe-test.apigee.net/istio-auth/token jwks_uri: https://jdoe-test.apigee.net/istio-auth/certs
Apigee Edge Private Cloud を使用している場合は、Private Cloud のインストールに適した値を参照する必要があります。たとえば、
apigee.net
を、組織環境の仮想ホスト エイリアスに置き換えます。仮想ホストの詳細については、Edge のドキュメントをご覧ください。相互 TLS(mTLS)にポリシーを正しく構成します。
Istio メッシュの mTLS 認証設定は、認証ポリシーに一致している必要があります。mTLS を使用するように Istio を設定している場合(つまり、Istio のインストール時に
istio-demo-auth.yaml
を適用した場合)、authentication-policy.yaml
で mTLS を明示的に有効にする必要があります。この操作を行うには、次のようにauthentication-policy.yaml
でmtls
の行のコメントを解除します。peers: - mtls: # uncomment if you're using mTLS between services (eg. istio-demo-auth.yaml)
メッシュで mTLS を有効にしていない場合は、認証ポリシーで有効にしないでください。
mtls
の行をコメントアウトします。ポリシーが一致しない場合は、upstream connect error
またはdisconnect/reset before headers
のようなエラーが表示されます。変更を保存して、Istio 認証ポリシーを適用します。
kubectl apply -f samples/apigee/authentication-policy.yaml
/hello
API を呼び出します(API キーヘッダーの指定は必須ではありません)。処理に失敗して、次のエラー メッセージが返されます。curl http://$HELLOWORLD_URL/hello Origin authentication failed.
次に、Apigee Edge から JWT トークンを取得します。
apigee-istio token create -o [your org] -e [your environment] -i [consumer_key] -s [consumer_secret]
ここで、Edge 組織、環境、作成したデベロッパー アプリのコンシューマ キーとコンシューマ シークレットを指定します。詳しくは、API キーを取得するをご覧ください。
例:
apigee-istio token create -o myorg -e test -i c8516b0faa10d7db48d1198fa86e0dfbad7645b0d064354619a3bf0cfa34ac3d -s ce6c9a03c2b70059be626dd349a74e52ca44593539229f350410f0010419eb9f {"token":"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjIifQ.eyJhcGlfcHJvZHVjdF9saXN0IjpbImlzdGlvLWhlbGxvIl0sImF1ZGllbmNlIoibWljcm9nYXRld2F5IiwianRpIjoiNDRhNzhhcQtMDVmMC00MTM5LTNjctOWIxZWFkZTA2N2Q2IiwiaXNzIjoiaHR0cHM6Ly93aWxsd2l0bWFuLXc3QuYXBpZ2VlLm5ldC9lZGdlbWljcm8tYXV0aC92ZXJpZnlBcLZXkiLCJhY2Nlc3NfdG9rZW4iOm51bGwsImNsaWVudF9pZCI6IjZVN2kyS0dyaEc4d0FHNkdZMWZ67WtEYmNtdU9RQ3hBIiwibmJmIjoxNTIyNDE4MTY2LA4CdyCJpYXQiOjE1MjI0MTgxNjYsImFwcGxpY2FaW9uX25hbWUiOiJoWxsby1pc3Rpby1hcHAiLCJleHAiOjE1MjI0MTg0Nj9.f9F0w0Z8MYXkKuSIY3UKN2-GyZnEtuz0pV0CNIoc7Op4GKkNN_nvcTmKXe3cadERBULozumfzMGAnjmrazDFkq90ADa2mv78yIBBQeDdMo2STPPIHPEsxre3Ll0mUeE7vvLBv1LC6_PtR79dYzQYGOExGL0hvihLmOLSFDy_qrljO9oR1XbMWGLTNGComYweujqzgHi0ZimgAkPf8Z84ADt07wmJ3N_j1SYmVp38InDrb9361kZIYGs-bz99BKMsEgxlhy5TEr8W7g8auLDbKdcBDTA96kSwihWTEdYJ3r5j2_mBdZxZ9WOxqb_CmIAZPl6Dgtm6xtc4w4EZ8iA"
Authorization ヘッダーに表示された JWT 署名なしトークンを使用して、
/hello
API を再度呼び出します。次に例を示します。curl http://$HELLOWORLD_URL/hello -H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IjIifQ.eyJhcGlfcHJvZHVjdF9saXN0IjpbImlzdGlvLWhlbGxvIl0sImF1ZGllbmNlIoibWljcm9nYXRld2F5IiwianRpIjoiNDRhNzhhcQtMDVmMC00MTM5LTNjctOWIxZWFkZTA2N2Q2IiwiaXNzIjoiaHR0cHM6Ly93aWxsd2l0bWFuLXc3QuYXBpZ2VlLm5ldC9lZGdlbWljcm8tYXV0aC92ZXJpZnlBcLZXkiLCJhY2Nlc3NfdG9rZW4iOm51bGwsImNsaWVudF9pZCI6IjZVN2kyS0dyaEc4d0FHNkdZMWZ67WtEYmNtdU9RQ3hBIiwibmJmIjoxNTIyNDE4MTY2LA4CdyCJpYXQiOjE1MjI0MTgxNjYsImFwcGxpY2FaW9uX25hbWUiOiJoWxsby1pc3Rpby1hcHAiLCJleHAiOjE1MjI0MTg0Nj9.f9F0w0Z8MYXkKuSIY3UKN2-GyZnEtuz0pV0CNIoc7Op4GKkNN_nvcTmKXe3cadERBULozumfzMGAnjmrazDFkq90ADa2mv78yIBBQeDdMo2STPPIHPEsxre3Ll0mUeE7vvLBv1LC6_PtR79dYzQYGOExGL0hvihLmOLSFDy_qrljO9oR1XbMWGLTNGComYweujqzgHi0ZimgAkPf8Z84ADt07wmJ3N_j1SYmVp38InDrb9361kZIYGs-bz99BKMsEgxlhy5TEr8W7g8auLDbKdcBDTA96kSwihWTEdYJ3r5j2_mBdZxZ9WOxqb_CmIAZPl6Dgtm6xtc4w4EZ" Hello version: v2, instance: helloworld-v2-6755887594-bnf6q
JWT トークンの検査と JWT トークンのローテーションもご覧ください。
JWT クレームでの Apigee API キーの使用
JWT クレームに渡された Apigee API キーを検証するように Apigee アダプタを構成できます。クレームは、JWT に追加される情報で、名前と値から構成されます。この情報は通常、JWT のサブジェクトに関する情報で、API リクエストの追加検証に使用できます。JWT ベースの認証を使用するもご覧ください。
アダプタの構成
アダプタには、Apigee API キーを含む JWT クレームの名前を通知する必要があります。
samples/apigee/handler.yaml
ファイルを開きます。ハンドラ ファイルの
spec
セクションに、次の構成属性を追加します。api_key_claim: my_apigee_apikey_claim_name
ここで、my_apigee_apikey_claim_name は JWT クレーム名に有効な文字列です。詳しくは、JSON ウェブトークンの RFC をご覧ください。
例:
# istio handler configuration for apigee adapter # generated by apigee-istio provision on 2018-08-01 16:15:36 apiVersion: config.istio.io/v1alpha2 kind: apigee metadata: name: apigee-handler namespace: istio-system spec: apigee_base: https://istioservices.apigee.net/edgemicro customer_base: https://myorg-test.apigee.net/istio-auth org_name: apigeesearch env_name: test key: 93b9ba790045250b1949b15731d6e565117ed8dd63afbd461974acaf404771e4 secret: 5635f82c78af54f52df157d3023edbd3658437b0ca43cef19a988b475257ab0a api_key_claim: my_apigee_apikey_claim_name
ハンドラ ファイルを Istio に適用します。
kubectl apply -f samples/apigee/handler.yaml
アダプタは、リクエストを受け取ると、このクレームが有効な JWT に含まれているかどうか確認します。この名前のクレームが有効な JWT に含まれていることを確認すると、API キーの検証を行います。キーが有効な場合、呼び出しが行われます。無効な場合、呼び出しは拒否されます。
優先ルール
アダプタは、JWT と API キーを評価するときに、次の優先ルールに従います。
- 有効な JWT に
handler.yaml
ファイルで指定されたapi_key_claim
の値と一致するクレーム名があり、そのクレームに Apigee API キーが含まれている場合、アダプタはキーの検証を行います。これ以外の JWT クレームは検証されません。 - リクエストに API キーしか含まれていない場合、アダプタはキーの検証を行います。
api_key_claim
の値に一致する JWT クレーム名が見つからない場合、アダプタは通常の JWT 検証手順に従います。詳しくは、JWT ベースの認証を使用するをご覧ください。
割り当てについて
割り当てとは、1 時間、1 日、1 週間または 1 か月にアプリが API に送信できるリクエスト メッセージの数を指定したものです。アプリが割り当て制限に達すると、以降の API 呼び出しは拒否されます。
割り当てのユースケース
割り当てを使用すると、一定の期間内にクライアントがサービスに行うリクエスト数を制限できます。割り当ては、運用上のトラフィック管理ではなく、開発者やパートナーとの業務契約または SLA の適用で使用されています。たとえば、無料サービスのトラフィックを制限し、有料のお客様にフルアクセスを許可するために使用されています。
API プロダクトでの割り当ての定義
Quota パラメータは API プロダクトで構成します。たとえば、API プロダクトを作成するときに、割り当て上限、時間単位、間隔を設定できます。
API キーは API プロダクトにマッピングされるため、API キーが検証されるたびに、該当する割り当てカウンタの値が減少します(割り当てが関連するプロダクトで定義されている場合)。
割り当てカウントを維持する場所
起動時に、Apigee アダプタは Apigee Edge から構成情報(プロダクトの構成など)を取得します。パフォーマンス上の理由から、Apigee アダプタはローカル キャッシュにカウンタを維持し、値を減らします。アダプタは、割り当てカウントと Apigee Edge で維持されている割り当て状態の同期を定期的に行います。
機密情報のマスキング
Istio にデプロイされているサービスへのリクエストには、機密情報が含まれている可能性があります。Apigee Analytics プラットフォームに送信する前に、このデータをマスキングできます。このセクションでは、次の情報をマスキングする方法を説明します。
- リクエストパスに表示されるデータ(クエリ パラメータなど)
- クライアント IP
重要なパスとクライアント IP データをマスキングするには、次の操作を行います。
- Apigee 固有の
definitions.yaml
ファイルを開きます。これは、Apigee 提供のファイルで、Apigee アダプタの基本構造と動作が定義されています。たとえば、Apigee アダプタ ディストリビューションではsamples/apigee/definitions.yaml
です。 kind の
analytics section
で次の属性を探します。client_ip: source.ip | ip("0.0.0.0") request_uri: request.path | "" request_path: request.path | ""
次の属性を定数に変更し、マスキングします。例:
client_ip: ip("0.0.0.0") request_uri: "" request_path: ""
マスキングが必要なサービスと、それほど重要でないサービスが混在していることもあります。その場合は、2 つの定義を作成します。たとえば、次の定義を作成します。
kind: analytics
さらに、次の定義を作成します。
kind: maskedanalytics
適切な analytics
または maskedanalytics
インスタンスを呼び出すためのルールを作成して適用します。
サンプル ファイルについて
サンプルの構成ファイルは samples/apigee
ディレクトリにあります。これらのファイルは、Mixer に適用する Apigee 固有のルールと定義を構成する場合に使用されます。
ファイル | 説明 |
---|---|
handler.yaml
|
特定の Apigee テナントの Apigee アダプタを定義します。プロビジョニング コマンドで返される値を追加する場合は、このファイルを編集する必要があります。このような値には、キーとシークレット、組織名、環境名、ベース URI などがあります。ハンドラもご覧ください。 |
rule.yaml
|
Apigee Mixer アダプタをリクエストに適用するためのルールを定義します。ルールはこのファイルに追加します。ルールもご覧ください。 |
definitions.yaml
|
Apigee Mixer アダプタの基本構造とデータマップを定義します。通常、このファイルを編集する必要はありません。 |
authentication-policy.yaml
|
Authentication ポリシーを作成してサービスにバインドします。JWT 認証を使用する場合は、このファイルを構成して適用します。 |
httpapispec.yaml
|
Istio で API を定義します。API は、サービスに対するリクエストを識別し、このリクエストに API 属性と動作をバインドします。通常、このファイルを編集または適用する必要はありません。 |
ハンドラの構成
ハンドラ ファイルには、複数の構成可能な属性が定義されています。設定例は samples/apigee/handler.yaml
ファイルにあります。
属性 | 説明 |
---|---|
temp_dir
|
アダプタが一時ファイルを保存するディレクトリ。現在、このディレクトリには、アップロードの前にバッファに保存された分析レコードが保存されます。 |
server_timeout_secs
|
Apigee Edge サーバーに対するクライアント リクエストの HTTP タイムアウト。 |
refresh_rate_mins
|
アダプタが Apigee Edge をポーリングし、API プロダクトに対する変更を確認する間隔。デフォルト: 1 |
legacy_endpoint |
Edge Private Cloud を使用している場合は、分析の際に正しい実装が使用されるようにこの値を true に設定します。デフォルト: false |
file_limit |
ローカルに保存できる分析レコード ファイルの数。ファイルがアップロードできない場合、この数を超えていると、最も古いレコードが削除されます。デフォルト: 1024 |
Apigee アダプタの無効化
Apigee アダプタを無効にするには、適用した構成を削除します。例:
kubectl delete -f samples/apigee/definitions.yaml
kubectl delete -f samples/apigee/handler.yaml
kubectl delete -f samples/apigee/rule.yaml
同じ構成を再度適用すれば、アダプタをいつでも有効にできます。
Istio のアンインストール
Istio ドキュメントで Istio コア コンポーネントのアンインストールをご覧ください。