Политика контроля доступа

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

Что

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

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

Хотя вы можете прикрепить эту политику в любом месте потока API-прокси, скорее всего, вам потребуется проверять IP-адреса в начале потока (Запрос / Конечная точка прокси / Предварительный поток), даже до аутентификации или проверки квот.

Образцы

Значения маски в приведенных ниже примерах 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.

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

Разрешить 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>

Разрешено: 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 For), будут оцениваться.

Сначала проверьте, задано ли свойство feature.enableMultipleXForwardCheckForACL для вашей организации. Для этого можно использовать API Get organization . Затем:

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

Изменение свойства feature.enableMultipleXForwardCheckForACL

Администраторы пограничных организаций могут использовать API обновления свойств организации для установки свойства 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 for Private Cloud после изменения значения свойства feature.enableMultipleXForwardCheckForACL необходимо перезапустить обработчики сообщений, как описано в разделе «Запуск/остановка/перезапуск отдельных компонентов» .

Измерения X-Forwarded-For в Apigee Analytics

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

О маскировании IP-адресов с использованием нотации CIDR.

CIDR (бесклассовая междоменная маршрутизация) — это способ обозначения диапазона IP-адресов посредством маскирования. Он применяется как к IPv4, так и к IPv6. Вот как это работает. Для простоты в наших примерах мы будем использовать IPv4.

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

11000110.00110011.01100100.00000001

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

198.51.100.1/24

В данном случае число 24 — это то, которое следует использовать в качестве значения атрибута mask в этой политике.

Эта запись означает: «Первые 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 бит) 000000 00 , 000000 01 , 000000 10 , или 000000 11
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"> 

В следующей таблице описаны атрибуты, общие для всех родительских элементов политики:

Атрибут Описание По умолчанию Присутствие
name

Внутреннее имя политики. Значение атрибута name может содержать буквы, цифры, пробелы, дефисы, подчеркивания и точки. Это значение не может превышать 255 символов.

При необходимости используйте элемент <DisplayName> , чтобы пометить политику в редакторе прокси-сервера пользовательского интерфейса управления другим именем на естественном языке.

Н/Д Необходимый
continueOnError

Установите значение false , чтобы возвращать ошибку в случае сбоя политики. Это ожидаемое поведение для большинства политик.

Установите значение true , чтобы выполнение потока продолжалось даже после сбоя политики.

ЛОЖЬ Необязательный
enabled

Установите значение true , чтобы обеспечить соблюдение политики.

Установите значение false , чтобы отключить политику. Политика не будет применена, даже если она останется привязанной к потоку.

истинный Необязательный
async

Этот атрибут устарел.

ЛОЖЬ Устарело

Элемент <DisplayName>

Используйте в дополнение к атрибуту name , чтобы пометить политику в редакторе прокси-сервера пользовательского интерфейса управления другим именем на естественном языке.

<DisplayName>Policy Display Name</DisplayName>
По умолчанию

Н/Д

Если вы опустите этот элемент, будет использовано значение атрибута name политики.

Присутствие Необязательный
Тип Нить

<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>
По умолчанию ЛОЖЬ
Присутствие Необязательный
Тип Логический

<IPRules> элемент

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

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

Атрибуты

Атрибут Описание Тип По умолчанию Присутствие
noRuleMatchAction
Действие, которое необходимо предпринять (разрешить или запретить доступ), если указанное правило соответствия не было разрешено (не найдено совпадение).
Допустимое значение: ALLOW или DENY
Нить ПОЗВОЛЯТЬ Необходимый

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

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

<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-адресов только в том случае, если вы уверены в достоверности проверяемых IP-адресов. Например, если вы решите проверять все IP-адреса в заголовке X-Forwarded-For , вы должны быть уверены в достоверности этих адресов и/или настроить исчерпывающие правила DENY или ALLOW, чтобы разрешить вызов вашего API-прокси только с доверенных IP-адресов.

Самый левый 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>
,

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

Что

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

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

Хотя вы можете прикрепить эту политику в любом месте потока API-прокси, скорее всего, вам потребуется проверять IP-адреса в начале потока (Запрос / Конечная точка прокси / Предварительный поток), даже до аутентификации или проверки квот.

Образцы

Значения маски в приведенных ниже примерах 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.

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

Разрешить 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>

Разрешено: 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 For), будут оцениваться.

Сначала проверьте, задано ли свойство feature.enableMultipleXForwardCheckForACL для вашей организации. Для этого можно использовать API Get organization . Затем:

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

Изменение свойства feature.enableMultipleXForwardCheckForACL

Администраторы пограничных организаций могут использовать API обновления свойств организации для установки свойства 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 for Private Cloud после изменения значения свойства feature.enableMultipleXForwardCheckForACL необходимо перезапустить обработчики сообщений, как описано в разделе «Запуск/остановка/перезапуск отдельных компонентов» .

Измерения X-Forwarded-For в Apigee Analytics

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

О маскировании IP-адресов с использованием нотации CIDR.

CIDR (бесклассовая междоменная маршрутизация) — это способ обозначения диапазона IP-адресов посредством маскирования. Он применяется как к IPv4, так и к IPv6. Вот как это работает. Для простоты в наших примерах мы будем использовать IPv4.

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

11000110.00110011.01100100.00000001

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

198.51.100.1/24

В данном случае число 24 — это то, которое следует использовать в качестве значения атрибута mask в этой политике.

Эта запись означает: «Первые 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 бит) 000000 00 , 000000 01 , 000000 10 , или 000000 11
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"> 

В следующей таблице описаны атрибуты, общие для всех родительских элементов политики:

Атрибут Описание По умолчанию Присутствие
name

Внутреннее имя политики. Значение атрибута name может содержать буквы, цифры, пробелы, дефисы, подчеркивания и точки. Это значение не может превышать 255 символов.

При необходимости используйте элемент <DisplayName> , чтобы пометить политику в редакторе прокси-сервера пользовательского интерфейса управления другим именем на естественном языке.

Н/Д Необходимый
continueOnError

Установите значение false , чтобы возвращать ошибку в случае сбоя политики. Это ожидаемое поведение для большинства политик.

Установите значение true , чтобы выполнение потока продолжалось даже после сбоя политики.

ЛОЖЬ Необязательный
enabled

Установите значение true , чтобы обеспечить соблюдение политики.

Установите значение false , чтобы отключить политику. Политика не будет применена, даже если она останется привязанной к потоку.

истинный Необязательный
async

Этот атрибут устарел.

ЛОЖЬ Устарело

Элемент <DisplayName>

Используйте в дополнение к атрибуту name , чтобы пометить политику в редакторе прокси-сервера пользовательского интерфейса управления другим именем на естественном языке.

<DisplayName>Policy Display Name</DisplayName>
По умолчанию

Н/Д

Если вы опустите этот элемент, будет использовано значение атрибута name политики.

Присутствие Необязательный
Тип Нить

<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>
По умолчанию ЛОЖЬ
Присутствие Необязательный
Тип Логический

<IPRules> элемент

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

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

Атрибуты

Атрибут Описание Тип По умолчанию Присутствие
noRuleMatchAction
Действие, которое необходимо предпринять (разрешить или запретить доступ), если указанное правило соответствия не было разрешено (не найдено совпадение).
Допустимое значение: ALLOW или DENY
Нить ПОЗВОЛЯТЬ Необходимый

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

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

<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-адресов только в том случае, если вы уверены в достоверности проверяемых IP-адресов. Например, если вы решите проверять все IP-адреса в заголовке X-Forwarded-For , вы должны быть уверены в достоверности этих адресов и/или настроить исчерпывающие правила DENY или ALLOW, чтобы разрешить вызов вашего API-прокси только с доверенных IP-адресов.

Самый левый 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>