Kong的Admin API为服务、路由、插件、用户和凭证的管理和配置提供了一个RESTFUL接口。因为可以对Kong进行完全控制,因此确保Admin API的安全访问非常重要。
网络层访问限制
最小监听范围
自0.12.0版本发布以来,默认情况下,Kong只接受本地接口的请求,admin_listen
默认值:
admin_listen = 127.0.0.1:8001
如果您更改了此值,请始终确保将侦听的范围减至最少,以避免将管理API暴露给第三方损害整个Kong集群的安全。例如,避免将Kong绑定到所有接口0.0.0.0:8001
。
3/4层网络控制
在管理API必须公开于本地主机接口之外的情况下,网络安全最佳实践要求尽可能限制网络层访问。考虑这样一种环境,Kong监听私有网络接口,但只能被IP范围的一小部分访问。在这种情况下,基于主机的防火墙(例如iptables)在限制输入流量范围方面非常有用。例如:
# 假设Kong正在侦听下面定义的地址,定义为一个 /24 CIDR 块
# 在此范围内,只有少数几个选定的主机应该具有访问权限
$ grep admin_listen /etc/kong/kong.conf
admin_listen 10.10.10.3:8001
# 明确地允许端口8001上来自Kong节点本身的TCP包
# 如果没有从节点发送Admin API请求,就没有必要这样做
$ iptables -A INPUT -s 10.10.10.3 -m tcp -p tcp --dport 8001 -j ACCEPT
# 明确地允许下面地址的TCP请求到8001端口
$ 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
# 除了上面的IP列表,将所有请求到端口8001上的TCP包删除
$ iptables -A INPUT -m tcp -p tcp --dport 8001 -j DROP
鼓励使用其他控件,比如类似acl网络设备级别应用
Kong API 环回接口
Kong的路由设计允许它充当管理API本身的代理。通过这种方式,Kong本身可以用于为Admin API提供细粒度的访问控制。这需要创建新服务,该服务将admin_listen
地址定义为服务的url
。
# 假设Kong已经定义 admin_listen 为127.0.0.1:8001
# 可以通过地址`/admin-api` 访问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
# 我们现在可以通过代理服务器透明地访问管理API
$ 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
}
至此,就可以给Admin API应用Kong的安全控制(例如基本或密钥身份验证、IP限制或访问控制列表)。
自定义Nginx配置
Kong作为HTTP守护进程与Nginx紧密结合,因此可以使用定制的Nginx配置集成到环境中。可以利用本机Nginx授权和身份验证机制、ACL模块等对Kong Admin API进行控制。
有关将Kong集成到自定义Nginx配置的更多信息,请参阅自定义Nginx配置和嵌入Kong
rbac权限管理
仅在企业订阅时才能使用此功能。所以,也就没什么好说的了。