01丨IAM系统概述:我们要实现什么样的Go项目?

IAM系统是什么?

1,用户需要提供昵称、密码、邮箱、电话等信息注册并登录到IAM系统,这里是以用户名和密码作为唯一的身份标识来访问IAM系统,并且完成认证。

2,因为访问IAM的资源授权接口是通过密钥(secretID/secretKey)的方式进行认证的,所以用户需要在IAM中创建属于自己的密钥资源。

3,因为IAM通过授权策略完成授权,所以用户需要在IAM中创建授权策略。

4,请求IAM提供的授权接口,IAM会根据用户的请求内容和授权策略来决定一个授权请求是否被允许。

我们可以看到,在上面的流程中,IAM使用到了3种系统资源:用户(User)、密钥(Secret)和策略(Policy),它们映射到程序设计中就是3种RESTful资源:

  • 用户(User):实现对用户的增、删、改、查、修改密码、批量修改等操作。
  • 密钥(Secret):实现对密钥的增、删、改、查操作。
  • 策略(Policy):实现对策略的增、删、改、查、批量删除操作。

IAM系统的架构长啥样?

IAM系统的完整架构

总的来说,IAM架构中包括9大组件和3大数据库。

前5个组件是我们需要实现的核心组件。后4个组件是一些旁路组件,不影响项目的使用。

通过使用流程理解架构

第1步,创建平台资源。

用户通过iam-webconsole(RESTful API)或iamctl(sdk marmotedu-sdk-go)客户端请求iam-apiserver提供的RESTful API接口完成用户、密钥、授权策略的增删改查,iam-apiserver会将这些资源数据持久化存储在MySQL数据库中。而且,为了确保通信安全,客户端访问服务端都是通过HTTPS协议来访问的。

第2步,请求API完成资源授权。

用户可以通过请求iam-authz-server提供的/v1/authz接口进行资源授权,请求/v1/authz接口需要通过密钥认证,认证通过后/v1/authz接口会查询授权策略,从而决定资源请求是否被允许。

为了提高/v1/authz接口的性能,iam-authz-server将密钥和策略信息缓存在内存中,以便实现快速查询。那密钥和策略信息是如何实现缓存的呢?

首先,iam-authz-server通过调用iam-apiserver提供的gRPC接口,将密钥和授权策略信息缓存到内存中。同时,为了使内存中的缓存信息和iam-apiserver中的信息保持一致,当iam-apiserver中有密钥或策略被更新时,iam-apiserver会往特定的Redis Channel(iam-authz-server也会订阅该Channel)中发送PolicyChanged和SecretChanged消息。这样一来,当iam-authz-server监听到有新消息时就会获取并解析消息,根据消息内容判断是否需要重新调用gRPC接来获取密钥和授权策略信息,再更新到内存中。

第3步,授权日志数据分析。

iam-authz-server会将授权日志上报到Redis高速缓存中,然后iam-pump组件会异步消费这些授权日志,再把清理后的数据保存在MongoDB中,供运营系统iam-operating-system查询。

这里还有一点你要注意:iam-authz-server将授权日志保存在Redis高性能key-value数据库中,可以最大化减少写入延时。不保存在内存中是因为授权日志量我们没法预测,当授权日志量很大时,很可能会将内存耗尽,造成服务中断。

第4步,运营平台授权数据展示。

iam-operating-system是IAM的运营系统,它可以通过查询MongoDB获取并展示运营数据,比如某个用户的授权/失败次数、授权失败时的授权信息等。此外,我们也可以通过iam-operating-system调用iam-apiserver服务来做些运营管理工作。比如,以上帝视角查看某个用户的授权策略供排障使用,或者调整用户可创建密钥的最大个数,再或者通过白名单的方式,让某个用户不受密钥个数限制的影响等等。

总结

首先,用户通过调用iam-apiserver提供的RESTful API接口完成注册和登录系统,再调用接口创建密钥和授权策略。

创建完密钥对和授权策略之后,IAM可以通过调用iam-authz-server的授权接口完成资源的授权。具体来说,iam-authz-server通过gRPC接口获取iam-apiserver中存储的密钥和授权策略信息,通过JWT完成认证之后,再通过ory/ladon包完成资源的授权。

接着,iam-pump组件异步消费Redis中的数据,并持久化存储在MongoDB中,供iam-operating-system运营平台展示。

最后,IAM相关的产品、研发人员可以通过IAM的运营系统iam-operating-system来查看IAM系统的使用情况,进行运营分析。例如某个用户的授权/失败次数、授权失败时的授权信息等。

另外,为了提高开发和访问效率,IAM分别提供了marmotedu-sdk-go SDK和iamctl命令行工具,二者通过HTTPS协议访问IAM提供的RESTful接口。

0%