Политика авторизации Apache APISIX: Защитите свои API
April 21, 2023
Введение
В настоящее время API стали мостом, соединяющим различные системы и приложения в плане данных и функциональности. Наслаждаясь удобством API, обеспечение безопасности данных и предотвращение утечек данных и других проблем безопасности стали основными задачами пользователей. В этот момент контроль доступа играет ключевую роль. Разрабатывая соответствующие политики контроля доступа для API, вы не только защищаете API от огромного количества кибератак и обеспечиваете безопасность данных, но и помогаете компаниям соответствовать требованиям соответствия и повышать доверие клиентов.
Apache APISIX — это динамический, высокопроизводительный API-шлюз для облачных приложений, который предлагает богатый набор функций управления трафиком, таких как балансировка нагрузки, динамический апстрим, канареечные релизы, отключение сервисов, аутентификация и наблюдаемость. В этой статье мы представим политики контроля доступа Apache APISIX и обсудим, какие общие стратегии можно использовать для защиты безопасности вашего API и обеспечения стабильной работы вашей системы.
Что такое политика контроля доступа?
Политики контроля доступа — это механизмы безопасности, предназначенные для защиты конфиденциальных данных или ресурсов в компьютерных системах, сетях или приложениях, гарантируя, что только авторизованные пользователи или приложения могут получить к ним доступ. Это помогает снизить риск утечки данных и уязвимостей безопасности. В API-шлюзе политики контроля доступа являются важным компонентом. Как точка входа для всего трафика, API-шлюз отвечает за прием и пересылку всех запросов API. Поэтому политики контроля доступа API-шлюза напрямую определяют безопасность и стабильность вышестоящих сервисов.
Общие политики контроля доступа в Apache APISIX
Apache APISIX предлагает богатый набор политик контроля доступа, поддерживая протокол аутентификации OAuth 2.0 и интегрируясь с различными внешними сервисами аутентификации, такими как Keycloak, Ory Hydra, Okta, Auth0 и другие. Помимо поддержки внешних сервисов аутентификации, APISIX также предоставляет мощные внутренние методы аутентификации. В сочетании с объектом Consumer APISIX вы можете свободно комбинировать плагины аутентификации, авторизации, ограничения скорости, черного и белого списка IP-адресов для защиты ваших API и эффективного предотвращения повреждения ваших API-сервисов злонамеренными запросами.

1. Контроль доступа на основе IP
Контроль доступа на основе IP — это самый простой и прямой метод, который может ограничить доступ к вашему API только запросами с определенных адресов.
Вы можете использовать плагин ip-restriction APISIX для включения этой функции, который предлагает различные варианты конфигурации, такие как списки разрешенных или запрещенных IP-адресов, диапазоны IP-адресов и сообщения об ошибках, возвращаемые при отклонении запросов. Вы можете настроить эти параметры в соответствии с вашими потребностями для достижения более детального контроля доступа. Стоит отметить, что контроль доступа на основе IP может иметь некоторые ограничения, так как IP-адреса могут быть подделаны или использоваться совместно. Поэтому при использовании плагина ip-restriction лучше всего сочетать его с другими плагинами контроля доступа, чтобы повысить безопасность и гибкость вашей системы.
2. Контроль доступа на основе API Key
Этот контроль доступа является очень распространенной стратегией контроля доступа к API. Его основной принцип заключается в аутентификации и авторизации запросов через предварительно сгенерированный API Key, что позволяет быстро добавить механизмы аутентификации в API. Однако важно защитить API Key, чтобы предотвратить его утечку и злонамеренные атаки.
Плагин key-auth APISIX может легко добавить механизмы аутентификации в ваши API, добавляя ключ в строку запроса или заголовок для аутентификации при отправке запросов. В версии APISIX 3.1 и выше также поддерживается шифрование и хранение API Keys в etcd с использованием конфигурации encrypted storage fields data_encryption, что дополнительно повышает безопасность вашего API.
3. Контроль доступа на основе токенов
Этот метод реализуется путем добавления поля аутентификации, содержащего токен, в заголовок запроса. Токен — это ключ, обычно строка или число, используемый для проверки того, имеет ли отправитель запроса API разрешение на доступ к API. Обычно токен содержит идентификатор пользователя и его права, что позволяет серверу определить, имеет ли пользователь право доступа при инициации запроса API, и принять соответствующее решение о разрешении или отказе.
APISIX предоставляет плагин jwt-auth для использования этой стратегии контроля доступа, поддерживая такие параметры конфигурации, как место хранения токена, срок действия токена, алгоритм подписи JWT и ключи. Вы можете настроить эти параметры в соответствии с вашими потребностями, чтобы удовлетворить различные требования аутентификации.
4. Контроль доступа на основе пути запроса
Контроль доступа на основе пути запроса достигается путем фильтрации и сопоставления путей запросов для управления доступом к определенным API, сервисам или ресурсам. Эта стратегия часто используется в сценариях, требующих детального контроля доступа к ресурсам, таких как защита конфиденциальных данных или управление доступом определенных пользователей к определенным ресурсам в системе.
Плагин uri-blocker APISIX поддерживает настройку списков правил regex для перехвата URI запросов пользователей и настройку rejected_code и rejected_msg для указания HTTP-статуса и тела ответа, возвращаемого после успешного перехвата. Это позволяет администраторам детально управлять правами пользователей и повышать безопасность и управляемость API.
5. Политика контроля доступа на основе ACL
ACL (Access Control List) — это политика контроля доступа на основе списков, используемая для управления правами доступа пользователей или групп пользователей к ресурсам. Ее основной принцип заключается в определении списка ACL для каждого ресурса, в котором перечислены пользователи или группы пользователей, которым разрешен доступ к ресурсу. Когда пользователь запрашивает доступ к ресурсу, его доступ определяется на основе соответствующего списка ACL.
В APISIX мы можем использовать плагин consumer-restriction для включения этой функции. Администраторы могут легко управлять тем, какие пользователи или группы пользователей могут получать доступ к определенным ресурсам, и предотвращать отправку запросов неавторизованными пользователями в чувствительные области, избегая утечек конфиденциальных данных.
Введение в сценарий: Детальный контроль доступа
В реальных сценариях применения мы часто реализуем детальный контроль доступа к ресурсам, содержащим конфиденциальные данные. Например, у нас есть два пользователя, A и B, которые используют одни и те же внутренние методы аутентификации, такие как key-auth или basic-auth. Мы также хотим применить детальный контроль доступа к пользователю B, запретив ему доступ к определенным API.

Мы можем использовать плагин consumer-restriction APISIX для некоторого детального контроля. Этот плагин позволяет вам устанавливать ограничения доступа на основе Route, Service или Consumer, и он поддерживает настройку четырех значений атрибута type:
consumer_name: Ограничить доступ Consumer к Route или Service, включивusernameConsumer в белый или черный список.consumer_group_id: Ограничить доступ Consumer к Route или Service, включивidгруппы Consumer в белый или черный список.service_id: Ограничить доступ Consumer к Service, включивidService в белый или черный список. Это должно использоваться в сочетании с плагином авторизации.route_id: Ограничить доступ Consumer к Route, включивidRoute в белый или черный список.
В этом сценарии мы можем использовать два метода конфигурации, чтобы предотвратить доступ пользователя B к определенному ресурсу API.
Настройка политики контроля доступа в Route
- Сначала нам нужно создать два объекта Consumer в APISIX и включить плагин
basic-auth, с именами userA и userB.
curl http://127.0.0.1:9180/apisix/admin/consumers -H 'X-API-KEY: {YOUR_API_KEY}' -X PUT -i -d ' { "username": "userA", "plugins": { "basic-auth": { "username":"userA", "password": "123456" } } }' curl http://127.0.0.1:9180/apisix/admin/consumers -H 'X-API-KEY: {YOUR_API_KEY}' -X PUT -i -d ' { "username": "userB", "plugins": { "basic-auth": { "username":"userB", "password": "123456" } } }'
- Затем мы включаем и настраиваем свойство
whitelistплагинаconsumer-restrictionна маршруте, где нужно применить ограничение, и добавляемusernameранее созданного пользователя userA. Таким образом, маршрут будет принимать только запросы от userA.
curl http://127.0.0.1:9180/apisix/admin/routes/1 -H 'X-API-KEY: {YOUR_API_KEY}' -X PUT -d ' { "uri": "/get", "upstream": { "type": "roundrobin", "nodes": { "httpbin.org:80": 1 } }, "plugins": { "basic-auth": {}, "consumer-restriction": { "whitelist": [ "userA" ] } } }'
- Отправляем запросы на доступ отдельно с использованием userA и userB.
curl -u userA:123456 http://127.0.0.1:9080/get -i HTTP/1.1 200 OK
curl -u userB:123456 http://127.0.0.1:9080/get -i HTTP/1.1 403 Forbidden ... {"message":"The consumer_name is forbidden."}
Результат показывает, что доступ пользователя B к ресурсу API был ограничен.
Настройка политик контроля доступа в Consumer
- Сначала мы создадим маршрут с ID
forbidden-userBи включим плагинbasic-auth.
curl http://127.0.0.1:9180/apisix/admin/routes -H 'X-API-KEY: {YOUR_API_KEY}' -X PUT -d ' { "id": "forbidden-userB", "uri": "/get", "upstream": { "type": "roundrobin", "nodes": { "httpbin.org:80": 1 } }, "plugins": { "basic-auth": {} } }'
- Создаем два объекта Consumer и включаем плагин
basic-auth. Обратите внимание, что нам нужно настроить плагинconsumer-restrictionдля детальной настройки политик контроля доступа для userB.
curl http://127.0.0.1:9180/apisix/admin/consumers -H 'X-API-KEY: {YOUR_API_KEY}' -X PUT -i -d ' { "username": "userA", "plugins": { "basic-auth": { "username":"userA", "password": "123456" } } }' curl http://127.0.0.1:9180/apisix/admin/consumers -H 'X-API-KEY: {YOUR_API_KEY}' -X PUT -i -d ' { "username": "userB", "plugins": { "basic-auth": { "username":"userB", "password": "123456" }, "consumer-restriction": { "type": "route_id", "blacklist": [ "forbidden-userB" ], "rejected_code": 403 } } }'
- Отправляем запросы с использованием userA и userB отдельно.
curl -u userA:123456 http://127.0.0.1:9080/get -i HTTP/1.1 200 OK
curl -u userB:123456 http://127.0.0.1:9080/get -i HTTP/1.1 403 Forbidden ... {"message":"The route_id is forbidden."}
Изучив результаты тестов, мы можем убедиться, что запросы пользователя B были эффективно ограничены.
Заключение
В этой статье представлены часто используемые политики контроля доступа в APISIX и показано, как включить и настроить их в APISIX на примере классического сценария. Контроль доступа — это распространенная стратегия в API-шлюзах. APISIX не только предлагает полный набор готовых к использованию плагинов для аутентификации, но и предоставляет обширную поддержку в таких областях, как безопасность, управление трафиком и наблюдаемость. Выбирая и настраивая правила политик контроля доступа, вы можете легко укрепить безопасность ваших API.