クラウドネイティブ API Gateway では、カスタム認証サービスを構成して、すべてのバックエンドサービスに対して統合認証を実行できます。この方法では、各バックエンドサービスを認証サービスに個別に接続する必要はありません。このトピックでは、クラウドネイティブ API Gateway インスタンスのカスタム認証サービスを構成する方法について説明します。
背景情報
ほとんどの場合、サーバーは、クライアントリクエストに含まれるトークンに基づいて、外部に公開されている API の通信セキュリティを保護します。トークンの形式は、ビジネス要件に基づいて決定されます。
JSON Web トークン( JWT )を使用する場合、サーバーは、統合認証サービスにアクセスすることなく、いつでもどこでも公開鍵を使用してトークンを検証できます。
カスタムトークンを使用する場合、サーバーはリクエストを受信した後、統合認証サービスにアクセスしてトークンを検証する必要があります。これは、API 通信のセキュリティを保護するのに役立ちます。クラウドネイティブ API Gateway はカスタム認証をサポートしています。
次の例は、クラウドネイティブ API Gateway インスタンスと統合された認証サービスがリクエストを処理する方法を示しています。

クライアントは、ログオンリクエストなどの認証リクエストをクラウドネイティブ API Gateway インスタンスに送信します。
クラウドネイティブ API Gateway インスタンスは、リクエストを認証サーバーに転送します。
認証サーバーは、認証リクエスト内のユーザー名やパスワードなどの認証情報を読み取って、リクエストを検証します。リクエストが検証されると、認証サーバーはクラウドネイティブ API Gateway インスタンスにトークンを返します。次に、クラウドネイティブ API Gateway インスタンスは、トークンを含むレスポンスをクライアントに送信します。
クライアントは、/order パスを含むリクエストなどのビジネスリクエストを送信します。リクエストには、クラウドネイティブ API Gateway インスタンスによって返されたトークンが含まれています。
クラウドネイティブ API Gateway インスタンスは認証リクエストを構築し、カスタム認証サービスに送信します。認証リクエストには、パス、HTTP メソッド、およびトークンが含まれています。パスにはクエリパラメーターが含まれ、HTTP メソッドには GET と POST が含まれます。クラウドネイティブ API Gateway コンソールで、トークンを格納する HTTP ヘッダーを構成する必要があります。ビジネス要件に基づいて、ビジネスリクエストの本文を含むように認証リクエストを構成できます。
認証リクエストのパスは、カスタム認証サービスの認証 API のパスとビジネスリクエストのパスで構成されます。たとえば、カスタム認証サービスの認証 API のパスが /validateToken の場合、認証リクエストのパスは /validateToken/order になります。
認証サービスは、認証リクエストを受信した後、元のリクエストに含まれるパスに基づいてトークンを検証し、ビジネスリクエストを認証します。
認証サービスが認証レスポンスに含まれる HTTP ステータスコードを変更できる場合は、HTTP ステータスコードに基づいて認証結果を判断できます。
認証サービスが HTTP ステータスコード 200 を返した場合、トークンは有効であり、リクエストされたバックエンドリソースにアクセスするための認証が行われています。この場合、クラウドネイティブ API Gateway インスタンスは元のビジネスリクエストを保護されたバックエンドサーバーに転送します。バックエンドサーバーはクラウドネイティブ API Gateway インスタンスにレスポンスを返し、次にクラウドネイティブ API Gateway インスタンスはレスポンスをクライアントに転送します。注文の配置は完了です。
認証サービスが HTTP ステータスコード 401 または 403 を返した場合、トークンは無効であるか、リクエストされたバックエンドリソースにアクセスするための認証が行われていません。この場合、クラウドネイティブ API Gateway インスタンスは認証レスポンスをクライアントに転送します。注文の配置は失敗します。
ビジネス上の制限により、認証サービスが HTTP ステータスコード 200 のみを返すことができる場合は、組み込み HTTP ヘッダー
x-mse-external-authz-check-resultの値に基づいて認証結果を判断できます。認証サービスがレスポンスヘッダーで
x-mse-external-authz-check-result=trueを返した場合、トークンは有効であるか、バックエンドリソースにアクセスするための認証が行われています。この場合、クラウドネイティブ API Gateway インスタンスは元のビジネスリクエストを保護されたバックエンドサーバーに転送します。バックエンドサーバーはクラウドネイティブ API Gateway インスタンスにレスポンスを返し、次にクラウドネイティブ API Gateway インスタンスはレスポンスをクライアントに転送します。注文の配置は完了です。認証サービスがレスポンスヘッダーで
x-mse-external-authz-check-result=falseを返した場合、トークンは無効であるか、バックエンドリソースにアクセスするための認証が行われていません。この場合、クラウドネイティブ API Gateway インスタンスは認証レスポンスをクライアントに転送します。注文の配置は失敗します。
カスタム認証サービスを作成する
クラウドネイティブ API Gateway コンソール にログインします。
左側のナビゲーションウィンドウで、[インスタンス] をクリックします。上部のナビゲーションバーで、リージョンを選択します。
[インスタンス] ページで、管理するクラウドネイティブ API Gateway インスタンスの名前をクリックします。
左側のナビゲーションツリーで、 を選択します。
[グローバル認証] ページで、[認証の作成] をクリックします。[認証の作成] パネルで、パラメーターを構成し、[OK] をクリックします。
パラメーター
説明
有効化
認証を有効または無効にします。
認証名
カスタム認証サービスの名前を入力します。
認証タイプ
[カスタム認証サービス] を選択します。
認証サービス
トークンと権限を検証するために使用されるバックエンドサービス。[サービス管理] ページでサービスを追加できます。サービスを追加する方法の詳細については、「サービスの追加」をご参照ください。
説明HTTP サービスのみがサポートされています。Dubbo などの他のプロトコルのサービスはサポートされていません。
Kubernetes サービスに複数のポートがある場合、デフォルトで最初のポートが使用されます。別のポートを使用する場合は、Container Service for Kubernetes ( ACK )クラスタに追加の Kubernetes サービスを作成し、目的のポートのみを使用する必要があります。
認証 API
認証サービスによって提供される認証 API のパス。パスはプレフィックス一致メソッドをサポートしています。
たとえば、認証サービスが Spring MVC に基づいて構築されており、認証 API のパスが /check の場合、/check/** パスを含むリクエストを処理するには、次の構成を使用する必要があります。
@RequestMapping("/check/**") public ResponseEntity<RestResult<String>> check(){}トークンの場所
トークンを含むリクエストヘッダー。Authorization または Cookie ヘッダーをリクエストヘッダーとして使用できます。[選択] または [手動で追加] を選択して、トークンの場所を指定できます。
認証リクエストで許可されるヘッダー
クライアントから送信されたビジネスリクエストの Host 、Method 、Path 、および Content-Length 以外のヘッダーを認証リクエストに含める場合は、このパラメーターを構成する必要があります。
説明デフォルトでは、Host 、Method 、Path 、および Content-Length ヘッダーは認証リクエストに含まれています。手動で追加する必要はありません。
認証レスポンスで許可されるヘッダー
クライアントからのビジネスリクエストに認証レスポンスのヘッダーを追加する必要がある場合は、このパラメーターを指定する必要があります。
説明構成したヘッダーがビジネスリクエストに既に存在する場合、ヘッダー値は上書きされます。
認証リクエストで本文を許可する
[認証リクエストで本文を許可する] を選択すると、認証リクエストにビジネスリクエストの本文が含まれます。
[最大本文サイズ] パラメーターを、認証リクエストに含めることができるビジネスリクエスト本文の最大長に設定します。単位:バイト。
タイムアウト期間
認証サービスが結果を返すまでの最大待機時間。単位:秒。デフォルト値: 10 。
モード
有効な値:緩和モードと厳格モード。緩和モードを選択することをお勧めします。
[緩和モード] : 認証サービスへの接続の確立に失敗した場合、または 5xx エラーコードが返された場合に認証サービスが使用できない場合でも、クラウドネイティブ API Gateway インスタンスはクライアントからのリクエストを受け入れます。
[厳格モード] : 認証サービスへの接続の確立に失敗した場合、または 5xx エラーコードが返された場合に認証サービスが使用できない場合、クラウドネイティブ API Gateway インスタンスはクライアントからのリクエストを拒否します。
単純な条件
[権限付与] の右側にある [単純な条件] をクリックします。単純なルールベースの権限付与は、[ホワイトリストモード] と [ブラックリストモード] をサポートしています。
[ホワイトリストモード] : ホワイトリストで指定したホスト名とパスを持つリクエストは認証を必要としません。他のリクエストは認証が必要です。
[ブラックリストモード] : ブラックリストで指定したホスト名とパスを持つリクエストのみが認証を必要とします。他のリクエストは認証を必要としません。
[+ ルール条件] をクリックして、ドメイン名、パス、およびリクエストヘッダーを構成します。
ドメイン名: クラウドネイティブ API Gateway インスタンスへのアクセスを必要とするドメイン名。
パス: クラウドネイティブ API Gateway インスタンスへのアクセスを必要とするパス。
パス一致条件: [完全一致] 、[プレフィックス一致] 、または [正規表現に一致] を選択できます。
[完全一致] : 完全なパスを入力します。例: /app/v1/order 。
[プレフィックス一致] : パスのプレフィックスを入力します。最後にワイルドカードとしてアスタリスク( * )を追加する必要があります。たとえば、/app で始まるすべてのリクエストを照合するには、/app/* を指定する必要があります。
[正規表現に一致] : Google RE2 構文に準拠した式を入力します。詳細については、RE2 構文 にアクセスしてください。
大文字と小文字を区別する: このオプションを選択すると、パスの値は大文字と小文字が区別されます。
ヘッダー: リクエストヘッダー。[+ リクエストヘッダー] をクリックして、複数のヘッダーを追加します。AND 論理演算子がリクエストヘッダーに適用されます。
HeaderKey: ヘッダーフィールドのキー。
条件: 指定されたヘッダーを含むリクエストを照合するために使用される条件。
[等しい] : ヘッダーセット内の特定のキーの値が指定された値と同じである場合、ヘッダーセットを持つリクエストが照合されます。
[等しくない] : ヘッダーセット内の特定のキーの値が指定された値と異なる場合、ヘッダーセットを持つリクエストが照合されます。
[存在する] : 指定された値がヘッダーセットに存在する場合、ヘッダーセットを持つリクエストが照合されます。
[存在しない] : 指定された値がヘッダーセットに存在しない場合、ヘッダーセットを持つリクエストが照合されます。
[含む] : ヘッダーセット内の特定のキーの値に指定された値が含まれている場合、ヘッダーセットを持つリクエストが照合されます。
[除外する] : ヘッダーセット内の特定のキーの値に指定された値が含まれていない場合、ヘッダーセットを持つリクエストが照合されます。
[プレフィックス] : ヘッダーセット内の特定のキーの値が指定された値をプレフィックスとして使用している場合、ヘッダーセットを持つリクエストが照合されます。
[サフィックス] : ヘッダーセット内の特定のキーの値が指定された値をサフィックスとして使用している場合、ヘッダーセットを持つリクエストが照合されます。
[正規表現] : ヘッダーセット内の特定のキーの値が指定された正規表現に一致する場合、ヘッダーセットを持つリクエストが照合されます。正規表現は Google RE2 構文に準拠しています。詳細については、「RE2 構文」をご参照ください。
値: ヘッダーフィールドの値。
複雑な条件
[権限付与] の右側にある [複雑な条件] をクリックします。
複雑なルールベースの権限付与では、YAML 形式で Envoy の権限データ構造を構成できます。これにより、AND 、OR 、および NOT 条件の組み合わせに基づいて権限付与ルールを構成できます。構成された権限付与ルールを満たすリクエストに対して認証が実行されます。ルールを満たさないリクエストの場合、リクエストされたバックエンドリソースに認証なしでアクセスできます。
説明権限データ構造のフィールドの詳細については、「Envoy ドキュメント」をご参照ください。
複雑なルールの構成方法の詳細については、このトピックの「複雑なルールベースの権限付与の例」セクションをご参照ください。
[グローバル認証] ページに戻り、認証情報を表示します。クラウドネイティブ API Gateway インスタンスについて構成された認証情報が表示されている場合、クラウドネイティブ API Gateway インスタンスのカスタム認証ルールが作成されています。
カスタム認証サービスを表示および管理する
クラウドネイティブ API Gateway コンソール にログインします。
左側のナビゲーションウィンドウで、[インスタンス] をクリックします。上部のナビゲーションバーで、リージョンを選択します。
[インスタンス] ページで、管理するクラウドネイティブ API Gateway インスタンスの名前をクリックします。
左側のナビゲーションツリーで、 を選択します。
[グローバル認証] ページで、クエリする認証ルールを見つけ、[アクション] 列の [詳細] をクリックします。表示されたページで、[基本情報] セクションと [認証構成] セクションの情報、および [権限付与情報] セクションの情報の表示と管理を行います。

権限付与ルールを作成するには、[権限付与情報] セクションの [権限付与の作成] をクリックします。[権限付与の作成] パネルで、[リクエストドメイン名] 、[リクエストパス] 、および [一致モード] パラメーターを構成し、[OK] をクリックします。
次のステップ
ゲートウェイインスタンスの認証ルールに対して次の操作を実行できます。
認証ルールを有効にする: [グローバル認証] ページで、管理する認証ルールを見つけ、[アクション] 列の [有効化] をクリックします。
認証ルールを無効にする: [グローバル認証] ページで、管理する認証ルールを見つけ、[アクション] 列の [無効化] をクリックします。
認証ルールを変更する: [グローバル認証] ページで、管理する認証ルールを見つけ、[アクション] 列の [編集] をクリックします。
認証ルールを削除する: [グローバル認証] ページで、管理する認証ルールを見つけ、[アクション] 列の [削除] をクリックします。
無効化された認証ルールのみを削除できます。
複雑なルールベースの権限付与の例
正規表現を使用してドメイン名を照合する
この例では、exampleA.com および exampleB.com ドメイン名のパスプレフィックス一致ルールを満たすリクエストに対してのみ認証が実行されます。 regex フィールドで指定された正規表現は、部分一致ではなく完全一致に使用されます。
test.exampleA.com ドメイン名のリクエストは認証ルールを満たしておらず、認証なしのアクセスがサポートされています。
正規表現は Google RE2 構文に準拠しています。詳細については、「RE2 構文」をご参照ください。
権限データ構造のフィールドの詳細については、「Envoy ドキュメント」をご参照ください。
permissions:
# and_rules は、以下のすべてのルールが同時に満たされた場合に認証が実行されることを示します。
- and_rules:
rules:
- url_path:
# パスプレフィックス。
path:
prefix: /
- header:
# 正規表現。
safe_regex_match:
regex: "(exampleA\\.com|exampleB\\.com)"
# HTTP 疑似ヘッダー仕様に基づいて ":authority" ヘッダーを使用してドメイン名を取得できます。
name: ":authority"AND、OR、および NOT 条件の組み合わせを使用する
次のリクエストには認証が必要です。
exampleA.com/api プレフィックスを持つパスを持つすべてのリクエスト。ただし、以下を除きます。
exampleA.com/api/appa/bbb
exampleA.com/api/appb/ccc
exampleB.com ドメイン名の下にあるパスを持つすべてのリクエスト。ただし、以下を除きます。
exampleB.com/api/appa/bbb
exampleB.com/api/appb/ccc
exampleB.com/api/appc プレフィックスを持つパス。ただし、以下を除きます。
exampleB.com/api/appc/bbb/ccc
exampleB.com/api/appc/ccc/ddd
次の図は、認証ロジック全体を示しています。

次のコードは、YAML 形式の構成を示しています。
permissions:
# or_rules は、以下のルールのいずれかが満たされた場合に認証が実行されることを示します。
- or_rules:
rules:
# and_rules は、以下のすべてのルールが同時に満たされた場合に認証ルールが有効になることを示します。
# ルール 1
- and_rules:
rules:
- url_path:
path:
exact: /api/appc/bbb/ccc
- header:
exact_match: "exampleB.com"
name: ":authority"
# ルール 2
- and_rules:
rules:
- url_path:
path:
exact: /api/appc/ccc/ddd
- header:
exact_match: "exampleB.com"
name: ":authority"
- and_rules:
rules:
# ルール 3
- url_path:
path:
prefix: /api/
# not_rule は、以下の構成が満たされていない場合にのみ認証ルールが有効になることを示します。
# ルール 4
- not_rule:
url_path:
path:
exact: /api/appa/bbb
# ルール 5
- not_rule:
url_path:
path:
exact: /api/appb/ccc
- header:
exact_match: "exampleA.com"
name: ":authority"
- and_rules:
rules:
# ルール 6
- url_path:
path:
prefix: /
# not_rule は、以下の構成が満たされていない場合にのみ認証ルールが有効になることを示します。
# ルール 7
- not_rule:
url_path:
path:
exact: /api/appa/bbb
# ルール 8
- not_rule:
url_path:
path:
exact: /api/appb/ccc
# ルール 9
- not_rule:
url_path:
path:
prefix: /api/appc/
- header:
exact_match: "exampleB.com"
name: ":authority"