softasap.sa-kong

sa-kong

构建状态

Kong是一个可扩展的开源API层(也称为API网关或API中间件)。Kong运行在任何RESTful API的前面,可以通过插件扩展,提供超出核心平台的额外功能和服务。

Kong最初是在Mashape构建的,用于保护、管理和扩展超过15,000个API和微服务,以支持其API市场,每月为超过200,000名开发者生成数十亿次请求。如今,Kong被小型和大型组织在关键任务部署中使用。

可扩展:Kong可以通过简单增加更多机器来轻松水平扩展,这意味着您的平台可以处理几乎任何负载,同时保持低延迟。

模块化:Kong可以通过添加新插件进行扩展,这些插件可以通过RESTful管理API轻松配置。

在任何基础设施上运行:Kong可以在任何地方运行。您可以在云端或本地环境中部署Kong,包括单个或多个数据中心的设置,以及公共、私有或仅限邀请的API。

您可能听说Kong是基于Nginx构建的,利用了其稳定性和效率。但是这到底是如何实现的呢?

更准确地说,Kong是一个运行在Nginx中的Lua应用程序,这得益于lua-nginx-module。Kong与OpenResty一起分发,后者已包含lua-nginx-module,而不是编译带有该模块的Nginx。OpenResty并不是Nginx的一个分支,而是扩展其功能的一组模块。

这为可插拔架构奠定了基础,在该架构中,Lua脚本(称为“插件”)可以在运行时被启用和执行。因此,我们认为Kong是微服务架构的范例:它的核心实现数据库抽象、路由和插件管理。插件可以在单独的代码库中运行,并可以在请求生命周期的任何地方注入,只需几行代码。

架构

注意:Kong的社区版本不带任何用户界面。您可能想考虑一些开源的WEBUI,比如https://github.com/PGBI/kong-dashboardhttps://github.com/pantsel/konga

根据我们的经验,https://github.com/PGBI/kong-dashboard使用更稳健的开发和发布流程,虽然konga看起来更加富有创意。

# 安装Kong仪表板
npm install -g kong-dashboard

# 启动Kong仪表板
kong-dashboard start --kong-url http://kong:8001

# 在自定义端口上启动Kong仪表板
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依赖方(RP)功能。

它通过OpenID Connect发现和基本客户端配置(即授权代码流)对用户进行身份验证。

它通过利用lua-resty-openidc来维持经过身份验证用户的会话,从而提供在客户端浏览器cookie中存储会话状态或使用服务端存储机制(共享内存 | memcache | redis)之间可配置的选择。

它支持解析的发现文档和验证访问令牌的服务器级缓存。

一般来说,您需要一个支持OIDC并注册客户端的授权服务器来开始。您可以使用Keycloak/Gluu等解决方案,或第三方提供的(例如Google的https://developers.google.com/identity/protocols/OpenIDConnect;在这种情况下,您将使用您的Google帐户登录)。

在获取客户端ID/密钥和OIDC发现URL后(请参见https://auth0.com/docs/tutorials/openid-connect-discovery),您可以启用该插件。

示例curl命令可能如下所示:

curl -XPOST -d 'name=oidc' -d 'config.client_id=<client_id>' -d 'config.client_secret=<client_secret>' -d 'config.discovery=<OIDC_Discovery_url>' http://kong:8001/plugins

在此之后,在访问Kong注册的任何API之前,您将被重定向到授权服务器以进行登录。这也为Kong中的所有API提供了SSO解决方案。

这使得Kong成为OIDC依赖方,因此在Kong之后的任何API都可以受益于OIDC身份验证保护,而无需实现OIDC流程。

在实践中,它使用授权码授权(https://auth0.com/docs/api-auth/grant/authorization-code)。如果未经身份验证的用户尝试访问启用了此插件的Kong API,系统将重定向用户代理(浏览器)到AS上的登录页面(AS位置通过配置中的发现字段设置)。成功登录后,AS会给您一个访问代码,并重定向回Kong。Kong使用这个访问代码来获取访问、ID和刷新令牌。

令牌存储在一个加密的会话cookie中。加密密钥是几个变量(用户代理、远程IP地址等)和在启用插件时可以定义的session_secret的组合(请参见https://github.com/nokia/kong-oidc/blob/master/kong/plugins/oidc/schema.lua)。这个字段是可选的,但强烈建议并且必须是随机的!

如果Kong插件看到已经设置了cookie,它将解密并验证令牌。使用刷新令牌刷新访问令牌也由该插件处理。

它还会向上游服务器的请求添加一些信息。它用来自用户信息端点(https://connect2id.com/products/server/docs/api/userinfo)的输出设置X-Userinfo头。

一般来说,OIDC的流和逻辑是由lua-resty-openidc包实现的。

它是无状态的,Kong的数据存储未被使用。所以如果使用该cookie在另一个浏览器或另一台机器上将无法工作。要使令牌失效,您可以调用根URL /logout(http:///logout)。这将触发对OIDC结束会话端点的调用。

原始令牌不会发送到上游服务器,但X-Userinfo头包含来自ID令牌的声明(但没有AS签名)。

侧注 - 如果您打算在容器化的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_CLEINT_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 OAUTH提供商的授权URL(未认证时将被重定向的URL)
config.scope 授权请求的OAUTH范围
config.token_url 请求访问令牌的Oauth提供商的URL
config.client_id OAUTH客户端ID
config.client_secret OAUTH客户端密钥
config.user_url 用于检索用户信息的Oauth提供商的URL,还用于检查访问令牌的有效性
config.user_keys
可选
username,email user_url端点返回的JSON中提取的键,它们也将作为X-OAUTH-XXX添加到上游服务器的头中
config.hosted_domain 必须属于该域的用户才可登录。如果为空则忽略
config.email_key 检查托管域的键,来自userinfo端点
config.user_info_periodic_check 60 令牌检查之间的时间(秒)

除了user_keys外,还将添加一个X-OAUTH-TOKEN头,其中包含提供商的访问令牌。

Postgres后端

修改后的pg_hba.conf将类似于:

local   all             postgres                                peer

# 类型  数据库          用户             地址                方法

# "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条款MIT许可证。选择符合您需求的许可证。

联系我们:

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
下载
118
拥有者
Get your application deployed in a robust way