AccessControl ポリシーのランタイム エラーのトラブルシューティング

Apigee Edge のドキュメントを表示しています。
Apigee X のドキュメントに移動
情報

IPDeniedAccess

エラーコード

accesscontrol.IPDeniedAccess

エラー レスポンスの本文

{
    "fault": {
        "faultstring": "Access Denied for client ip : client_IP",
        "detail": {
            "errorcode": "accesscontrol.IPDeniedAccess"
        }
    }
}

エラー メッセージの例

{
    "fault": {
        "faultstring": "Access Denied for client ip : 104.132.196.83",
        "detail": {
            "errorcode": "accesscontrol.IPDeniedAccess"
        }
    }
}

原因

このエラーは、クライアント IP アドレス、または API リクエストの一部として渡された IP アドレスが、アクセス制御ポリシーの <MatchRule> 要素内の <SourceAddress> 要素で指定された IP アドレスと一致し、<MatchRule> 要素の action 属性が DENY に設定されている場合に発生します。

たとえば、次のように <SourceAddress> が定義されているとします。

<SourceAddress mask="32">104.132.196.83</SourceAddress>

上記の IP アドレスがクライアント システムの IP アドレス(変数 proxy.client.ip で示される)または API リクエストの一部として渡された IP アドレスと一致する場合、このエラーが発生します。

診断

  1. 特定の API リクエストに対するアクセスが拒否された IP アドレスを特定します。この情報はエラー レスポンスの faultstring 要素で調べることができます。

    たとえば、次の faultstring では、IP アドレスは 104.132.196.83: です。

    "faultstring": "Access Denied for client ip : 104.132.196.83"
    
  2. 失敗した API プロキシのすべてのアクセス制御ポリシーを調べ、<SourceAddress> 要素で指定された IP アドレスが faultstring で識別された IP アドレスと一致する特定のポリシーを特定します(上記の手順 1)。

    たとえば、次のポリシーでは <SourceAddress> IP を faultstring の内容と一致する 104.132.196.83, として定義します。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <AccessControl async="false" continueOnError="false" enabled="true" name="Access-Control">
        <DisplayName>Access-Control</DisplayName>
        <Properties/>
        <IPRules noRuleMatchAction="ALLOW">
            <MatchRule action="DENY">
                <SourceAddress mask="32">104.132.196.83</SourceAddress>
            </MatchRule>
        </IPRules>
        </AccessControl>
    
  3. API リクエストが行われた IP アドレスを特定します。これにはいくつかの方法があります。

    1. UI トレースの使用

      1. 失敗した API リクエストのトレースをキャプチャします。
      2. 失敗した特定のアクセス制御ポリシーを右側のパネルから選択します。
      3. 次のトレース例のスクリーンショットに示すように、変数 proxy.client.ip の値を確認します。

      4. proxy.client.ip がリストにない場合は、X-Forwarded-For または True-Client-IP メッセージ ヘッダーの値を確認してください。

    2. カスタム レポートの使用

      カスタム レポートを作成して、API プロキシ内のアクセス制御ポリシーの実行中に 403 ステータス コードがスローされたかどうかを判別し、クライアント IP アドレスを特定できます。これは、過去に発生した問題の場合、または問題が断続的に発生し、UI でトレースをキャプチャできない場合に便利です。

      カスタム レポートの作成方法については、カスタム レポートを作成、管理するをご覧ください。カスタム レポートで次のいずれかを選択します。

      1. 指標としてのトラフィックの合計

      2. ディメンションとしてプロキシレスポンス ステータス コードプロキシ クライアント IPX-Forwarded-For

      これにより、エラーにつながったクライアント IP または IP アドレスを特定できます。

  4. クライアント IP アドレス(変数 proxy.client.ip で示される)、または API リクエストの一部として渡される IP アドレスが、アクセス制御ポリシーの <MatchRule> 要素内の <SourceAddress> 要素で指定された IP アドレスと一致し、action 属性が DENY に設定されている場合、これがエラーの原因です。

    上記の例では、参照変数 proxy.client.ip に設定された値(上記のトレースのスクリーンショットを参照)はアクセス制御ポリシーの <SourceAddress> 要素で定義された IP アドレスと一致しているため、次のエラー レスポンスがトリガーされます。

    "faultstring": "Access Denied for client ip : 104.132.196.83"
    
    

解決策

アクセス制御ポリシーで、faultstring にリストされている特定の IP アドレスからの API アクセスを拒否するように設計されている場合、エラー メッセージが表示されるのは想定内の動作です。この場合、追加のアクションは必要ありません。

ただし、特定の IP アドレスに対して特定の API プロキシの API リクエストへのアクセスを許可する場合は、アクセス制御ポリシーを変更して、その IP アドレスへのアクセスを許可します。また、IP アドレスへのアクセスを拒否しない場合は、API プロキシからアクセス制御ポリシーを削除します。

次の例では、特定の IP アドレス 104.132.196.83 へのアクセスのみを許可し、残りのアドレスへのアクセスを拒否する方法を示します。

<AccessControl name="ACL">
  <IPRules noRuleMatchAction = "DENY">
    <MatchRule action = "ALLOW">
      <SourceAddress mask="32">104.132.196.83</SourceAddress>
    </MatchRule>
  </IPRules>
</AccessControl>