Аутентификация в API Gateway

Yong Qian

November 25, 2022

Technology

Важность аутентификации и авторизации для API-шлюзов

Основная функция API-шлюза может быть описана как соединение потребителей API и поставщиков API.

На практике, за исключением нескольких API, которые разрешают анонимный доступ, поставщики часто ограничивают потребителей: только соответствующие потребители могут получить доступ к API. Кроме того, поставщики могут иметь разные политики доступа для разных потребителей, например, потребители A и B могут оба получить доступ к API /send_mail, но частота вызовов в минуту должна рассчитываться по-разному.

Из вышесказанного видно, что очень важно идентифицировать и проверять личность потребителей API на уровне API-шлюза. Далее мы расскажем, как открытый API-шлюз Apache APISIX реализует аутентификацию для потребителей и методы аутентификации, широко используемые предприятиями, а затем подробнее расскажем, как система аутентификации пользователей APISIX может использоваться вместе с другими функциями безопасности для дальнейшего усиления защиты API-шлюзов.

api gateway authentication

Аутентификация и авторизация в Apache APISIX

Традиционные HTTP-прокси могут идентифицировать запрашивающего только на основе грубых методов, таких как доменное имя запроса и IP-адрес клиента, что недостаточно для API-шлюза. Нам нужны более точные методы аутентификации для удовлетворения все более сложных бизнес-требований. Одним из основных преимуществ APISIX перед традиционными прокси является его гибкая возможность расширения через плагины, включая набор плагинов для аутентификации пользователей, которые можно разделить на две категории в зависимости от метода реализации:

  1. Интерфейс с внешними службами аутентификации

external auth service

  1. Внутренняя аутентификация шлюза через объект Consumer, разработанный APISIX

internal auth

Эти два метода аутентификации будут рассмотрены по очереди.

Интерфейс с внешними службами аутентификации

До того, как предприятие внедрит API-шлюз, в системе часто уже развернута отдельная служба аутентификации. Как мы можем интегрировать APISIX с существующей службой аутентификации? APISIX предоставляет ряд плагинов, которые работают, взаимодействуя с различными внешними службами аутентификации и поручая им выполнение аутентификации.

Например, мы можем использовать плагин openid-connect для взаимодействия с любой службой аутентификации, поддерживающей протокол OIDC. Ниже приведен пример конфигурации для взаимодействия с сервисом keycloak:

curl http://127.0.0.1:9180/apisix/admin/routes -H "X-Api-Key: your-API-key" -XPOST -d ' { "uri":"/*", "plugins":{ "openid-connect":{ "client_id":"apisix", // Генерируется при создании клиента в keycloak "client_secret":"d5c42c50-3e71-4bbe-aa9e-31083ab29da4", "discovery":"http://keycloak:8080/auth/realms/apisix_test_realm/.well-known/openid-configuration", // OpenID Endpoint keycloak "scope":"openid profile", "bearer_only":false, "realm":"apisix_test_realm", "introspection_endpoint_auth_method":"client_secret_post", "redirect_uri":"http://127.0.0.1:9080/" } }, "upstream":{ ... } }'

Внутренняя аутентификация шлюза

Consumer

consumer

Когда запросы из различных источников поступают на API-шлюз, шлюз должен идентифицировать этих вызывающих. Apache APISIX предлагает концепцию "Consumer" для представления вызывающих определенного типа сервиса.

Объект Consumer требует настройки плагина аутентификации для использования. Возьмем в качестве примера самый простой плагин key-auth:

$ curl http://127.0.0.1:9180/apisix/admin/consumers -H 'X-API-KEY: your-API-key' -X PUT -i -d ' { "username": "jack", "plugins": { "key-auth": { "key": "auth-jack" } }'

Вышеуказанная конфигурация означает, что когда запрос содержит указанный ключ (auth-jack), текущий запрос будет связан с Consumer - jack. Как видите, плагин аутентификации, настроенный на Consumer, фактически является учетными данными для идентификации в рамках определенного механизма аутентификации. В плагине key-auth ключ является учетными данными, идентифицирующими потребителя, аналогично имени пользователя и паролю в плагине basic-auth.

Настройка плагина аутентификации для маршрута

После того как мы связали учетные данные с конкретным потребителем через Consumer, нам также необходимо включить плагин аутентификации на соответствующем маршруте:

$ curl http://127.0.0.1:9180/apisix/admin/routes/orders -H 'X-API-KEY: your-API-key' -X PUT -i -d ' { "uri": "/orders", "plugins": { "key-auth": { "header": "Authorization" } } }'

Вышеуказанная конфигурация означает, что плагин key-auth включен на маршруте /orders, и эффект аутентификации следующий:

$ curl http://127.0.0.1:9080/orders -H 'Authorization: auth-jack' -i HTTP/1.1 200 OK ... $ curl http://127.0.0.1:9080/orders -H 'Authorization: wrong-key' -i HTTP/1.1 401 Unauthorized ... {"message":"Invalid API key in request"}

Когда запрос от пользователя попадает на этот маршрут, APISIX попытается получить ключ, предоставленный пользователем, через заголовок Authorization. Если он не получен или полученный ключ недействителен, запрос будет отклонен шлюзом напрямую, тем самым защищая вышестоящий сервис.

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

Основные методы аутентификации

Аутентификация и авторизация, базовый механизм, существующий с момента входа в компьютерный мир, за столько лет итераций превратился в очень разнообразную область. Механизм плагинов APISIX значительно снизил стоимость разработки для реализации различных методов аутентификации. Ниже приведены некоторые из основных методов аутентификации, уже поддерживаемых APISIX:

Key Auth

Key Auth — это самый простой из всех плагинов аутентификации, но он имеет широкий спектр применения в реальных сценариях, таких как лицензии для платного программного обеспечения, токены для идентификации разработчиков на платформах открытых API и т.д., которые могут быть легко реализованы с помощью Key Auth. Более того, благодаря полностью динамической конфигурации и возможности распределения APISIX, ключи могут быть созданы и отозваны быстро, вступая в силу в реальном времени.

Basic Auth

Basic Auth — это метод аутентификации на основе имени пользователя и пароля, который часто используется в сценариях веб-входа. Например, административная панель сайта может быть использована после входа администратора, где мы можем использовать Basic Auth для аутентификации.

LDAP

LDAP (Lightweight Directory Access Protocol) — это легкий протокол доступа к каталогам, основанный на стандарте X.500, предоставляющий контроль доступа и поддержку распределенных информационных каталогов через IP-протокол. С помощью LDAP разработчики приложений и операторы могут контролировать доступ пользователей к ресурсам на детальном уровне. С плагином ldap-auth APISIX вы можете легко интегрироваться с платформами, реализующими протокол LDAP, такими как Microsoft Active Directory или OpenLDAP Server для платформ Linux, чтобы точно контролировать доступ Consumer к определенным маршрутам.

OIDC

OpenID — это децентрализованная система онлайн-аутентификации. Для сайтов, поддерживающих OpenID, пользователям не нужно запоминать традиционные токены аутентификации, такие как имя пользователя и пароль. Вместо этого им нужно только заранее зарегистрироваться на сайте, который выступает в качестве поставщика идентификации OpenID (IdP), и затем они могут использовать этот аккаунт для входа во все приложения, интегрированные с этим поставщиком, например, для аутентификации пользователей нашей собственной системы через аккаунты известных сервисов Google или Facebook.

Для OIDC APISIX предоставляет плагин openid-connect, который можно использовать для взаимодействия с сервисами аутентификации, поддерживающими протокол OIDC.

Forward Auth

Когда стандартный плагин аутентификации APISIX не удовлетворяет вашим текущим потребностям, или если в вашей системе уже развернута специализированная служба аутентификации с нестандартным протоколом, вы можете рассмотреть использование плагина forward-auth. С помощью этого плагина вы можете перенаправлять пользовательские запросы в службу аутентификации через HTTP и возвращать пользовательские ошибки или перенаправлять пользователей на страницу аутентификации, если служба аутентификации отвечает нестандартным статусом (код ошибки, отличный от 20x).

С помощью плагина forward-auth логика аутентификации и авторизации может быть очень ловко перенесена на специализированную внешнюю службу с нестандартным протоколом.

Связь с другими плагинами после аутентификации

Аутентификация пользователей — это только первый шаг к защите API с помощью APISIX. Сочетание возможностей аутентификации с другими плагинами безопасности еще больше усилит возможности безопасности шлюза.

ACL (consumer-restriction)

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

white list

В этом случае мы можем использовать плагин consumer-restriction, предоставляемый APISIX, для реализации механизма контроля доступа.

$ curl http://127.0.0.1:9180/apisix/admin/routes -H 'X-API-KEY: your-API-key' -X POST -i -d ' { "uri": "/api/v1/users/admin", "plugins": { "key-auth": {}, "consumer-restriction": { "whitelist": [ "Rose", "Peter ] } }, "upstream": { ... }, }'

Вышеуказанный маршрут ограничивает доступ к маршруту /api/v1/users/admin, требуя аутентификации через key-auth и consumer-restriction, и только Rose и Peter могут получить к нему доступ.

Ограничение скорости (limit-count)

Мы ранее описали, что вы можете связать учетные данные пользователя с потребителем, настроив плагины аутентификации в Consumer, но на самом деле объект Consumer APISIX может включать не только плагины аутентификации, но и любые плагины, такие как Route и Service.

Например, в реальном приложении политика ограничения скорости часто не является статичной, а персонализированной. Часто требуется, чтобы разные вызывающие на уровне сервиса имели разные политики ограничения скорости API. Однако такое требование не может быть решено путем подключения плагина ограничения скорости к маршруту. Поэтому нам нужно подключить плагин ограничения скорости к Consumer и указать целевую политику ограничения скорости для каждого потребителя.

$ curl http://127.0.0.1:9180/apisix/admin/consumers -H 'X-API-KEY: your-API-key' -X PUT -i -d ' { "username": "jack", "plugins": { "key-auth": { "key": "jack" }, "limit-count": { "count": 200, "time_window": 60, "rejected_code": 503, "key": "$consumer_name", } }' $ curl http://127.0.0.1:9180/apisix/admin/consumers -H 'X-API-KEY: your-API-key' -X PUT -i -d ' { "username": "rose", "plugins": { "key-auth": { "key": "rose" }, "limit-count": { "count": 1000, "time_window": 60, "rejected_code": 503, "key": "$consumer_name", } }'

С помощью вышеуказанной конфигурации мы указали разные политики ограничения скорости для jack и rose, где rose имеет более высокую квоту на количество запросов — 1000 за 60 секунд, а jack только 200.

Заключение

Как неотъемлемая возможность API-шлюзов, аутентификация и авторизация являются одним из важных факторов, которые пользователи учитывают при выборе API-шлюзов.

Apache APISIX, открытый шлюз, представленный в этой статье, охватывает все основные методы аутентификации и может удовлетворить потребности корпоративных пользователей в аутентификации и авторизации. APISIX также имеет следующие преимущества:

  • Богатый набор готовых плагинов аутентификации
  • Поддержка встроенных и внешних методов аутентификации, которые пользователи могут свободно выбирать
  • Поддержка вторичной разработки, легко интегрируется с пользовательскими центрами аутентификации

Эти преимущества могут помочь предприятиям более легко внедрить аутентификацию и авторизацию на уровне шлюза и усилить безопасность API.

Добро пожаловать узнать больше о Apache APISIX. Вы можете связаться с нами по адресу https://api7.ai/contact.

Tags: