sa-kong

sa-kong

=======

Статус сборки

Kong — это масштабируемый, открытый API-слой (также известный как API Gateway или API Middleware). Kong работает перед любым RESTful API и расширяется с помощью плагинов, которые добавляют дополнительные функции и услуги помимо основной платформы.

Kong изначально был разработан в компании Mashape для защиты, управления и расширения более 15 000 API и микросервисов для их API Marketplace, который обрабатывает миллиарды запросов в месяц для более 200 000 разработчиков. Сегодня Kong используется в критически важных развертываниях как в небольших, так и в крупных организациях.

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

Модульный: Kong можно расширить, добавив новые плагины, которые легко настраиваются через RESTful Admin API.

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

Вы, вероятно, слышали, что Kong построен на Nginx, используя его стабильность и эффективность. Но как это возможно?

Точнее говоря, Kong — это приложение на Lua, работающее в Nginx и обеспеченное модулем lua-nginx. Вместо того, чтобы компилировать Nginx с этим модулем, Kong распространяется вместе с OpenResty, который уже включает модуль lua-nginx. OpenResty не является ответвлением Nginx, а представляет собой набор модулей, расширяющих его возможности.

Это закладывает основу для архитектуры с возможностью подключения, где Lua-скрипты (называемые «плагинами») могут быть включены и выполнены во время выполнения. Из-за этого мы рассматриваем Kong как образец микросервисной архитектуры: в его основе реализована абстракция базы данных, маршрутизация и управление плагинами. Плагины могут находиться в отдельных кодовых базах и добавляться на любом этапе жизненного цикла запроса, всё это с помощью нескольких строк кода.

архитектура

Примечание: версия Kong для сообщества не имеет пользовательского интерфейса. Вам может быть интересно рассмотреть некоторые open-source WEBUI, такие как https://github.com/PGBI/kong-dashboard или https://github.com/pantsel/konga/.

По нашему опыту, https://github.com/PGBI/kong-dashboard использует более надежные процессы разработки и выпуска, хотя konga выглядит более креативно.

# Установите Kong Dashboard
npm install -g kong-dashboard

# Запустите Kong Dashboard
kong-dashboard start --kong-url http://kong:8001

# Запустите Kong Dashboard на своем порту
kong-dashboard start \
  --kong-url http://kong:8001 \
  --port [порт]
  roles:
    - {
        role: "sa-kong"
      }

Расширенные настройки:

  roles:
    - {
        role: "sa-kong",
        kong_version: 2.0.1,
        kong_activated_plugins: "bundled,oidc",
        kong_luarocks_plugins:
          - kong-oidc
        kong_admin_http: "0.0.0.0:8001",
        kong_admin_https: "127.0.0.1:8444",
        kong_proxy_http: "0.0.0.0:8000",
        kong_proxy_https: "0.0.0.0:8443",
        kong_pg_host: "127.0.0.1",
        kong_pg_port: 5432,
        kong_pg_user: kong,
        kong_pg_password: kong,
        kong_pg_database: kong
      }

Несортированные заметки для будущего использования

Плагины третьих сторон, которые могут вас заинтересовать

kong-oidc

https://github.com/nokia/kong-oidc

kong-oidc — это плагин для Kong, реализующий функциональность OpenID Connect Relying Party (RP).

Он аутентифицирует пользователей с помощью поставщика OpenID Connect, используя OpenID Connect Discovery и основной профиль клиента (т.е. поток авторизационного кода).

Он поддерживает сессии для аутентифицированных пользователей, используя lua-resty-openidc, предлагая настраиваемый выбор между хранением состояния сессии в куках браузера клиента или использованием серверных механизмов хранения, таких как shared-memory | memcache | redis.

Он поддерживает кэширование документов Discovery и валидированных токенов доступа на уровне сервера.

В целом вам потребуется сервер авторизации, поддерживающий OIDC с зарегистрированным клиентом, чтобы начать. Вы можете использовать решения, такие как Keycloak/Gluu, или те, которые предоставляются третьими сторонами (например, Google's https://developers.google.com/identity/protocols/OpenIDConnect; в этом случае вы использовали бы свою учетную запись Google для входа).

После того как у вас есть идентификатор клиента/секрет и URL Discovery OIDC (см. https://auth0.com/docs/tutorials/openid-connect-discovery), вы можете включить плагин.

Пример curl может выглядеть так:

curl -XPOST -d 'name=oidc' -d 'config.client_id=<идентификатор_клиента>' -d 'config.client_secret=<секрет_клиента>' -d 'config.discovery=<URL_Discovery_OIDC>' http://kong:8001/plugins

После этого, перед доступом к любым API, зарегистрированным в Kong, вы будете перенаправлены на сервер авторизации для входа.

Это также предоставит решение SSO для всех API в Kong.

Это делает Kong OIDC Relying Party, поэтому любой API за Kong может воспользоваться защитой аутентификации OIDC, не реализуя потоки OIDC.

На практике он использует грант авторизационного кода (https://auth0.com/docs/api-auth/grant/authorization-code). Если аутентифицированный пользователь пытается получить доступ к API в Kong, для которого включён этот плагин, он будет перенаправлен к странице входа на сервере авторизации (местоположение сервера авторизации задается через поле discovery в конфигурации). После успешного входа сервер авторизации предоставляет вам код доступа и перенаправляет обратно в Kong. Kong использует код доступа для получения доступа, идентификационного и обновляющего токенов.

Токены хранятся в зашифрованном куке сессии. Ключ шифрования представляет собой комбинацию нескольких переменных (агент пользователя, удаленный IP-адрес и т. д.) и session_secret, который можно определить при включении плагина (см. https://github.com/nokia/kong-oidc/blob/master/kong/plugins/oidc/schema.lua). Это поле является необязательным, но настоятельно рекомендуется и должно быть случайным!

Если плагин Kong увидит, что куки уже установлены, он расшифрует их и проверит токены. Также этот плагин обрабатывает обновление токена доступа с помощью токена обновления.

Он также добавляет некоторую информацию в запрос к серверу. Он устанавливает заголовок X-Userinfo с выводом из конечной точки Userinfo (https://connect2id.com/products/server/docs/api/userinfo).

В общем, поток OIDC и логика реализованы пакетом lua-resty-openidc.

Это безстатусное решение, хранилище данных Kong не используется. Поэтому, если вы используете этот куки в другом браузере или на другом компьютере — это не сработает. Чтобы аннулировать токены, вы можете обратиться к корневому URL /logout (http:///logout). Это вызовет вызов конечной точки OIDC End Session.

Исходные токены не отправляются на сервер защиты, но в заголовке X-Userinfo содержатся утверждения из идентификационного токена (но без подписей сервера авторизации).

Замечание: если вы собираетесь использовать плагин в контейнеризованном Kong, вам нужно будет

FROM kong:1.4.0-alpine
LABEL description="Alpine + Kong 1.4.0 + плагин kong-oidc"
RUN apk update && apk add git unzip luarocks
RUN luarocks install kong-oidc

В образе плагины могут быть активированы с помощью переменной окружения KONG_PLUGINS

KONG_PLUGINS=oidc

Пример из развертывания Kubernetes

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-kong
  annotations:
    plugins.konghq.com: oidc
spec:
  rules:
  - http:
      paths:
      - path: /graphql
        backend:
          serviceName: corphub-graphql-service
          servicePort: 8082
---
apiVersion: configuration.konghq.com/v1
kind: KongPlugin
metadata:
  name: kong-oidc
  labels:
    global: "true"
config:
  client_id: kong
  client_secret: XXX
  discovery: http://keycloak:8180/auth/realms/master/.well-known/openid-configuration
plugin: oidc

Kong Middleman

https://github.com/pantsel/kong-middleman-plugin

Плагин Kong, который позволяет выполнить дополнительный HTTP POST-запрос перед проксированием оригинального запроса.

kong-external-oauth

https://github.com/mogui/kong-external-oauth

Плагин Kong, который позволяет использовать внешнего провайдера Oauth 2.0 для защиты вашего API.

$ luarocks install external-oauth

Чтобы сделать Kong осведомленным о том, что он должен искать новый плагин, вам нужно будет добавить его в свойство custom_plugins в конфигурационном файле.

custom_plugins:
    - external-oauth

Вы можете добавить плагин с помощью следующего запроса:

$ curl -X POST http://kong:8001/apis/{api}/plugins \
    --data "name=external-oauth" \
    --data "config.authorize_url=https://oauth.something.net/openid-connect/authorize" \
    --data "config.scope=openid+profile+email" \
    --data "config.token_url=https://oauth.something.net/openid-connect/token" \
    --data "config.client_id=SOME_CLIENT_ID" \
    --data "config.client_secret=SOME_SECRET_KEY" \
    --data "config.user_url=https://oauth.something.net/openid-connect/userinfo" \
    --data "config.user_keys=email,name,sub" \
    --data "config.hosted_domain=mycompany.com" \
    --data "config.email_key=email"
Параметр формы по умолчанию описание
name имя плагина external-oauth
config.authorize_url авторизационный URL провайдера OAUTH (по которому вы будете перенаправлены при отсутствии аутентификации)
config.scope область OAUTH запроса авторизации
config.token_url URL провайдера Oauth для запроса токена доступа
config.client_id Идентификатор клиента OAUTH
config.client_secret Секрет клиента OAUTH
config.user_url URL провайдера oauth, используемый для получения информации о пользователе и также для проверки действительности токена доступа
config.user_keys
Необязательный
username,email ключи для извлечения из возвращаемого json-объекта конечной точки user_url, они также будут добавлены в заголовки сервера как X-OAUTH-XXX
config.hosted_domain домен, пользователи которого должны принадлежать для входа в систему. Игнорируется, если пустой
config.email_key ключ, который должен проверяться для хостинг-домена, взятый с конечной точки информации о пользователе
config.user_info_periodic_check 60 время в секундах между проверками токена

В дополнение к user_keys будет добавлен заголовок X-OAUTH-TOKEN с токеном доступа провайдера.

Подключение базы данных Postgres

Файл pg_hba.conf после модификаций будет выглядеть примерно так:

local   all             postgres                                peer

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" предназначен только для соединений по сокету Unix
local   all             all                                     md5
# local   all             all                                     peer
# IPv4 локальные соединения:
host    all             all             127.0.0.1/32            password
host    all             all             127.0.0.1/32            md5
# IPv6 локальные соединения:
host    all             all             ::1/128                 md5
# Разрешить соединения репликации с localhost пользователем с
# привилегиями репликации.
#local   replication     postgres                                peer
#host    replication     postgres        127.0.0.1/32            md5
#host    replication     postgres        ::1/128                 md5

Ссылки на третьи стороны

Панели управления

Konga             https://github.com/pantsel/konga              (Kong > 1)
Kong-Dashboard    https://github.com/PGBI/kong-dashboard        (Kong > 0.9)

Инструменты декларативной конфигурации

kongfig           https://github.com/mybuilder/kongfig          (Kong < 1)
Deck              https://github.com/hbagdi/deck                (Kong >= 1)

Использование в рабочем процессе ansible galaxy

Если вы установили роль sa-kong с помощью команды

ansible-galaxy install softasap.sa-kong

Роль будет доступна в папке library/sa-kong.

Пожалуйста, отредактируйте путь соответственно.

     - {
         role: "softasap.sa-kong"
       }

Авторские права и лицензия

Код лицензируется по двум лицензиям: BSD 3 clause и MIT License. Выберите тот, который лучше всего подходит вам.

Свяжитесь с нами:

Подписывайтесь на обновления ролей в FB

Присоединяйтесь к обсуждению в Gitter в канале Gitter

Откройте для себя другие роли на http://www.softasap.com/roles/registry_generated.html

Посетите наш блог на http://www.softasap.com/blog/archive.html

О проекте

kong

Установить
ansible-galaxy install softasap/sa-kong
Лицензия
mit
Загрузки
106
Владелец
Get your application deployed in a robust way