Go实战1 ACE项目 - 项目背景

185 阅读7分钟
Access Controller Engine项目背景

Go 应用的安全
Go应用和其他语言的应用一样,大致可以分为以下两个方面:

  1. 服务自身的安全:为了保证服务的安全,需要禁止非法用户访问服务。这可以通过服务器层面和软件层面来解决。服务器层面可以通过物理隔离、网络隔离、防火墙等技术从底层保证服务的安全性,软件层面可以通过 HTTPS、用户认证等手段来加强服务的安全性。服务器层面一般由运维团队来保障,软件层面则需要开发者来保障。
  2. 服务资源的安全:服务内有很多资源,为了避免非法访问,开发者要避免 UserA 访问到 UserB 的资源,也即需要对资源进行授权。通常,我们可以通过资源授权系统来对资源进行授权。

ACE实现的功能
ACE就是为了给第三方用户提供访问控制的功能,用一句话描述其功能就是:
在特定的条件下,谁能够 / 不能够对哪些资源做哪些操作(Who is able to do what on something given some context),也即完成资源授权功能。

ACE Work Flow

  1. 用户需要提供昵称、密码、邮箱、电话等信息注册并登录到 ACE 系统,这里是以用户名和密码作为唯一的身份标识来访问 ACE 系统,并且完成认证。
  2. 因为访问 ACE 的资源授权接口是通过密钥(secretID/secretKey 类似Spring Security Oauth2中的机制)的方式进行认证的,所以用户需要在 ACE 中创建属于自己的密钥资源。
  3. 因为 ACE 通过授权策略完成授权,所以用户需要在 ACE 中创建授权策略。
  4. 请求 ACE 提供的授权接口,ACE 会根据用户的请求内容和授权策略来决定一个授权请求是否被允许

ACE系统中的三个资源: 用户, 密钥, 策略
对应Restful 资源
用户(User):实现对用户的增、删、改、查、修改密码、批量修改等操作。
密钥(Secret):实现对密钥的增、删、改、查操作。
策略(Policy):实现对策略的增、删、改、查、批量删除操作。

5大核心组件

1. ace-apiserver 
通过restful api完成对三大实体的增删改查。
2. ace-authz-serve 授权服务,
从api server中拉取三大实体的信息,存储在缓存中。提供接口对用户进行资源授权,同时也会上报日志。
3. ace-pump
从Redis中拉取授权日志,分析后存入es。
4. marmotedu-sdk-go
ACE向外提供的SDK,参考了k8s的client-go,将api server和authz server的所有接口封装在SDK。
5. acectl 
ACE系统的Client,参考了k8s中的kubetctl实现,通过marmotedu-sdk-go访问api server和authz server, acectl不仅封装了api server/authz server所有的Restful接口,还提供了命令行操作。

4大旁路组件

1.app
第三方应用,是ace系统的使用方,通过restful api或者sdk完成资源的授权。
2.ace-webconsole
ace系统的前端,通过restful api调用api server的服务。
3.ace-operating-system
ace运营系统,admin视角,可以看到所有用户的授权信息,调整用户密钥下最大个数等。
4.LB
通过Ngnix做一层负载均衡,一个ip会挂多个服务,避免单点故障的问题。 

3大数据库

1.Redis
缓存数据库,用来缓存密钥和授权策略,降低访问延迟,同时也会缓存日志作为运行系统的数据来源。\
2.MySQL
持久性存储用户,密钥,授权信息。\
3.ES
存储授权日志,供后期运营展示与分析。

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

2.请求 API 完成资源授权。
用户可以通过请求 ace-authz-server 提供的 /v1/authz 接口进行资源授权,请求 /v1/authz 接口需要通过密钥认证,认证通过后 /v1/authz 接口会查询授权策略,从而决定资源请求是否被允许。
为了提高 /v1/authz 接口的性能,iam-authz-server 将密钥和策略信息缓存在内存中,以便实现快速查询。

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

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

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

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

ACE架构模式的选择
前后端分离架构
如果系统足够复杂,前端负责页面的展示以及数据的加载和渲染,后端只负责返回前端需要的数据。

image.png

前后端分离的优点

  1. 可以让前、后端人员各自专注在自己业务的功能开发上,让专业的人做专业的事,来提高代码质量和开发效率
  2. 前后端可并行开发和发布,这也能提高开发和发布效率,加快产品迭代速度
  3. 前后端组件、代码分开,职责分明,可以增加代码的维护性和可读性,减少代码改动引起的 Bug 概率,同时也能快速定位 Bug
  4. 前端 JavaScript 可以处理后台的数据,减少对后台服务器的压力
  5. 可根据需要选择性水平扩容前端或者后端来节约成本

MVC架构
如果系统功能比较少,采用前后端分离框架的弊反而大于利,比如前后端分离要同时维护 2 个组件会导致部署更复杂,并且前后端分离将人员也分开了,这会增加一定程度的沟通成本。

M V C:
View(视图):提供给用户的操作界面,用来处理数据的显示。
Controller(控制器):根据用户从 View 层输入的指令,选取 Model 层中的数据,然后对其进行相应的操作,产生最终结果。
Model(模型):应用程序中用于处理数据逻辑的部分。

MVC的优点
MVC 架构的好处是通过控制器层将视图层和模型层分离之后,当更改视图层代码后时,我 们就不需要重新编译控制器层和模型层的代码了。

image.png