IAM - 身份识别与访问管理 系统 - 学习/实践

 2023-09-05 阅读 92 评论 0

摘要:1.应用场景 主要用于给第三方用户提供访问控制服务,提供的功能就两个:认证与授权。 2.学习/操作 1.文档阅读 01 | IAM系统概述:我们要实现什么样的 Go 项目?-极客时间批量计算 访问管理-用户指南-文档中心-腾讯云-腾讯云 第三方库 GitHub - ory/l

1.应用场景

主要用于给第三方用户提供访问控制服务,提供的功能就两个:认证与授权。

2.学习/操作

1.文档阅读

01 | IAM系统概述:我们要实现什么样的 Go 项目?-极客时间
批量计算 访问管理-用户指南-文档中心-腾讯云-腾讯云

第三方库

GitHub - ory/ladon: A SDK for access control policies: authorization for the microservice and IoT age. Inspired by AWS IAM policies. Written for Go.

2.整理输出

2.1 介绍

IAM系统主要完成认证和授权功能。

认证:用来判断是否是平台的合法用户,例如用户名和密码就是认证的一种方式

授权:用来判断,是否可以访问平台的某类资源。

认证和授权 2个功能可以抽象成一个系统,这个系统名我起名为IAM。

类似于AWS的IAM,腾讯云的CAM和阿里云的RAM。

建议你参考下腾讯云的cam以协助你理解:

https://cloud.tencent.com/document/product/599/40011

问题:腾讯云的CAM和IAM系统有什么区别吗?

回复: 授权模型不一样。 CAM是ABAC。 IAM授权模型类似于RBAC和ACL

FYI

ABAC访问控制模型,基于属性的访问控制(Attribute-Based Access Control,下文简称ABAC)是一种灵活的授权模型。

插入:

个人理解

各个企业使用云服务

企业就是App

云服务商就是IAM系统的管理员,并设计开发IAM系统

企业需要注册登陆IAM系统,创建密钥(secretID/secretKey),创建授权策略 -- 这个可能是云服务商来创建,毕竟是付费服务。

企业可以使用secretID/secretKey来访问资源,云服务 - IAM需要进行认证+授权验证。

后续补充

...

3.问题/补充

1. authz,这个名字有啥含义么?主要是这个z

作者回复:

认证:authentication,缩写:authn

授权:authorization,缩写:authz

2. helloworld

是不是可以理解为每一个使用iam系统作为认证和资源授权的业务应用,该业务应用的用户每次访问该业务应用的接口都要先经过iam系统,认证和资源鉴权通过后,才能继续访问该业务应用接口呢,也就是iam是业务应用的网关代理?

作者回复: 理解的没毛病,可以理解为一个授权webhook。

3. 老妖纣王

老师,您好,正好讲到iam系统有几个问题想请教你一下,在项目中使用认证授权,遇到几个疑惑的问题一直困扰着我?
假如APP是内部应用的场景,流程是用户通过登录API直接获取token,然后每次携带token进行请求,网关拦截进行token的认证。
(1)这里面token是保存在客户端的,是否安全?
(2)token是有有效期的,网上一般说失败了通过刷新token去刷新,(客户端模式)客户端定时请求去触发,如果客户端多的话,频繁地刷新token的请求,显然带来很大的网络开销?为了解决这个问题,我们通过请求然后判断token时间是否到了阈值,然后续签(服务端实现)。但是这个也有问题,如果长时间没有请求会导致token过期,就不能续签了。如果是像淘宝这种,感觉永远都不会退出的,是不是就是延长token的有效时间+服务端刷新。那么永久有效,需要刷新token吗?
(3)oauth2中有客户端概念,我认为客户端就是app,那么appId和秘钥是不是保存到了app应用端,这样会有安全问题吗?如果密码都保存在了app端,服务端还需要对秘钥验证吗?

作者回复:

1. 使用客户端用用户名登录后,证明客户端短时间是安全的,token默认有2小时的过期时间。

2. 这个刷新成本服务端还是能抗住的。如果token过期就只能重新登录了,至于多久过期,每个业务会根据需要自己选择,但很多开源软件一般默认2小时过期。

3. 密钥保存在客户端,需要客户端使用者去保证密钥不泄露,服务端也会保存一份密钥,用来对请求进行再加密,并和客户端传来的token对比,如果一致则请求通过。

补充

骑着🚀看银河

对于 @老妖纣王 同学提的淘宝登录token过期问题,按照老师的意思是token过期时间设置的很长了?

作者回复: 淘宝应该是设置时间比较长

个人评论:

OAuth是真的没看懂~

4. helloworld

IAM能和网关结合使用吗,还是必须二选一呢

作者回复:

网关做的是接口鉴权,也就是哪个用户/密钥可以访问哪个接口。而IAM做的是资源鉴权。例如淘宝中的iphone资源等

接口鉴权 - 学习/实践_穿素白衫的少年的博客-CSDN博客_接口鉴权

helloworld -- 还是这个网友~

iam这个认证与资源授权系统和网关的认证与鉴权功能有何本质区别呢

作者回复: 跟网关的认证功能是一样的,iam的认证功能也是参考了tyk网关的实现。 跟网关的鉴权还是有些区别,iam是对资源鉴权,网关是对api鉴权,就是谁能或不能调用哪个api接口。

helloworld

iam可以用于微服务吗,就是n多个应用使用同一套iam为各自应用内的资源对用户授权

作者回复: 可以的哦,它就是个微服务

5. qiaocc

异步消费没有用过。 python里面有用过celery, go里面有类似的第三方包吗

作者回复: machinery 和 gocelery 了解下。

6. dll

不太明白,怎么同意这个用户创建并给密钥对,并给到对应的权限策略,这个步骤不需要人来同意吗?如果谁都能注册自己选择权限,那不是很危险?这个iam和jwt有什么关系

作者回复: 管理员注册iam系统,并登录系统,创建密钥对和策略。密钥对分发给其他人,其他人通过密钥对进行资源授权,授权时填写自己的用户名就可以了。 Jwt是iam认证的方式

7. Vackine

iam 存储的密钥是创建了之后就是静态的一直存在mysql的么?会不会有密钥截获的风险?还是每个密钥有超时时间?

作者回复: 一直保存在mysql数据库中,登录用户名密码登录系统获取临时密钥保存在客户端,默认2小时过期。后面的通信全都走https,通过认证,https,过期时间来保证安全性

8. awmthink

老师,初步接触Web业务开发,对这一节中 IAM 系统的资源授权的流程图有2个疑问:

1) 步骤2中的创建密钥对,我理解其实就是JWT吧,只是一个token,和用户名一起构成了密钥对吗?

2) 图片步骤4,用密钥对去访问授权接口,这个不是用户直接访问吧,应该是用户用密钥对去访问资源时,由资源实时控制服务去调用authzServer来验证用户是否有权限来访问该资源?

作者回复:

1) 密钥对还不是JWT,密钥对包含secretId,secretKey。 secretKey可以用来签发Token(JWT),secretId可以使服务端根据secretId查找服务端保存的secretKey,反签发Token,对比2个token是否一致,完成认证。

2) 用密钥对访问授权接口,这里的密钥对可以签发JWT Token,iam-authz-server判断该Token是否能访问/v1/authz接口。如果能访问,接下来才会进行资源授权的流程。一个是认证,一个是资源授权。

9. zlel

用户密钥除了db在中保存,也在redis中保存,这样会不会不太安全?

作者回复: 不会的,不管是db还是redis非法用户是访问不到的。

10. 西二旗啤酒王

有几个疑问,一个用户可以创建多个不同权限的秘钥对?密钥对的作用是什么?

作者回复: 访问iam-authz-server时生成token,做认证使用

11. qiaocc

1. 授权策略

2. 对资源的授权,

这两个有什么区别呀,能举个例子吗?

作者回复:

授权策略是一个策略,里面说明了,谁能/不能对哪些资源做哪些操作。

对资源的授权,是一个动作,例如,小明删除密钥。

对资源的授权是通过验证授权策略来实现的

12. 咆哮

对于IAM这种重要系统,使用redis 订阅这种方式是不是对稳定性和可靠性产生影响

作者回复: 会有的。可以使用CMQ、NSQ这些消息中间件

13. drawping

1.ima-apiserver和ops-apiserver是两个不同组件吗?ops-apiserver是否只服务于ops-webconsole?

2. 假如ops-webconsole有创建用户的功能,是调用ima-apiserver的接口,还是调用ops-apiserver,再由ops-apiserver通过RPC调用ima-apiserver创建?

作者回复:

1. iam-apiserver和ops-apiserver是2个不同组件,ops-apiserver是服务于ops-webconsole

2. ops-webconsole直接调用ops-apiserver,再由ops-apiserver通过grpc调用iam-apiserver。 你的理解完全正确。

14. waterjiao

有两个问题,想咨询下,

第一,当用户请求 API 完成资源授权时,如果这时他的权限和策略被更改了,但是由于iam-authz-server 监听消息慢导致了授权成功,对于这种情况,是不处理呢,还是增加机制保证呢?

第二,两个用户在创建平台资源时创建相同的资源,如何保证资源创建唯一,是对服务加锁呢,每次只处理一个请求,还是对资源加锁?

作者回复:

1. 这种情况可以不用处理,因为iam-authz-server本身监听消息是毫秒级的。另外,既然之前是允许访问的,现在改成不允许访问,也就是说这几十毫秒的延时是可以接受的。 2. 资源是挂在用户名下,2个用户创建的资源必然是2个不同的资源。资源ID是惟一的,不同用户常见的资源ID是不一样的

15. 陈晓涛

使jwt是无法是token过期的,那如果退出登录,怎么确保token失效,加上Redis保存token做清除和校验吗

作者回复: jwt可以设置token的过期时间。

16. 推推。

关于第二步 访问 IAM 的资源授权接口是通过密钥(secretID/secretKey) 我看华为云 腾讯云 这些资源的授权是通过授权给其他账户的 这是如何做到的呢 ?

作者回复:

授权接口是通过密钥(secretID/secretKey) ---- 这个其实是认证。 这些资源的授权是通过授权给其他账户的 ---- 这个使用了复杂的授权策略。 关于授权方法你可以参考下:27 | 权限模型:5大权限模型是如何进行资源授权的?

17. 徐付

IAM用的什么框架呢? 用户的授权是否有超级管理员处理呢? 期待后续的课程

作者回复: 哪方面的框架?web框架用的Gin。iam有超级管理员的

18. 庖丁解牛

孔老师,请问一些问题:「静态文件服务器一般由 Nginx 服务器实现,那什么是前端 ops-webconsole?前端 ops-webconsole 和后端 ops-apiserver 的关系是怎样的?」、在组件设计时,为什么将功能拆分成 iam-authz-server 和 iam-apiserver 组件,而不是合二为一?

作者回复:

ops-webconsole和ops-apiserver都属于运营系统,运营系统是前后端分离架构。

ops-webconsole:运营系统前端。

ops-apiserver:运营系统后端。

iam-authz-server和iam-apiserver本来就不是一个系统,强行合二为一,后期变更、升级等,都很麻烦。 拆分开,彼此独立开发、升级、部署,互不影响

19. 随缘

有一点不懂, 求教老师 既然 iam-authz-server 已经把策略缓存在了内存中, 为什么还需要去订阅redis的变动, iam-apiserver 还需要把变动发送到redis中, 这两步分别是干嘛的?

作者回复:

为了从iam-apiserver中同步最新的策略信息到iam-authz-server中。

试想:如果iam-apiserver中新增了A策略,那么iam-authz-server首先需要能够感知到iam-apiserver中新增了A策略,然后才能从iam-apiserver中同步A策略。

订阅redis的channel就是为了能够感知到iam-apiserver中有新的策略被增加。

当iam-apiserver中新增了A策略后,会向redis channel中发送一个消息,因为iam-authz-server订阅了相同的channel,所以iam-authz-server能够感知到这条消息,然后再调用iam-apiserver的接口重新从iam-apiserver中获取策略信息.

20. 乳酸菌

始终没有理解MVC 和三层架构的区别,老师有例子能加深理解吗?

作者回复:

重要区别: MVC总的controller层不做具体的业务逻辑处理,主要用来做请求逻辑分发,可以把业务逻辑具体实现放在类似service这样的包中。在controller引用这个包。 三层架构中的BLL层,是用来做业务处理的。 还有其它区别,具体可以google下。

补充:

会飞的牛

问题2: 使用Laravel框架开发后台管理系统的时候典型的MVC模式,在实际项目中会加一层Service,框架实现在里面,Control只做调用,业务逻辑封闭在Service里面。 开发前端应用的时候,这时使用的是前后端分离模式。前端专注于页面效果与交互,后端负责提供RESTful API。

作者回复: 看起来像基于mvc架构的一种改进

21. yingsunjiu

没太理解架构图中的数据流和控制流是按什么区分的?能否再详细说下

作者回复:

控制流可以理解为管理面,数据流可以理解为业务面。这个没有标准的划分方法,根据业务会有一定区别。控制流挂了,不影响业务的正常使用,但是数据流挂了就会造成业务没法用

22. 网友:marmotedu是什么意思?土拨鼠教育?go教育?

作者回复: 老哥猜的很对哇,哈哈哈

23. Fis.

我理解authz是面向用户的借口,apiserver是核心处理模块,sdk不直接对接apiserver吗?

authz和api server分离设计的优点是什么?

另外authz从redis获取数据,那不是有可能读到过期数据?(比如当时写入请求还在写入mysql过程中,还没同步到redis)

作者回复:

sdk可以对接iam-apiserver和iam-authz-server。

authz和api server分离的优点,其实是:数据流和控制流的分离。

这样做的好处如下:

1. 控制流主要是用来做资源的CURD,如果控制流服务出故障,会影响用户的使用,但不会影响用户的业务。

2. 数据流出故障会影响用户的业务。

对于一个系统来说,影响用户业务是很严重的事情,而且我们日常变更最多的是控制流服务,控制流和数据流分离,使得我们发布变更控制流服务时,不会影响到数据流服务,也即不会影响用户的业务。

24. types

关于秘钥对有几个问题不太明白 按照文中所讲,密钥对是在控制平面中创建

1. 根据后面的文章,数据流中(authz)是基于JWT认证的 请问秘钥对如何进行用于JWT,jwt token是谁负责创建的APP还是authz server

2. 秘钥对包含secretId,secretKey 请问APP包含密钥对的什么信息,是如何提供给APP的?

作者回复:

1. 在apiserver中创建密钥对,authz服务会自动将新创建的秘钥信息从apiserver中拉去,并缓存在authz的内存中。

jwt token可以使用iamctl jwt sign <secretID> <secretKey>来创建。

也可以通过网上的在线工具来创建 还可以自己编写jwt token生成代码。

jwt token的创建是有一定规则的,所以只要满足jwt token规则的工具都可以创建。

直接回答你的问题:jwt token由APP侧来创建

2. APP需要知道secretId和secretKey。 通过secretId和secretKey,再加上jwt token固定的生成规则,就可以创建jwt token用于请求。

4.参考

参见上面文档列表

后续补充

...

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://808629.com/478.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 86后生记录生活 Inc. 保留所有权利。

底部版权信息