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

Вы просматриваете документацию 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.

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

Разрешить 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).
  • Укажите порядок проверки правил.
  • Все правила матча выполняются в заданном порядке. При совпадении правил выполняется соответствующее действие, а последующие правила соответствия пропускаются.
    • Если для одного и того же правила настроены действия РАЗРЕШИТЬ и ЗАПРЕТИТЬ, срабатывает правило, определенное первым в порядке, а последующее правило (с другим действием) пропускается.

Как политика выбирает 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 организации Get . Затем:

  • Если вы не видите 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 для частного облака после изменения значения свойства 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 . Дополнительные сведения см . в справочнике по показателям, параметрам и фильтрам Google 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-адресу /number (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 , где последняя 1 — это 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
Действие, которое необходимо предпринять (разрешить или запретить доступ), если указанное правило соответствия не разрешено (не сопоставлено).
Допустимое значение: РАЗРЕШИТЬ или ЗАПРЕТИТЬ.
Нить ПОЗВОЛЯТЬ Необходимый

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

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

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

Атрибуты

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

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

Допустимое значение: РАЗРЕШИТЬ или ЗАПРЕТИТЬ.

Нить ПОЗВОЛЯТЬ Необходимый

Элемент <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, чтобы только доверенные 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>