Kong默认的管理接口,未加任何安全校验,如果暴露在公网,随时可能被坏人发现,随意修改我们的配置。 Kong admin ui本身是个纯前端项目,没有额外的安全措施来保护您的Kong,未来也不可能加上后端代码实现账户授权。 Custom Headers功能,就是为了解决安全问题而开发的。
原理
Kong本身自带授权认证插件,如Basic Authentication,我们通过kong代理kong admin api,再配上Basic Authentication插件,访问kong admin api时,需要带上账号密码。根据Basic Authentication规范,账号密码就是base64编码后,通过header里的Authorization字段传输。而Custom Headers功能会在给Kong admin api接口发送请求时,加上您指定的header,所以可以实现带密码访问kong admin api,解决了安全问题。
配置
假设部署kong的部署地址是 http://192.168.0.205/, admin api地址是 http://192.168.0.205:8001/ ,我们接下来把http://192.168.0.205/manage 转到 http://192.168.0.205:8001/ ,并配上Basic Authentication.
Service和Route配置
我们先使用http://192.168.0.205:8001/ 配置,完成后再禁止admin api外部访问 创建Service:
创建Route:
完成上面操作后,可以试试浏览器打开 http://192.168.0.205/manage ,可以访问admin api了。
Consumer 配置
Basic Authentication 需要Credential才可以访问,Credential属于某个Consumer,一个Consumer可以有多个Credential。 先创建 Consumer 再创建一个Basic Auth Credential,输入账号密码,这个账号密码就是Basic Authentication需要的。
Basic Authentication 配置
完成配置以后,再用浏览器打开 http://192.168.0.205/manage 提示输入账号密码,刚刚我们配的都是admin。 Basic Authentication插件会校验header里的Authorization字段,值的格式是
Basic base64(账号:密码)
admin:admin
base64以后得到的值是YWRtaW46YWRtaW4=
,所以在Kong Admin UI里使用,Custom Headers字段应该填 {"Authorization":"Basic YWRtaW46YWRtaW4="}
如果其他api没有用到Consumer,配置就到此结束了,接下来配置改kong的配置文件,限制本机外的ip无法访问admin api即可。但如果其他服务也有Consumer,那么需要用ACL限制一下指定的Consumer才能访问admin api,因为默认情况下,所有Consumer都能访问。
ACL配置
ACL黑白名单配置的是Consumer group,所以需要先把我们指定的Consumer加到一个group里。 ACL Group这个功能是我在写这篇教程时加的,老版本的用户要更新下。 再配置ACL:
config.whitelist输入group. 现在,只有指定admin可以访问了。