Правила AccessControl

Вы просматриваете документацию по Apigee Edge.
Перейдите к документации по Apigee X.
Информация

Что

Правила контроля доступа позволяют разрешать или запрещать доступ к API с определенных IP-адресов.

Видео. Посмотрите короткое видео о том, как разрешить или запретить доступ к вашим API с определенных IP-адресов.

Вы можете прикрепить это правило к любому месту в потоке прокси-сервера API, но, скорее всего, вам захочется проверять IP-адреса в начале потока ( Request / ProxyEndpoint / PreFlow), даже до аутентификации или проверки квоты.

Примеры

Значения маски в приведенных ниже примерах IPv4 определяют, какие из четырех октетов (8, 16, 24, 32 бита) учитываются правилом соответствия при предоставлении или запрете доступа. Значение по умолчанию: 32. Подробнее об этом атрибуте рассказывается в разделе mask справочника по элементам.

Отклонить 198.51.100.1

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

Отклонить все запросы от клиентского адреса 198.51.100.1

Разрешить запросы с любого другого адреса клиента.

Запретить использование переменных

<AccessControl name="ACL">
  <IPRules noRuleMatchAction = "ALLOW">
    <MatchRule action = "DENY">
      <SourceAddress mask="{kvm.mask.value}">{kvm.ip.value}</SourceAddress>
    </MatchRule>
    </IPRules>
</AccessControl>

Предположим, вы используете карту "ключ-значение" (KVM) для хранения значений маскировки и IP-адресов. Это удобный способ изменить IP-адреса и маски во время выполнения без необходимости обновлять и повторно развертывать прокси-сервер API. Вы можете использовать правило KeyValueMapOperations, чтобы получить переменные, содержащие значения для kvm.mask.value и kvm.ip.value (если вы назвали переменные в правиле KVM именно так и если они содержат значения маски и IP-адреса из KVM). Если вы получили значения 24 для маски и 198.51.100.1 для IP-адреса, то правило AccessControl будет отклонять все запросы от 198.51.100.*.

Все остальные адреса клиентов будут разрешены.

Отклонить 198.51.100.*

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

Отклонить все запросы от клиентского адреса 198.51.100.*

Разрешить запросы с любого другого адреса клиента.

198.51.*.*

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

Отклонить все запросы с клиентского адреса 198.51.*.*

Разрешить запросы с любого другого адреса клиента.

Запретить 198.51.100.*, разрешить 192.0.2.1

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

Блокировать все запросы с клиентского адреса 198.51.100.*, но разрешить запросы с адреса 192.0.2.1.

Разрешить запросы с любого другого адреса клиента.

Allow 198.51.*.*

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

Разрешить все запросы с адреса 198.51.*.*

Отклонять запросы от любых других клиентских адресов.

Разрешить несколько IP-адресов

<AccessControl name="ACL">
  <IPRules noRuleMatchAction = "DENY">
    <MatchRule action = "ALLOW">
      <SourceAddress mask="24">198.51.100.1</SourceAddress>
      <SourceAddress mask="24">192.0.2.1</SourceAddress>
      <SourceAddress mask="24">203.0.113.1</SourceAddress>
     </MatchRule>
  </IPRules>
</AccessControl>

Разрешить запросы с клиентских адресов: 198.51.100.* 192.0.2.* 203.0.113.*

Запретить все остальные адреса.

Как запретить доступ нескольким IP-адресам

<AccessControl name="ACL">
  <IPRules noRuleMatchAction = "ALLOW">
    <MatchRule action = "DENY">
      <SourceAddress mask="24">198.51.100.1</SourceAddress>
      <SourceAddress mask="24">192.0.2.1</SourceAddress>
      <SourceAddress mask="24">203.0.113.1</SourceAddress>
    </MatchRule>
  </IPRules>
</AccessControl>

Отклонять запросы от клиентских адресов: 198.51.100.* 192.0.2.* 203.0.113.*

Разрешить все остальные адреса.

Разрешить несколько IP-адресов, запретить несколько IP-адресов

<AccessControl name="ACL">
  <IPRules noRuleMatchAction = "DENY">
    <MatchRule action = "DENY">
      <SourceAddress mask="24">198.51.100.1</SourceAddress>
      <SourceAddress mask="24">192.0.2.1</SourceAddress>
      <SourceAddress mask="24">203.0.113.1</SourceAddress>
    </MatchRule>
    <MatchRule action = "ALLOW">
      <SourceAddress mask="16">198.51.100.1</SourceAddress>
      <SourceAddress mask="16">192.0.2.1</SourceAddress>
      <SourceAddress mask="16">203.0.113.1</SourceAddress>
    </MatchRule>
  </IPRules>
</AccessControl>

Allow: 198.51.*.* 192.0.*.* 203.0.*.*

Запретить доступ к подмножеству белого списка: 198.51.100.* 192.0.2.* 203.0.113.*


Примечания

Правило контроля доступа не только защищает ваши API от вредоносных IP-адресов, но и позволяет управлять доступом с легитимных IP-адресов. Например, если вы хотите, чтобы доступ к API в вашей тестовой среде имели только компьютеры, контролируемые вашей компанией, вы можете разрешить диапазон IP-адресов для вашей внутренней сети. Разработчики, работающие из дома, могут получить доступ к этим API через VPN.

Настройка и выполнение правил контроля доступа включают следующие этапы:

  • Определите набор правил соответствия, с каждым из которых связано одно из двух действий (РАЗРЕШИТЬ или ЗАПРЕТИТЬ).
  • Для каждого правила сопоставления укажите IP-адрес (элемент SourceAddress).
  • Укажите порядок, в котором будут проверяться правила.
  • Все правила сопоставления выполняются в заданном порядке. Если правило соответствует, выполняется соответствующее действие, а остальные правила пропускаются.
    • Если одно и то же правило настроено с действиями ALLOW и DENY, будет активировано правило, которое определено первым в порядке, а последующее правило (с другим действием) будет пропущено.

Как правило определяет, какой IP-адрес нужно проверить

IP-адреса могут поступать из разных источников в запросе. Например, заголовок письма True-Client-IP может содержать IP-адрес, а заголовок X-Forwarded-For – один или несколько IP-адресов. В этом разделе рассказывается, как настроить правило AccessControl, чтобы оно оценивало нужные вам IP-адреса.

Ниже описана логика, которую использует правило AccessControl, чтобы определить, какой IP-адрес нужно проверить:

1. Заголовок True-Client-IP

Сначала правило проверяет наличие IP-адреса в заголовке True-Client-IP. Если заголовок содержит действительный IP-адрес, правило оценивает этот адрес.

2. Заголовок X-Forwarded-For

Если заголовок True-Client-IP отсутствует или вы задали для элемента <IgnoreTrueClientIPHeader> значение true, правило оценивает IP-адреса в заголовке X-Forwarded-For.

Edge автоматически заполняет заголовок X-Forwarded-For IP-адресом, полученным в результате последнего внешнего рукопожатия TCP (например, IP-адресом клиента или маршрутизатора). Если в заголовке несколько IP-адресов, скорее всего, это цепочка серверов, которые обработали запрос. Однако список адресов также может содержать поддельный IP-адрес. Как правила определяют, какие адреса нужно проверять?

Конфигурация организации и правила определяют, какие адреса X-Forwarded-For оцениваются правилом.

Сначала проверьте, задано ли для вашей организации свойство feature.enableMultipleXForwardCheckForACL. Вы можете использовать API Получить организацию. Тогда:

  • Если вы не видите feature.enableMultipleXForwardCheckForACL в списке ресурсов организации, значит для этого ресурса задано значение false (по умолчанию). Если для этого свойства задано значение false, правило оценивает последний адрес в заголовке (видимый в инструменте трассировки), который представляет собой IP-адрес, полученный Edge от последнего внешнего подтверждения установления TCP-соединения.
  • Если для правила feature.enableMultipleXForwardCheckForACL в вашей организации задано значение true, настройте элемент <ValidateBasedOn>, чтобы определить, какие IP-адреса будут оцениваться правилом.

изменили свойство feature.enableMultipleXForwardCheckForACL;

Администраторы организации Edge могут использовать API Update organization properties, чтобы задать свойство feature.enableMultipleXForwardCheckForACL.

В приведенном ниже примере API задается свойство в Edge для частного облака. Если в вашей организации заданы другие свойства, добавьте их тоже. В противном случае они будут удалены.

curl -u email:password -X POST -H "Content-type:application/xml" http://host:8080/v1/o/myorg -d \
"<Organization type="trial" name="MyOrganization">
    <DisplayName>MyOrganization</DisplayName>
    <Properties>
        <Property name="feature.enableMultipleXForwardCheckForACL">true</Property>
        <!-- Include other existing properties as well. -->
    </Properties>
</Organization>"

В Edge для частного облака после изменения значения свойства feature.enableMultipleXForwardCheckForACL необходимо перезапустить процессоры сообщений, как описано в разделе Запуск, остановка и перезапуск отдельных компонентов.

Параметры X-Forwarded-For в аналитике Apigee

Edge Analytics записывает значение заголовка X-Forwarded-For в параметр x_forwarded_for_ip. Чтобы определить IP-адрес клиента, отправившего запрос в Edge, используйте значения параметров ax_true_client_ip или ax_resolved_client_ip. Подробнее о показателях, параметрах и фильтрах Аналитики…

Деидентификация IP-адресов с помощью нотации CIDR

Нотация CIDR (бесклассовая междоменная маршрутизация) – это способ указать диапазон IP-адресов с помощью маскировки. Это относится к IPv4 и IPv6. Вот как это работает. В наших примерах для простоты используется IPv4.

IP-адреса представляют собой группы чисел, разделенных точками. В двоичной системе каждая группа представляет собой определенное количество битов (8 для IPv4 и 16 для IPv6). IP-адрес IPv4 198.51.100.1 в двоичном виде выглядит так:

11000110.00110011.01100100.00000001

Это четыре группы по восемь бит, то есть всего 32 бита. В нотации CIDR диапазон можно указать, добавив к IP-адресу косую черту и число от 1 до 32, например:

198.51.100.1/24

В этом случае значением атрибута mask в правиле будет число 24.

Эта запись означает, что первые 24 бита должны быть сохранены без изменений, а оставшиеся биты могут иметь любое значение от 0 до 255. Пример:

Оставьте их без изменений. Возможные значения для последней группы
198.51.100. 0–255

Обратите внимание, что маска применяется в конце третьей группы. Таким образом, вы создаете маску, например 198.51.100.*. В большинстве случаев для маскировки достаточно использовать числа, кратные 8 (для IPv4) и 16 (для IPv6):

IPv4: 8, 16, 24, 32

IPv6: 16, 32, 48, 64, 80, 96, 112, 128.

Однако вы можете использовать другие числа для более точного управления, которое включает небольшие вычисления в двоичной системе. Пример с маской 30, как в 198.51.100.1/30, где последняя единица в двоичном коде 00000001:

Оставьте их без изменений. Возможные значения
11000110.00110011.01100100.000000 (первые 30 бит) 00000000, 00000001, 00000010 или 00000011
198.51.100. 0, 1, 2 или 3

В этом примере при конфигурации, заданной как <SourceAddress mask="30">198.51.100.1</SourceAddress>, будут разрешены (или запрещены, в зависимости от ваших правил) следующие IP-адреса:

  • 198.51.100.0
  • 198.51.100.1
  • 198.51.100.2
  • 198.51.100.3

Сведения об элементах

В справочнике по элементам описаны элементы и атрибуты правила контроля доступа.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AccessControl async="false" continueOnError="false" enabled="true" name="Access-Control-1">
    <DisplayName>Access Control 1</DisplayName>
    <IPRules noRuleMatchAction = "ALLOW">
        <MatchRule action = "ALLOW">
            <SourceAddress mask="32">198.51.100.1</SourceAddress>
        </MatchRule>
        <MatchRule action = "DENY">
            <SourceAddress mask="24">198.51.100.1</SourceAddress>
        </MatchRule>
    </IPRules>
    <ValidateBasedOn>X_FORWARDED_FOR_ALL_IP</ValidateBasedOn>
</AccessControl>

Атрибуты <AccessControl>

<AccessControl async="false" continueOnError="false" enabled="true" name="Access-Control-1"> 

The following table describes attributes that are common to all policy parent elements:

Attribute Description Default Presence
name

The internal name of the policy. The value of the name attribute can contain letters, numbers, spaces, hyphens, underscores, and periods. This value cannot exceed 255 characters.

Optionally, use the <DisplayName> element to label the policy in the management UI proxy editor with a different, natural-language name.

N/A Required
continueOnError

Set to false to return an error when a policy fails. This is expected behavior for most policies.

Set to true to have flow execution continue even after a policy fails.

false Optional
enabled

Set to true to enforce the policy.

Set to false to turn off the policy. The policy will not be enforced even if it remains attached to a flow.

true Optional
async

This attribute is deprecated.

false Deprecated

<DisplayName> element

Use in addition to the name attribute to label the policy in the management UI proxy editor with a different, natural-language name.

<DisplayName>Policy Display Name</DisplayName>
Default

N/A

If you omit this element, the value of the policy's name attribute is used.

Presence Optional
Type String

Элемент <IgnoreTrueClientIPHeader>

Если задать значение True, правило будет игнорировать заголовок True-Client-IP и оценивать IP-адреса в заголовке X-Forwarded-For в соответствии с настроенным поведением при оценке X-Forwarded-For.

<AccessControl async="false" continueOnError="false" enabled="true" name="Access-Control-1">
    <DisplayName>Access Control-1</DisplayName>
    <IgnoreTrueClientIPHeader>true</IgnoreTrueClientIPHeader>
    ...
</AccessControl>
По умолчанию false
Тип поля Необязательно
Тип Логическое значение

Элемент <IPRules>

Родительский элемент, содержащий правила, которые разрешают или запрещают IP-адреса. Атрибут noRuleMatchAction позволяет определить, как обрабатывать IP-адреса, не соответствующие правилам сопоставления.

<IPRules noRuleMatchAction = "ALLOW">
По умолчанию Н/Д
Тип поля Необязательно
Тип Н/Д

Атрибуты

Атрибут Описание Тип По умолчанию Тип поля
noRuleMatchAction
Действие, которое нужно выполнить (разрешить или запретить доступ), если указанное правило соответствия не разрешено (не найдено соответствие).
Допустимые значения: ALLOW или DENY.
Строка РАЗРЕШИТЬ Обязательно

Элемент <IPRules>/<MatchRule>

Действие, которое нужно выполнить (разрешить или запретить доступ), если IP-адрес соответствует SourceAddress(es), которые вы определили.

<IPRules noRuleMatchAction = "ALLOW">
    <MatchRule action = "ALLOW">
        <SourceAddress mask="32">198.51.100.1</SourceAddress>
    </MatchRule>
    <MatchRule action = "DENY">
        <SourceAddress mask="24">198.51.100.1</SourceAddress>
    </MatchRule>
</IPRules>
По умолчанию Н/Д
Тип поля Необязательно
Тип Н/Д

Атрибуты

Атрибут Описание Тип По умолчанию Тип поля
действие

Действие, которое нужно выполнить (разрешить или запретить доступ), если указанное правило соответствия не разрешено (не найдено соответствие).

Допустимые значения: ALLOW или DENY.

Строка РАЗРЕШИТЬ Обязательно

Элемент <IPRules>/<MatchRule>/<SourceAddress>

Диапазон IP-адресов клиента.

Допустимое значение: действительный IP-адрес (в десятично-точечной нотации). Чтобы использовать подстановочные знаки, добавьте атрибут mask.

<IPRules noRuleMatchAction = "ALLOW">
    <MatchRule action = "ALLOW">
        <SourceAddress mask="{variable}">198.51.100.1</SourceAddress>
    </MatchRule>
    <MatchRule action = "DENY">
        <SourceAddress mask="24">{variable}</SourceAddress>
    </MatchRule>
</IPRules>

Как показано в предыдущем примере, элемент SourceAddress также поддерживает шаблоны сообщений для атрибута mask или IP-адреса. Это означает, что вы можете задавать значения с помощью переменных, доступных в потоке прокси-сервера API.

Например, вы можете сохранить IP-адрес в карте "ключ-значение" (KVM) и использовать правило KeyValueMapOperations, чтобы получить IP-адрес и назначить его переменной (например, kvm.ip.value). После этого вы сможете использовать эту переменную для IP-адреса:

<SourceAddress mask="24">{kvm.ip.value}</SourceAddress>

Установка маски и/или IP-адреса с помощью переменной позволяет изменять значения во время выполнения без необходимости изменять и повторно развертывать прокси API.

По умолчанию Н/Д
Тип поля Необязательно
Тип Строка (только один IP-адрес)

Атрибуты

Атрибут Описание Тип По умолчанию Тип поля
маска

Атрибут mask позволяет указать диапазон IP-адресов, которые нужно разрешить или запретить. Маска эквивалентна нотации бесклассовой адресации (CIDR). Пример:

<SourceAddress mask="24">198.51.100.1</SourceAddress>

эквивалентно следующей нотации CIDR:

198.51.100.1/24

Допустимые значения:

IPv4: 1–32

IPv6: 1–128

Значение "0" допустимо только для IP-адреса 0.0.0.0, поэтому оно непрактично.

Как задать маску с помощью переменной

Атрибут mask также поддерживает шаблоны сообщений, а это значит, что вы можете задать значение с помощью переменной, которая в данный момент доступна в потоке прокси-сервера API. Например, вы можете сохранить значение маски в KVM и использовать правило KeyValueMapOperations, чтобы извлечь маску и назначить ее переменной. Чтобы задать маску IP-адреса с помощью переменной, используйте следующий формат (предполагается, что переменная называется kvm.mask.value):

mask="{kvm.mask.value}"

Целое число Н/Д Обязательно

Элемент <ValidateBasedOn>

Если HTTP-заголовок X-Forwarded-For содержит несколько IP-адресов, используйте элемент ValidateBasedOn, чтобы указать, какие из них нужно оценивать.

Используйте этот подход к оценке IP-адресов, только если вы уверены в их действительности. Например, если вы решите оценивать все IP-адреса в заголовке X-Forwarded-For, вам нужно будет доверять действительности этих адресов и/или настроить комплексные правила DENY или ALLOW, чтобы только доверенные IP-адреса могли вызывать ваш прокси-сервер API.

Самый левый IP-адрес в заголовке принадлежит клиенту, а самый правый – серверу, который переслал запрос текущему сервису. Крайний справа или последний IP-адрес – это адрес, полученный Edge в результате последнего внешнего рукопожатия TCP.

Значение, которое вы введете в этом элементе, позволит вам определить, нужно ли проверять все IP-адреса в заголовке (по умолчанию), только первый IP-адрес или только последний IP-адрес.

<AccessControl async="false" continueOnError="false" enabled="true" name="Access-Control-1">
    <DisplayName>Access Control 1</DisplayName>
    <IPRules noRuleMatchAction = "ALLOW">
        <MatchRule action = "DENY">
            <SourceAddress mask="32">198.51.100.1</SourceAddress>
        </MatchRule>
    </IPRules>
    <ValidateBasedOn>X_FORWARDED_FOR_ALL_IP</ValidateBasedOn>
</AccessControl>
По умолчанию X_FORWARDED_FOR_ALL_IP
Тип поля Необязательно
Допустимые значения

X_FORWARDED_FOR_ALL_IP (по умолчанию)

X_FORWARDED_FOR_FIRST_IP

X_FORWARDED_FOR_LAST_IP

Схемы

Каждый тип правил определяется XML-схемой (.xsd). Схемы правил доступны на GitHub.

Справочник по ошибкам

В этом разделе описаны коды ошибок и сообщения об ошибках, которые возвращаются, а также переменные ошибок, которые задаются Edge, когда это правило вызывает ошибку. Эта информация важна, если вы разрабатываете правила обработки ошибок. Подробнее о том, что нужно знать об ошибках в правилах и об обработке ошибок…

Ошибки времени выполнения

Эти ошибки могут возникать при выполнении правил.

Код ошибки Статус HTTP Причина Исправить
accesscontrol.IPDeniedAccess 403 IP-адрес клиента или IP-адрес, переданный в запросе к API, соответствует IP-адресу, указанному в элементе <SourceAddress> внутри элемента <MatchRule> правила управления доступом, а атрибут action элемента <MatchRule> имеет значение DENY.

Переменные ошибок

Эти переменные задаются при возникновении ошибки выполнения. Подробнее о переменных, связанных с ошибками правил…

Переменные Место Пример
fault.name="fault_name" fault_name – название ошибки, указанное в таблице Ошибки выполнения выше. Название ошибки – это последняя часть кода ошибки. fault.name Matches "IPDeniedAccess"
acl.policy_name.failed policy_name – заданное пользователем название правила, которое вызвало ошибку. acl.AC-AllowAccess.failed = true

Пример ответа об ошибке

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

Пример правила обработки ошибок

<FaultRule name="IPDeniedAccess">
    <Step>
        <Name>AM-IPDeniedAccess</Name>
        <Condition>(fault.name Matches "IPDeniedAccess") </Condition>
    </Step>
    <Condition>(acl.failed = true) </Condition>
</FaultRule>