还是参考极客时间的那个课程,有打广告嫌疑我就不放链接了。
IAM 系统是什么
IAM(Identity and Access Management,身份识别与访问管理)系统是用 Go 语言编写的一个 Web 服务,用于给第三方用户提供访问控制服务。
整个过程分四步:
- 用户输入用户名密码访问系统完成认证。
- 创建输入这个用户的密钥资源
- 创建对应资源的授权策略
- 请求 IAM 系统的授权接口,根据请求内容和授权策略决定请求是否被允许。
过程里用到了三种 RESTful 资源:用户(user),密钥(secret)和策略(policy),换句话说要对这三种资源进行增删改查。
系统架构图
这个架构图里面灰色的部分属于学有余力需要自行实现的部分。
下面分别介绍其中的 9 大组件。
核心组件
- iam-apiserver:通过 RESTful API 完成用户,密钥和授权策略的增删改查。
- iam-authz-server:授权服务,从 iam-apiserver 拉取密钥和授权策略,并缓存在内存中,用户通过请求这个组件提供的接口完成资源授权。接口同时会查询缓存的授权策略,然后决定授权是否通过。这个组件会将授权日志上报到 Redis 里。
- iam-pump:从 Redis 中拉取缓存的授权日志,分析后存入 Mongo 数据库中。
- marmotedu-sdk-go:系统的 golang SDK,参考了 Kubernetes 的 client-go,封装了 iam-apiserver 和 iam-authz-server 的所有 RESTful API 接口,方便用户调用。
- iamctl:IAM 系统的客户端,参考了 Kubernetes 客户端工具 kubectl 的实现,通过 SDK 访问两个 server 组件。这个组件也封装了 iam-apiserver 的所有 RESTful API,还封装了其他功能。用户可以通过命令行去访问 iam-apiserver。
旁路组件
- app:第三方应用,是 IAM 系统的使用方,通过 RESTful API 或者 SDK 调用 iam-authz-server 提供的接口完成资源授权。
- iam-webconsole:IAM 系统的前端,通过 RESTful API 调用 iam-apiserver 实现用户,密钥和策略的增删改查。
- iam-operating-system:IAM 运营系统,可以用来展示运营数据或者对 IAM 进行运营类管理,比如提供上帝视角查看所有用户的资源,调整某个用户下密钥的最大个数等。
- Loadbalance:负载均衡器,可以是 Nginx,Haproxy 或者 API 网关,后端挂载多个 iam-apiserver 和 iam-authz-server 实例,实现 server 组件的高可用。
这个系统要用到 3 种数据库,Redis,MySQL,MongoDB。架构图里面画的是 MariaDB,没问题,至少 MySQL 往这里面迁入是没问题的。
- Redis:缓存数据库,用来缓存密钥和授权策略,降低访问延时,同时也缓存授权日志作为运营系统的数据来源。
- MySQL:持久性存储用户,密钥和授权策略信息。
- MongoDB:存储授权日志,供后期运营系统展示和分析。
使用流程
分四步,第一步创建平台资源。
用户请求 iam-apiserver 提供的接口完成用户,密钥,授权策略的增删改查,之后 iam-apiserver 会将这些资源数据持久化存储在 MySQL 中。这些过程全部在 HTTPS 协议上进行。
第二步是请求 API 完成资源授权。
用户通过请求 iam-authz-server 提供的 /v1/authz 接口进行资源授权。这个过程需要密钥认证,认证通过后 /v1/authz 接口再查询授权策略,决定资源请求是否被允许。
为了提高 /v1/authz 接口的性能,iam-authz-server 将密钥和策略信息缓存在内存里,这样就可以快速查询。