曾经一个IT内部系统配一套帐号体系和授权
线上生产环境里,技术人员需要登录许多内部系统,如:
- memcached/redis/mongodb 的管控系统
- 譬如我得有个把线上某个memcached 的某个业务端口下某个/某些键值清空的 Web 界面吧;
- 譬如我得有个查出某个缓存键值并选择用哪一个Java Class反序列化的功能吧;
- jobcenter/notifyserver/推荐评测 的控制台
- dubbo 的服务治理控制台
- 持久化配置中心 的控制台
- CobarManager 控制台
- ……
每个IT系统都是不同人开发的,如果每个人都设计自己的用户体系和RBAC权限体系,第一重复制造轮子浪费体力,第二大家需要记住无数系统入口和帐号密码,第三每当有离职时还得记得逐一禁用账户。
所以在 JobCenter/NotifyServer/Diamond/Dubbo 等陆续上线后,孟珂和传志于2013年又开始运作起内部统一认证系统。
IdCenter 要干什么?
目标是建立一个内部各个管理系统能统一使用的用户认证和权限管理中心,以提高各个内部系统的安全性,并统一和简化内部系统的权限开发工作。具体包括:
- 进行内部管理系统的统一用户认证和各种权限管理;
- 兼容现有的各个内部管理系统;
- 记录部分系统访问日志。
用户来自于哪里?是 IdCenter 自己创建出来的?不。是运维在 UNIX/Linux 环境下通过 OpenLDAP 配好 LDAP 服务,IdCenter 根据 LDAP 协议同步用户过来。这样有几个好处:
- 开启用户、禁用/删除用户只需要在一个集中的地方做;
- 不仅仅研发的内部管理系统可以用,运维 DevOps 的内部管理系统也可以用这套用户体系;
- 不需要重复制造轮子。
注意不是自动同步,而是手动同步,如下图所示:
图0 同步LDAP数据
系统分为两部分:
- 认证中心:
- 用户登录和密码修改
- 控制界面,可以对用户和权限进行设置
- 接收过滤客户端的权限验证请求,并作出判断
- 过滤客户端(filter):
- 安装在各个内部管理系统中
- 过滤用户的访问请求
- 向认证中心发起用户和权限认证请求
- 根据认证中心回复阻拦或放行用户访问请求
业务流大致如下:
图1 授权方式
由于内部系统可能是 Java/PHP/dotNET/Python 等开发语言,所以要求权限检查接口具有跨语言跨平台性,于是朱传志的权限检验接口统一提供为 HTTP+Json 格式调用。
为了保证校验效率,IdCenter 使用内存缓存以提高权限验证时间,它缓存下面两项内容:
- 用户->组List
- URL->组List
它使用常用驻留和设置过期方式,校验会在两个组List之间进行比对 。
IdCenter 怎么控制权限?
由于不愿意在权限控制时涉及各个管理系统的业务逻辑,所以朱传志约定权限是针对 URL(或者说是 URI) 的,如下图2所示,首先我们会录入要管辖的管理系统的 URL。
图2 录入各种URL
然后我们要设定用户组,如下图3所示:
图3 设置分组
点击“设置URL”按钮,我们为这个分组设定它都可以对哪些 URL 有权限访问:
图4 为分组设置URL
还可以为分组设置该用户组都包含哪些用户:
图5 为分组设置用户
IdCenter 的记录访问日志功能
我们终于可以在一个集中的地方看到内部各个管理系统的登录日志了,嘿呀:
图6 登录日志
我们还可以按用户来查看他于什么时间使用了哪些权限(也就是访问了哪些登记在册的 URL):
图7 权限日志
好了,最后我们看一下完整的 IdCenter 首页吧:
图8 首页
这就是 IdCenter,一个为了不重复制造轮子而制造出来的解决方案。