Kong保护Admin API接口
简介
Kong Admin API 提供了 restful 风格的接口管理和配置服务、路由、插件、消费者和凭证,由于此 API 允许完全控制Kong,因此要保护此API防止不必要的访问,本文档介绍了一些保护 Admin API 的可能的方法
网络层访问限制
最小化监听注解
自0.12.0版本开始,默认情况下,Kong仅接受来自本地端口的请求,admin_listen
配置项的默认值
admin_listen = 127.0.0.1:8001
如果更改此值,确保将监听范围保持在最低限度,以避免将 Admin API 暴露给第三方,这将严重损害整个集群的安全性,例如,避免使用诸如 0.0.0.0:8001
这类的值,以免将Kong绑定到所有接口
3/4层网络控制
如果 Admin API 必须在 localhost 接口之外公开,那么根据网络安全最佳实践,需要尽可能的限制网络层的访问,考虑到Kong只监听一些私有网络接口,所以可以将访问权限控制在小的 IP 集合内,这种情况下,基于主机的防火墙(iptables)在限制范围性的流入流量很有帮助,例如:
# assume that Kong is listening on the address defined below, as defined as a
# /24 CIDR block, and only a select few hosts in this range should have access
grep admin_listen /etc/kong/kong.conf
admin_listen 10.10.10.3:8001
# explicitly allow TCP packets on port 8001 from the Kong node itself
# this is not necessary if Admin API requests are not sent from the node
iptables -A INPUT -s 10.10.10.3 -m tcp -p tcp --dport 8001 -j ACCEPT
# explicitly allow TCP packets on port 8001 from the following addresses
iptables -A INPUT -s 10.10.10.4 -m tcp -p tcp --dport 8001 -j ACCEPT
iptables -A INPUT -s 10.10.10.5 -m tcp -p tcp --dport 8001 -j ACCEPT
# drop all TCP packets on port 8001 not in the above IP list
iptables -A INPUT -m tcp -p tcp --dport 8001 -j DROP
同时还鼓励使用其他控件,例如在网络设备级别应用的 ACLs,但这个不在这篇文档的讨论范围之内
Kong API
Kong的路由设计允许它作为 Admin API 本身的代理,通过这种方式,Kong本身可用于为 Admin API 提供细粒度的访问控制,如此配置需要引入一个新的服务,该服务将 admin_listen
的地址定位服务的 url
,例如:
# assume that Kong has defined admin_listen as 127.0.0.1:8001, and we want to
# reach the Admin API via the url `/admin-api`
curl -X POST http://localhost:8001/services --data name=admin-api --data host=localhost --data port=8001
curl -X POST http://localhost:8001/services/admin-api/routes --data paths[]=/admin-api
# we can now transparently reach the Admin API through the proxy server
curl localhost:8000/admin-api/apis
{
"data":[
{
"uris":[
"\/admin-api"
],
"id":"653b21bd-4d81-4573-ba00-177cc0108dec",
"upstream_read_timeout":60000,
"preserve_host":false,
"created_at":1496351805000,
"upstream_connect_timeout":60000,
"upstream_url":"http:\/\/localhost:8001",
"strip_uri":true,
"https_only":false,
"name":"admin-api",
"http_if_terminated":true,
"upstream_send_timeout":60000,
"retries":5
}
],
"total":1
}
从这里开始,只需向往常一样添加安全控件即可(例如basic或者key验证,ip限制,访问控制列表)
自定义Nginx配置
Kong与Nginx紧密结合,可以集成到自定义 Nginx 配置的环境中,通过这种方式,可以使用Nginx/OpenResty的强大功能来构建 server/location 块来实现复杂的安全/访问控制,此外还可以利用原生的 Nginx 授权和身份验证机制,ACL 模块等
有关将Kong集成到自定义Nginx配置的详细信息,可以参考Kong配置项向导中的章节
基于角色的访问控制
企业用户可以配置基于角色的访问控制,保护对 Admin API 的访问,RBAC 允许基于用户角色和权限模型对资源访问进行细粒度控制,用户分配一个或多个角色,每个角色有一个或多个权限,然后授予特定资源的访问权限,通过这种方式,可以强制执行对特定 Admin API 资源的细粒度控制,同时支持扩展以允许更加复杂的场景使用