Apache APISIX интегрируется с Open Policy Agent для расширения своей экосистемы

API7.ai

December 24, 2021

Ecosystem

Open Policy Agent (OPA) — это легковесный движок политик с открытым исходным кодом, который может заменить встроенный модуль политик в программном обеспечении и помочь пользователям разделить сервисы и движок политик. Благодаря хорошо развитой экосистеме OPA, пользователи могут легко интегрировать OPA с другими сервисами, такими как библиотеки программ, HTTP API и т.д.

Как показано на рисунке ниже, OPA сначала описывает политику с помощью языка политик Rego; затем сохраняет данные политики в формате JSON, после чего пользователь может отправить запрос на проверку. Получив запрос, OPA объединяет политику, данные и ввод пользователя, чтобы сгенерировать решение по политике и отправить его сервису.

Рабочий процесс OPA

Введение в плагин

Apache APISIX предоставляет плагин opa, который позволяет пользователям легко внедрить возможности политик, предоставляемые OPA, в Apache APISIX, чтобы обеспечить гибкую аутентификацию и функции контроля доступа.

После настройки плагина opa на маршруте, Apache APISIX собирает информацию о запросе, данные о соединении и т.д. в JSON-данные и отправляет их на адрес API для принятия решений по политике при обработке запросов. Если политика, развернутая в OPA, соответствует спецификации данных, установленной Apache APISIX, можно реализовать такие функции, как пропуск запроса, отклонение запроса, настройка статусного кода, настройка заголовков ответа и т.д.

В этой статье на примере HTTP API представлен плагин opa и подробно описано, как интегрировать Apache APISIX с OPA для разделения аутентификации и авторизации для сервисов бэкенда.

Как использовать

Создание тестовой среды

  1. Используйте Docker для запуска сервиса OPA.

    # Запуск OPA с помощью Docker docker run -d --name opa -p 8181:8181 openpolicyagent/opa:0.35.0 run -s
  2. Создайте политику example.

    # Создание политики curl -XPUT 'localhost:8181/v1/policies/example' \ --header 'Content-Type: text/plain' \ --data-raw 'package example import input.request import data.users default allow = false allow { # имеет заголовок test-header со значением only-for-test request.headers["test-header"] == "only-for-test" # Метод запроса — GET request.method == "GET" # Путь запроса начинается с /get startswith(request.path, "/get") # Параметр GET test существует и не равен abcd request.query["test"] != "abcd" # Параметр GET user существует request.query["user"] } reason = users[request.query["user"]].reason { not allow request.query["user"] } headers = users[request.query["user"]].headers { not allow request.query["user"] } status_code = users[request.query["user"]].status_code { not allow request.query["user"] }'
  3. Создайте данные users.

    # Создание тестовых данных пользователей curl -XPUT 'localhost:8181/v1/data/users' \ --header 'Content-Type: application/json' \ --data-raw '{ "alice": { "headers": { "Location": "http://example.com/auth" }, "status_code": 302 }, "bob": { "headers": { "test": "abcd", "abce": "test" } }, "carla": { "reason": "Give you a string reason" }, "dylon": { "headers": { "Content-Type": "application/json" }, "reason": { "code": 40001, "desc": "Give you a object reason" } } }'

Создание маршрута и включение плагина

Выполните следующую команду, чтобы создать маршрут и включить плагин opa.

curl -XPUT 'http://127.0.0.1:9080/apisix/admin/routes/r1' \ --header 'X-API-KEY: <api-key>' \ --header 'Content-Type: application/json' \ --data-raw '{ "uri": "/*", "methods": [ "GET", "POST", "PUT", "DELETE" ], "plugins": { "opa": { "host": "http://127.0.0.1:8181", "policy": "example" } }, "upstream": { "nodes": { "httpbin.org:80": 1 }, "type": "roundrobin" } }'

Тестовые запросы

Затем выполните следующую команду, чтобы отправить запрос к плагину opa и проверить его работоспособность.

# Разрешить запрос curl -XGET '127.0.0.1:9080/get?test=none&user=dylon' \ --header 'test-header: only-for-test' { "args": { "test": "abcd1", "user": "dylon" }, "headers": { "Test-Header": "only-for-test", "with": "more" }, "origin": "127.0.0.1", "url": "http://127.0.0.1/get?test=abcd1&user=dylon" } # Отклонить запрос и переписать статусный код и заголовки ответа curl -XGET '127.0.0.1:9080/get?test=abcd&user=alice' \ --header 'test-header: only-for-test' HTTP/1.1 302 Moved Temporarily Date: Mon, 20 Dec 2021 09:37:35 GMT Content-Type: text/html Content-Length: 142 Connection: keep-alive Location: http://example.com/auth Server: APISIX/2.11.0 # Отклонить запрос и вернуть пользовательский заголовок ответа curl -XGET '127.0.0.1:9080/get?test=abcd&user=bob' \ --header 'test-header: only-for-test' HTTP/1.1 403 Forbidden Date: Mon, 20 Dec 2021 09:38:27 GMT Content-Type: text/html; charset=utf-8 Content-Length: 150 Connection: keep-alive abce: test test: abcd Server: APISIX/2.11.0 # Отклонить запрос и вернуть пользовательский ответ (строка) curl -XGET '127.0.0.1:9080/get?test=abcd&user=carla' \ --header 'test-header: only-for-test' HTTP/1.1 403 Forbidden Date: Mon, 20 Dec 2021 09:38:58 GMT Content-Type: text/plain; charset=utf-8 Transfer-Encoding: chunked Connection: keep-alive Server: APISIX/2.11.0 Give you a string reason # Отклонить запрос и вернуть пользовательский ответ (JSON) curl -XGET '127.0.0.1:9080/get?test=abcd&user=dylon' \ --header 'test-header: only-for-test' HTTP/1.1 403 Forbidden Date: Mon, 20 Dec 2021 09:42:12 GMT Content-Type: application/json Transfer-Encoding: chunked Connection: keep-alive Server: APISIX/2.11.0 {"code":40001,"desc":"Give you a object reason"}

Отключение плагина

Благодаря динамической природе Apache APISIX, плагин OPA на маршруте можно отключить, просто удалив конфигурацию плагина opa из конфигурации маршрута и сохранив изменения.

Заключение

В этой статье описаны подробные шаги по интеграции Apache APISIX и Open Policy Agent. Мы надеемся, что эта статья поможет вам лучше понять использование Open Policy Agent в Apache APISIX и облегчит последующую практическую работу.

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

Если у вас есть потребность в интеграции с другими сервисами аутентификации, посетите GitHub Apache APISIX и оставьте свои предложения через issue; или подпишитесь на рассылку Apache APISIX, чтобы выразить свои идеи по электронной почте.

Tags: