عیب یابی خطای زمان اجرا خط مشی 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 مشتری یا هر آدرس IP که به عنوان بخشی از درخواست API ارسال شده است، با هر آدرس IP مشخص شده در عنصر <SourceAddress> در عنصر <MatchRule> خط مشی کنترل دسترسی و action مطابقت داشته باشد. ویژگی عنصر <MatchRule> روی DENY تنظیم شده است.

برای مثال، فرض کنید <SourceAddress> مطابق شکل زیر تعریف شده است:

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

اگر آدرس IP بالا با آدرس IP سیستم کلاینت (که با متغیر proxy.client.ip نشان داده شده است) یا هر یک از آدرس های IP ارسال شده به عنوان بخشی از درخواست API مطابقت داشته باشد، خطا رخ می دهد.

تشخیص

  1. آدرس(های) IP را که برای یک درخواست API خاص از دسترسی محروم شده اند، شناسایی کنید. شما می توانید این اطلاعات را در عنصر faultstring پاسخ خطا پیدا کنید.

    به عنوان مثال، در faultstring زیر، آدرس IP 104.132.196.83:

    "faultstring": "Access Denied for client ip : 104.132.196.83"
    
  2. تمام خط مشی های کنترل دسترسی را در پروکسی API ناموفق بررسی کنید و خط مشی خاصی را تعیین کنید که در آن آدرس(های) IP مشخص شده در عنصر <SourceAddress> با آدرس(های) IP شناسایی شده در faultstring مطابقت دارد (مرحله 1 در بالا).

    به عنوان مثال، سیاست زیر IP <SourceAddress> را به عنوان 104.132.196.83, تعریف می کند که با آنچه در faultstring است مطابقت دارد:

    <?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. آدرس(های) IP که درخواست API از آن انجام شده است را تعیین کنید. این را می توان به روش های مختلف انجام داد:

    1. با استفاده از UI Trace

      1. ردیابی درخواست API ناموفق را ضبط کنید.
      2. خط مشی کنترل دسترسی خاصی را که شکست خورده است را از پانل سمت راست انتخاب کنید.
      3. مقدار متغیر proxy.client.ip را همانطور که در تصویر زیر از یک نمونه ردیابی نشان داده شده است بررسی کنید.

      4. اگر proxy.client.ip در لیست نیست، مقدار هدر پیام X-Forwarded-For یا True-Client-IP را بررسی کنید.

    2. استفاده از گزارش های سفارشی

      می‌توانید گزارش‌های سفارشی ایجاد کنید تا مشخص کنید که آیا کد وضعیت 403 در حین اجرای خط‌مشی کنترل دسترسی در پروکسی API پرتاب شده است یا خیر و همچنین آدرس IP مشتری را تعیین کنید. این به ویژه در صورتی مفید است که مشکل در گذشته رخ داده باشد یا اگر مشکل متناوب باشد و شما نتوانید ردیابی را در UI ثبت کنید.

      برای درک نحوه ایجاد گزارش های سفارشی به ایجاد و مدیریت گزارش های سفارشی مراجعه کنید. در گزارش سفارشی، انتخاب کنید:

      1. مجموع ترافیک به عنوان یک متریک و

      2. پروکسی ، کد وضعیت پاسخ ، IP مشتری پروکسی و X-Forwarded-For as Dimensions.

      این باید به شما کمک کند تا IP مشتری یا آدرس های IP ارسال شده که منجر به خطا شده است را تعیین کنید.

  4. اگر آدرس IP مشتری (که با متغیر proxy.client.ip نشان داده شده است)، یا هر آدرس IP که به عنوان بخشی از درخواست API ارسال شده است، با آدرس(های) IP مشخص شده در عنصر <SourceAddress> در عنصر <MatchRule> مطابقت دارد. خط مشی کنترل دسترسی، که در آن ویژگی action روی DENY تنظیم شده است، پس این دلیل خطا است.

    در مثال نشان داده شده در بالا، مقدار تنظیم شده در متغیر مرجع proxy.client.ip (همانطور که در تصویر ردیابی بالا مشاهده می شود) با آدرس IP تعریف شده در عنصر <SourceAddress> خط مشی Access Control مطابقت دارد و در نتیجه باعث ایجاد خطا می شود. پاسخ:

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

قطعنامه

اگر خط مشی کنترل دسترسی برای رد دسترسی به درخواست های API از آدرس(های) IP خاص فهرست شده در faultstring در نظر گرفته شده است، پیام خطا انتظار می رود. در این صورت نیازی به اقدام اضافی نیست.

با این حال، اگر تشخیص دادید که آدرس(های) 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>