IAM系统是什么
IAM(Identity and Access Management,身份识别与访问管理)系统是用Go语言编写的一个Web服务,用于给第三方用户提供访问控制服务。
IAM系统可以帮用户解决的问题:在特定的条件下,谁能够/不能够对那些资源做哪些操作。即完成资源的授权功能。
IAM系统如何进行资源授权呢?
- 用户需要提供用户名、密码、邮箱等信息注册登录到 IAM 系统。以用户名、密码作为唯一的身份标识来访问 IAM 系统,并且完成认证。
- 因为访问 IAM 的 资源授权接口 是通过密钥(secretKey)的方式进行认证的,所以用户需要在 IAM 中创建属于自己的密钥资源。
- 因为 IAM 通过 授权策略 完成授权,所以用户需要在 IAM 中创建授权策略。
- 请求 IAM 提供的 授权接口 ,IAM 会根据用户的 请求内容 和 授权策略 来决定一个授权请求是否被允许。
功能示意图
IAM系统架构
IAM架构中包括9大组件和3大数据库:
- 3大数据库
Mariadb、Redis、MongoDB - 5个核心组件
iamctl、marmotedu-sdk-go、iam-apiserver、iam-authz-server、iam-pump - 4个旁路组件
app、iam-webconsole、iam-operating-system、Loadbalance
IAM系统使用到的3中系统资源
- 用户(User)
- 密钥(Secret)
- 策略(Policy)
整个架构可以拆分为三部分:
-
控制流 - 用户、密钥、授权策略的管理
涉及组件及数据库为:
iamctl、iam-webconsole、iam-apiserver、marmotedu-sdk-go、Mariadb- iam-webconsole
IAM系统的前端,通过 RESTful API 调用 iam-apiserver 实现用户、密钥、策略的CURD - iamctl
IAM系统的客户端,通过 marmotedu-sdk-go 访问 iam-apiserver。iam-ctl 封装了 iam-apiserver 的所有 RESTful API,还封装了其它功能。可以通过命令行的方式访问 iam-apiserver。 - marmotedu-sdk-go
IAM系统的 golang sdk,封装了 iam-apiserver 和 iam-authz-server 的所有 RESTful API。 - iam-apiserver
核心组件,通过 RESTful API 完成用户、密钥、授权策略的CURD -
Mariadb
持久性存储用户、密钥、授权策略
控制流
- iam-webconsole
-
数据流
APP
第三方应用,IAM系统的使用方。通过 RESTful API 或者 marmotedu-sdk-go 调用 iam-authz-server 提供的 /v1/authz 接口,完成资源的授权。-
iam-authz-server
授权服务
为了提高 /v1/authz 接口的性能, iam-authz-server 通过调用 iam-apiserver 提供的 gRPC接口,将 密钥和授权策略 信息缓存在 Redis 中,以便实现快速查询。同时,为了使 Redis 中的缓存信息和 iam-apiserver 中的信息 保持一致 ,当 iam-apiserver 中有密钥或策略被更新时, iam-apiserver 会往特定的 Redis Channel 中发送 PolicyChanged 和 SecretChanged 消息。当 iam-authz-server 监听到有新消息时就会获取并解析消息,根据消息内容判断是否需要重新调用 gRPC 接口来获取密钥和授权策略信息。
iam-authz-server 会将授权日志上报到 Redis中
Redis
用来缓存密钥、授权策略,降低访问延时;
用来缓存授权日志,作为运营系统的数据来源。

-
运营平台
iam-pump
从 Redis 中拉取缓存的授权日志,分析后存入 Mongo 数据库中。iam-operating-system
IAM营运系统,可以用来展示运营数据,或者对IAM系统进行运营类管理。-
MongoDB
存储授权日志,供后期运营系统展示和分析
运营平台
-
架构全貌
IAM



