写点什么

OpenIAM 简介

  • 2019-09-20
  • 本文字数:3117 字

    阅读完需:约 10 分钟

OpenIAM 简介

我们作为链家网的基础架构团队,提供了许多服务给业务线使用。在这个过程中,我们逐渐发现,(业务)服务和(基础)服务之间,“资源隔离”是初期强需求,“权限管理”是远期强需求。

当前,我们有的系统通过客户端传递“用户名/密码”,隐式地将数据隔离在当前用户这个 namespace 下;有的系统使用 AppId 和 AppKey 的方式标明用户,在数据库中更为灵活地记录权限信息。

我们除了作为服务的提供方,还往往需要充当系统管理员的角色:我们通过代码/后台/数据库等方式配置管理权限。这类琐碎的需求隔三岔五出现,可能需要我们线下测试、线上修改,打断了原本的开发节奏;用户可能需要较长时间的等待,压低了预期。

随着提供服务的增多,每个系统都可能需要开发一套用户/资源/权限的子系统,这越来越成为一种负担,拖慢了上层业务的开发,且带来了不一致的用户体验。我们在思考,有没有一个通用服务,覆盖那部分通用性强的,业务无关的权限管理?它只需要很小的成本接入,就能够提供统一的身份识别和方便的权限管理。

实际上,SaaS 平台上早有了成熟的解决方案,它就是 Identity and Access Management 系统。在链家,我们同时使用了自建 IDC 和公有云服务 Amazon Web Service。我们期待自己的服务,也能集成类似 AWS IAM这样的系统。

介绍 AWS IAM

用户体系

在 AWS IAM 中,用户分为四类实体:


  • Account(Root User)

  • 帐号对拥有的资源,有所有权限

  • 帐号可分发权限给用户,或赋予用户权限代为管理

  • 资源隔离在帐户下,不可跨帐号使用

  • User

  • 帐号下的权限隔离

  • 推荐日常使用

  • Group

  • 用户可加入到用户组

  • 方便权限的聚合管理

  • Role

  • 方便第三方跨帐户使用

  • 用户可 AssumeRole 换取临时 AK/SK,切换到对应角色


其中,帐号和用户可以有访问凭证,分别是:


  • 用户名/密码,后台访问

  • AccessKeyId/SecrectAccessKey, 程序使用 HTTP API 访问

认证流程

对于用户请求的身份识别,通常有两种方案:


  1. 基于 Session,Session 过期后重新登录。

  2. 对每次请求加密,一次一密。

  3. AWS IAM 选用了方案二,后端无状态,请求更安全。


用户在程序请求时,使用申请好的 AccessKeyId 和 SecrectAccessKey,针对 Request 的当前时间,Header 字段, URL Query 参数,Body Digest 等元素,按照一定规则拼接字符串,生成签名。


Server 校验签名,确认当前用户,判断是否有对应权限,记录请求以供审计,完成请求返回结果。

策略文档

AWS IAM 使用了 JSON 文档的方式描述策略 Policy,并提供了策略编辑器工具帮助不熟悉的用户撰写文档。


我认为这是很棒的设计:


  • JSON 是程序员们广泛接受,能够手写的格式

  • JSON 支持 Array, Map 等复杂类型,方便聚合权限


官方示例 Policy 如下:


{  "Version": "2012-10-17",      "Statement": [    {    "Effect": "Allow",               "Action": [                      "s3:ListAllMyBuckets",                      "s3:GetBucketLocation"          ],                "Resource": "arn:aws:s3:::*"    },    {     "Effect": "Allow",                 "Action": "s3:ListBucket",                 "Resource": "arn:aws:s3:::BUCKET-NAME",                  "Condition": {"StringLike": {"s3:prefix": [                        "",                        "home/",                        "home/${aws:username}/"          ]}}    },    {      "Effect": "Allow",                 "Action": "s3:*",                 "Resource": [                       "arn:aws:s3:::BUCKET-NAME/home/${aws:username}",               "arn:aws:s3:::BUCKET-NAME/home/${aws:username}/*"      ]    }  ]}
复制代码


Policy 基于字符串的匹配,加上 Allow/Deny Effect 的组合,更通用、易理解的变量名称,和外部系统深度集成的 Condition 条件语句,灵活强大,自成体系。


最终,Policy 通过内嵌(Inline Policy)或附加(Managed Policy)的方式,挂接到帐户里的用户、用户组和/或角色,完成了权限的分发。


整个解决方案,用户使用简洁灵活,可以从策略文档,挂接方式,用户类型上管控;服务提供方只需要暴露出全局性的 Resource 和梳理提供的 Action 即可。用户通过一套机制,完成了对 AWS 所有服务的对接,在 IAM 后台完成了绝大部分权限管理的工作(比如,S3 除了支持 IAM 基于访问用户的权限,还提供了基于对象的管理)

自研

AWS IAM 是个私有服务,我们只能感知客户端 SDK 和后台 Console 的行为动作,S3/EC2 之类的服务和 IAM 之间交互是透明的,无法感知的。我们翻出了私有云的实现 - OpenStack KeyStone,看看是否不用重复造轮子。


在调研阶段,我们发现,KeyStone 只是一个 Identity 服务,只实现了身份的识别,权限信息仍保留在各自的 Service 上。并且,KeyStone 是基于 Role 的设计,即便是一个细微的权限问题,我们也要先建一个 Role 与之对应,然后绑定用户,异常笨重。由于从一开始就存在较大的阻抗匹配,我们放弃了基于 KeyStone 的二次开发方案,使用 Golang 从头开发了自己的实现:OpenIAM。


在决定自研后,我们投入了两个人力(其中一个是没有写过 Golang,帅帅的大三实习生,彬彬同学),在一个多月的时间内,完成了一期目标,完全兼容了 AWS CLI,用 Vue.js 复刻了 AWS 的 Admin Console。


我们除了提供 JSON/XML 的 HTTP 接口供用户日常管理之外,还提供了高性能的 gRPC 接口供服务提供方接入。


我们设定,服务提供方不应知道 SecrectAccessKey 和 Policy 信息。它接到业务请求,只需抽取 AccessKeyId、签名和签名所用字符串,申明签名方式(如 HMac 哈希,Base64 摘要等),再加上服务自身感知到的 Resource 和 Action,一起交由 OpenIAM 完成认证和鉴权两步操作。我们使用这种方式,打通了业务/服务/OpenIAM 三者之间的闭环。


整体的流程如下图:



OpenIAM 在授权认证时的简化活动图:



那么,在 OpenIAM 服务上线后,我们预期会带来哪些改变呢?


  • 服务提供方仅需告知 OpenIAM 创建资源的帐号;后期鉴权均由 OpenIAM 完成,对提供方透明。

  • 资源的拥有者,直接在 OpenIAM 上管理权限;服务提供方无权管理。

  • 客户端逐步统一访问方式,降低接入成本,一套 AccessKeyId/ScrectAccessKey 即可跨多服务使用。

  • OpenIAM 可整合接入服务的服务后台,提供一致的使用体验。

使用场景

我们可以看到,IAM 解决的是服务和服务间的身份认证/权限管理。


在 AWS 里面所有服务都是基础服务,均有较强的资源概念。在公司里,存在更多的业务系统,没有清晰的资源概念,OpenIAM 能够适配这种情况吗?


例如,一个 Restful 的 API 接口,提供了对业务实体的 CRUD 操作。我们可以将每一个业务实体当成一个资源,将 GET/POST/PUT/DELETE 映射成 Action;服务提供方在 Resource 定位符中,直接告知 OpenIAM 资源的拥有者,OpenIAM 即可在此帐号下完成对业务实体的权限认证。


问题二,服务有自己的用户权限体系,用户请求可能涉及到第三方服务的权限问题。用户权限跟 IAM 权限有什么关系,该如何划分边界?事实上,OpenIAM 不关注用户权限信息。业务系统可以有如下两种选择:


1.一般情况下,业务系统的 AK/SK 拥有对第三方服务所需的所有权限,普通用户的权限由业务系统自行判定。


2.业务系统可以预设几个 IAM 子用户,将应用级别的用户映射到不同的 IAM 用户,不同 IAM 用户拥护不同的第三方服务权限。用户请求时,将请求转用对应的 AK/SK 加密,由 OpenIAM 决策允许或拒绝。

总结

在微服务日益火爆的今天,服务的数量会积极膨胀。OpenIAM 希望能解决服务和服务间的资源隔离问题。我们期待能跟大家更深入地分享 OpenIAM 设计与实现,如果感兴趣请留言


本文转载自公众号贝壳产品技术(ID:gh_9afeb423f390)。


原文链接:


https://mp.weixin.qq.com/s/eY9HNeF4zroaOpU3oE8fKQ


2019-09-20 17:053320

评论

发布
暂无评论
发现更多内容

浅谈元宇宙链游系统开发的原理及逻辑(Python框架)

V\TG【ch3nguang】

数字货币交易所/钱包开发系统开发详细,数字货币钱包/交易所系统开发(开发方案)源码

V\TG【ch3nguang】

打造美团外卖新体验,HarmonyOS SDK持续赋能开发者共赢鸿蒙生态

HarmonyOS开发者

快速出彩!适合产品经理的10款AI生成PPT工具推荐!

彭宏豪95

人工智能 AI PPT 在线白板 办公软件

关于佛萨奇2.0版波场链/币安链/马蹄链智能合约系统开发详细案例及源码

V\TG【ch3nguang】

秒合约系统、跟单合约和量化秒合约技术开发

V\TG【ch3nguang】

第20期 | GPTSecurity周报

云起无垠

HarmonyOS电话服务开发指导

HarmonyOS开发者

一文吃透低代码开发与传统IT开发的区别

树上有只程序猿

软件开发 低代码开发 IT开发

BOE(京东方)发布2023年三季度报告 营收利润双增长 盈利能力持续提升

科技热闻

全网最详细4W字Flink全面解析与实践(下)

Java随想录

Java 大数据 flink

如何优雅的开发?低代码搭建应用如此轻松

互联网工科生

软件开发 低代码平台 JNPF

SaaS 出海,如何搭建国际化服务体系?(一)

LigaAI

创业 SaaS 国际化 To B业务 客户成功

华为云开源校园行 | 线下meetup • 电子科技大学站

华为云开源

开源 云原生 华为云 Meetup

OpenHarmony状态变量更改通知:@Watch装饰器

OpenHarmony开发者

装备制造行业云MES解决方案

万界星空科技

数字化转型 工业互联网 mes 装备修理行业 云mes

在宇宙的视角下看我们WE

脑极体

腾讯

合约永续交易/秒合约/现货币币交易系统开发/技术应用

V\TG【ch3nguang】

现货合约跟单API对接交易所系统开发实现技术方案/源码部署

V\TG【ch3nguang】

私有网络的安全保障,WorkPlus Meet内网视频会议助力企业高效会议

WorkPlus

大模型时代的人工智能+大数据平台,加速创新涌现

阿里云大数据AI技术

人工智能

软件开发全文档归档,开发、管理、实施、运维、服务巡检、信息安全、安全运维

金陵老街

概要设计 详细架构设计文档 软件文档

WorkPlus:领先的IM软件,助力企业高效沟通与协作

WorkPlus

三月份发车的Celestia你们拿到了吗

币离海

Celestia tia

DAPP以太链/波场链/币安链代币合约流动性质押挖矿分红系统开发(开发详情及源码逻辑)

V\TG【ch3nguang】

打造企业级门户,WorkPlus助您打造个性化与高效的企业通讯平台

WorkPlus

掌握Spring事件监听器的内部逻辑与实现

华为云开发者联盟

spring 开发 华为云 华为云开发者联盟

DeFi流动性质押挖矿模式dapp系统开发模式详情(技术方案)

V\TG【ch3nguang】

券商上演“极速交易”,天翼云组播行情解决方案助力券商稳中求快!

Geek_2d6073

合约跟单系统开发(方案及策略)丨合约跟单交易所系统开发(详细及源码)

V\TG【ch3nguang】

OpenIAM 简介_文化 & 方法_尹吉峰_InfoQ精选文章