Giter VIP home page Giter VIP logo

bk-iam-saas's People

Contributors

canway-shiisa avatar huangpeng0428 avatar ielgnaw avatar iuzreo avatar leafage-collb avatar lhzzforever avatar nannan00 avatar orenzhang avatar polo0428 avatar wklken avatar yetlau111 avatar zhu327 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

bk-iam-saas's Issues

[SaaS] 回调接口错误提示优化

image

目前回调接口错误信息提示没有 url path、resource_type_id等信息,接入系统或用户在看到错误信息后无法理解

可以改造如下:

接入系统(barnettcc)自身接口异常,请求接口url=/api/v1/resources/,data={'type': 'biz', 'method': 'fetch_instance_info', 'filter': {'ids': ['2005000004'], 'attrs': ['display_name']}},返回错误的信息是:'NoneType' object has no attribute 'to_list'

[Backend] 清理未被引用的expression表数据

需要确保 尽量减少对现有系统带来的影响; 尽量降低或规避风险!

  • 对现有系统鉴权的影响(性能/频率/锁表等)
  • 尽量防止误删(宁可不删或慢删, 也不能 删错)

[文档] 官网文档优化 IAM_HOST

{IAM_HOST} 以 http://bkiam.service.consul:5001 为例

本地开发环境不能访问consul,需要去服务器访问

如何优化外部用户的接入流程说明文档????


很多人都卡在 {IAM_HOST} 他们直接使用的PaaS_URL; 或者提示在本地 不能访问到consul的机器 调用

[SaaS] 超级管理类API的认证与鉴权

超级管理类API主要是给予使用权限中心企业用于二次开发,避免权限中心开发定制功能

对于这类API,需要对其进行严格的应用身份认证和鉴权,避免出现越权等安全问题

  1. API统一接入蓝鲸APIGateway,使用其app_code/app_secret认证
  2. 对于鉴权,可以通过白名单机制,来确认应用可调用的API

[讨论] 无权限申请支持链式多系统批量申请

A -> B -> C

  • 需要同时申请 A/B/C 三个系统的权限
  • 目前的协议, 只支持申请一个系统的权限(无权限链式依赖, 只能透一级)
  • 目前的申请单, 只支持一个系统

需求: 多个系统链式调用, 补齐所有无权限的申请数据, 然后一次性提交, 批量申请

[SaaS] 接入系统资源实例ID长度限制

目前策略限制了1万个资源实例,但是每个资源实例的ID长度可能较长,导致存储空间变大,各种网络传输数据变大,鉴权性能下降,需要对资源实例ID长度进行限制

  1. 统计不同长度,32/64/128等长度对于1万个实例,占用的空间,确定出比较合适的长度
  2. 根据确定的合适长度,在所有涉及的API上添加长度校验限制

[产品]BF对接权限中心方案原型评审

涉及:

  1. 操作关联两个以上资源类型时,当前笛卡尔积的方式不满足需求
  2. 临时权限涉及同一个操作不同实例的有效期不一致问题

产品层需要有对应的应对方案

[unittest] 后台/api/v1/model补充单元测试

  • 基于apitest
  • 具体可以参考 system的接口单元测试
  • 待处理:
		// system clients
		s.GET("/clients", handler.GetSystemClients)

		// resource_type
		s.POST("/resource-types", handler.BatchCreateResourceTypes)
		s.DELETE("/resource-types", handler.BatchDeleteResourceTypes)

		s.PUT("/resource-types/:resource_type_id", handler.UpdateResourceType)
		s.DELETE("/resource-types/:resource_type_id", handler.DeleteResourceType)

		// instance_selection
		s.POST("/instance-selections", handler.BatchCreateInstanceSelections)
		s.DELETE("/instance-selections", handler.BatchDeleteInstanceSelections)

		s.PUT("/instance-selections/:instance_selection_id", handler.UpdateInstanceSelection)
		s.DELETE("/instance-selections/:instance_selection_id", handler.DeleteInstanceSelection)

		// actions
		s.POST("/actions", handler.BatchCreateActions)
		s.DELETE("/actions", handler.BatchDeleteActions)

		s.PUT("/actions/:action_id", handler.UpdateAction)
		s.DELETE("/actions/:action_id", handler.DeleteAction)

		// system config
		s.POST("/configs/:name", handler.CreateOrUpdateConfigDispatch)
		s.PUT("/configs/:name", handler.CreateOrUpdateConfigDispatch)

		// query
		s.GET("/query", handler.SystemInfoQuery)

		// token
		s.GET("/token", handler.GetToken)

		// policy
		s.DELETE("/actions/:action_id/policies", handler.DeleteActionPolicies)

[日志] 批量优化日志打印

背景: 目前SaaS的logger需要重新处理, 打的信息过少, 导致信息缺失毫无意义; 要么去掉, 要么打完整; 操作人和被操作对象, 时间, 操作, 来源入口等等

  1. Django 日志, info 日志目前只有部分信息,缺乏更全面的信息
    例如, 谁 从 哪个group 删除了 谁

  2. 什么地方该打日志, 什么地方不应该打? 需要从现有线上日志分类确定下, 去掉高频无用的日志, 优化关键路径的日志

  3. 增加layer字段快速定位, 用于定位哪一层打的日志

[文档] 设计原理

当前权限中心是怎么设计/实现的, 需要给接入系统的开发者一个简单清晰的说明, 便于其快速理解并降低接入成本

[规划] 页面接入

目标: 尽可能降低用户的接入成本

第一期: 体验良好的页面接入

重要, 当前版本bug需要尽快修复

  • 前端: 需要确保现有的功能正常
  • 前端: 校验增强, 提交前就能提示到(格式/长度/中英文) - 优化整体表单的校验体验
  • 前端: 需要增加一些业务上的校验(产品给到)
    • 实例视图两个节点不能选相同的资源类型; 一种资源类型不能在一条链路上出现两次
    • 操作依赖两个资源不能选一样的;
    • 实例视图: 属性/拓扑/属性+拓扑, 但是不能什么都不选
  • 后端: 加必要校验(例如host / url 等确定的类型)
  • 后端: 报错信息优化, 国际化优先展示中文, 并且需要友好可读(没有歧义容易理解)

时间记录:

  • 2021-08-20 体验完整流程, 确认现有功能没有bug, 并收集相关交互/流程等体验问题

第二期: 交互优化, 降低开发者理解成本

  • 表单增强: 校验+place holder说明及优化
  • 交互增强: 图文的概念说明和示例
  • 常用操作和操作分组, 可以自由拖动调整顺序
  • 交互: 哪里有显示正在操作的这个系统的名字? 没有任何一个地方知道, 特别是配后面几步或开几个页面的时候没有地方确认
  • 交互: 第一遍新建完之后, 可以任意步骤跳转(目前到了最后, 没法回中间步骤, 只能返回列表重新点进来)
  • 功能: 可以删除某个系统(目前无法删除)
  • 重要功能: 注册资源类型独立一步; 现有资源类型, 再有操作; 现在的围绕操作搞, 99%情况下不需要看别的系统的, 但是拉出来了; 并且导致新建/拉去本系统的资源类型体验非常不好; 关键路径: 99%情况下只新建/拉去自己系统的资源类型 => 资源类型选择/实例视图的拓扑树选择
  • 功能: 现在是 下载权限模型, 应该支持 预览权限模型, 直接点开看
  • 说明概念: 模型注册的多种方式
    1.api https://bk.tencent.com/docs/document/6.0/160/8448
    2. do_migrate.py https://bk.tencent.com/docs/document/6.0/160/9849
    3. python sdk django migration https://github.com/TencentBlueKing/iam-python-sdk/blob/master/docs/usage.md#2-iam-migration
  • 下载模型文件名可以带版本或日期等

第三期: 联动及功能增强

流程: 1 梳理配置模型 -> 2 注册模型 -> 3 开发系统实现回调接口 -> 4 配置权限 -> 5 测试鉴权及无权限申请

问题: 目前 2 没有实现自动注册, 因为即使注册了也没法调试, 因为 3 没有现成的系统, 是需要开发/调试/部署的(大于 3 天以上工作量); => 实现之后, 收益有多大?

  • 思路: 模型配置时, mock 好所有的接口数据; 然后自动注册但是回调全部走mock; 此时, 支持自动注册及刷新模型, 就可以在权限中心前端配置权限, 并且验证鉴权; 问题: 需要支持删除系统(以及从后台删); 每次全新刷新会更简单直接, 如果支持增量更新复杂很多; 正式上线前, 需要干掉现有数据;

  • 也可以给每个资源类型配置对应接口的mock数据 => 然后直接在接入页面渲染: 权限配置页面(系统-操作-选择具体操作等) 相当于是一个交互上的确认(这样的配置, 出来怎样的效果)

  • 此时, 相当于都是为了 弱化 3 的重要性

  • 需要同时支持, 同步系统(同步更新到已注册的系统, 或者重置)+删除系统(同步删除已注册到后台的系统)


其他

可能需求及优化点:

  • 讨论: 权限中心 DEMO 的
    • app默认部署
    • DEMO 的模型, 只读, 默认展示给所有开发者(即出现在列表中)
  • 模型是否可以多个人共享?
  • 限制: 一个人最多只能新建多少个模型? (目前无限制)
  • 支持版本? 以及版本对比?
  • 问题: 超过二十个以上的操作, 如何展示/搜索

[规划] 降低接入成本

1. 接入页面

后续模型的构建/示例说明/图文等, 以接入页面为主

  • 接入页面二期 #12
  • 接入示例作为默认的可见接入页面系统; 接入示例作为默认应用部署;

2. 文档

  • 补充所有 蓝鲸开源项目 中使用权限中心的例子汇总到接入样例
  • 补充: 多种模型注册的方式说明 API 注册/do_migrate.py/iam-python-sdk migration #47
  • 优化IAM_HOST #56
  • 统一调用方式为 APIGateway #46
  • 补充 _bk_iam_path_详细说明 #45
  • 增加concepts所有概念说明 #27
  • 精简/突出重点/脉络 (现在的问题是太多了) #33
    • 哪些是接入系统需要做的? (构建模型/注册模型/鉴权), 哪些是了解就好的? (现在似乎没有重点)
  • 重新梳理每个文档的详细描述, 确保容易理解/无歧义/精简
  • 增加设计原理 #26
  • how to benchmark #25
  • python sdk文档优化 #252
  • go sdk文档优化 #301
  • 问题: 还需要补充哪些接入样例?
  • 丰富完善 FAQ, 并主推: 产品侧/概念侧的问答, 例如 什么是实例视图? 怎么注册模型? (需要收集一波) #300
  • 问题排查文档优化, 做好分类及指引(目前有点杂) #299
  • 无权限申请带实例视图的需要怎么配置 #62
  • 增加带实例视图的调用示例 #60

3. 统一使用 APIGateway 调用

  • Python SDK支持 APIGateway
  • Go SDK 支持 APIGateway
  • [APIGateway] 容器化版本需要自动注册所有网关到 APIGateway #57
  • 推动内部版/蓝鲸所有产品切换
  • 外发, 变更官网文档

4. SDK

  • Java SDK 开源(重要, 已开发完毕, 流程中) #31
  • 开发并开源 PHP SDK(需要寻求开发者) #21
  • 开发并开源 Javascript SDK需要寻求开发者) #19
  • 开发并开源 Ruby SDK (优先级相对低) #22

5. 课程&视频教程

问题: 现有产品/接入的视频之外, 还需要提供哪些课程?视频教程?

release 1.8.x 发布跟进

注意:

  1. 有一个sql要执行 build/support-files/sql/0012_iam_20210624-1530_mysql.sql
    • ALTER TABLE bkiam.action_resource_typeDROP COLUMNscope_expression;

  • 合并出 1.8.x包
  • 开发环境/联调环境
  • 三天后/ 开发环境/联调环境 check
  • 上云预发布
  • 运维环境(等待测试结果)
  • 上云正式

[SDK] iam-js-sdk

需要一个 javascript SDK, 支持nodejs类项目接入


目前暂时没有这类需求, 优先级调低

[Engine] 生产版本待处理问题

  1. 日志优化
    • ES日志中需要写入同步task_id
      • 当前index的task_id是index本身的, 与sync task无关, 任务的执行在同一个goroutine中不好区分, 结论: 不做
    • search api 链路的日志需要写入 request_id
      • 在search的入口传递 context with value request_id
  2. Metric生成
    • 最后同步时间的时间戳: Gauge
    • 同步任务耗时: HistogramVec 同步类型: 全量同步/间隔同步/增量同步 task_id policy_count
    • 同步失败: Gauge
  3. Debug info
    type DebugEntry struct {
        Context  // 上下文, request的相关信息
        Steps  // 步骤, 大步骤就3个, any - doc - eval
        AnyQuery  // 查询表达式与subject结果
        DocQuery
        EvalPolicies  // 匹配的策略信息
        Error  // 错误信息
        SubEntries  // 批量查询时多个Search的子集
    }
    
  4. 全局state接口
    • 当前时间戳
    • 总的策略数量, 大于过期时间的策略
    • any的策略数量
    • es的策略数量
    • eval的策略数量
    • 最后全量同步时间
    • 最新增量同步时间
  5. system - action state
  6. 全量同步触发任务
  7. 上云版处理
    • 接入日志采集
    • 接入sentry
    • metric告警
      • 操过5分钟没有进行增量同步
    • healthz监控
    • 接入普罗米修斯
      • dashboard api/task
  8. 快速恢复
  9. 慢请求记录
    • es search增加metric
    • 超过2秒的请求记录详细的请求信息

[SaaS] 用户组相关的超级管理类API

  1. 查询用户组列表,分页,支持按照id/name/desc搜索和role_id过滤,支持参数来返回relation信息,即用户组关联的分级管理员信息
  2. 查询用户组成员列表,分页接口,支持username搜索和subject_type过滤
  3. 查询Subject加入的用户组列表,非分页
  4. 查询用户继承组织加入的用户组列表,非分页

[讨论] policy 增加 score

  • 目前一条policy是一个system+action下的
  • 可以设置unlimit, 即any
  • 可以设置某几个实例
  • 理论上, 是可以计算出, 其计算权限时的通过率大小的 (范围大小)
  • 范围越小, 分数越低;

例如: 任意 > 单属性 > 多属性 > 多实例 > 单实例

  • 如果存在多个OR, 那么, 需要有相同的一套体系, 可以比较 多个一个的分数大小
  • 例如: 多个实例 < 多个属性

保存时, 即知道; 变更时, 要重算; 鉴权时, 可以排序

作为辅助提速, 不影响主体功能, 不会导致策略被过滤

类似predict, 需要有一套明确的计算方法, 可能涉及特征及表达式语义


目前已经做了合并any的逻辑, 但是剩余待计算策略的排序, 如果可以排, 可以提升短路运算提前返回的概率

[优化] expression表结构优化

CREATE TABLE `expression` (
  `pk` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `action_pk` int(10) unsigned NOT NULL DEFAULT '0',
  `expression` mediumtext NOT NULL,
  `signature` char(32) NOT NULL,
  `type` smallint(5) unsigned NOT NULL DEFAULT '0',
  `template_id` int(10) unsigned NOT NULL DEFAULT '0',
  `template_version` int(10) unsigned NOT NULL DEFAULT '0',
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`pk`),
  KEY `idx_signature_action` (`signature`,`action_pk`)
) ENGINE=InnoDB AUTO_INCREMENT=21984 DEFAULT CHARSET=utf8
  1. 变更索引
  • drop idx_signature_action
  • add idx_signature signature?
  1. 去除字段:
  • action_pk
  • template_id
  • template_version
  1. 限制唯一性? (存量数据可能有重复, 因为没有设置 unique 字段)

现在的问题: 1.4/1.5 兼容了之前的权限模板数据的表结构

但是 1.6/1.7/1.8 开始, 新部署的不需要做兼容, 理论上应该做彻底的变更; (变更 SQL 执行失败不影响新版本的运行)

[文档] 精简/突出重点/脉络

目前文档太多了, 给开发者带来比较大的阅读压力?

  • 梳理整体开发者阅读的顺序/主要脉络/补充信息
  • 去除冗余信息
  • 合并, 或者规范化调整内容到一个地方
  • 对于流程, 细节比较重的, 需要画流程图

[限制] 产品上的限制增强

梳理, 讨论, 并确定后做总体规划, 落地

另: 将产品使用限制梳理成完整的表格, 放到官方文档上


每一项都很重要, 如果确定不限制, 需要讨论确认, 不能随意删除

  • 能配置属性的数量, OR数量需要限制, 不能太大
  • 组-权限模板关联数量限制
    • 一个组能关联多少个权限模板
    • 一个权限模板能授予多少个组
  • 一个组的成员数量: 当前1000个; 如果限制 500 个? 或者更少?
  • departments能加入的用户组调小:
    • 一个部门也能加入 100 个组
    • 一个人所属的部门是无限制的(取决于其组织架构)
  • 一个系统能创建多少个分级管理员需要限制
  • 增加数量限制文档说明
    • 两类
        1. 字段长度/正则等限制
        1. 领域类各种数量限制, 例如一个人的用户组数量, 一个部门数量等等
    • 需要汇总在一起
    • 报错的指引能明确让对方知道是触发了什么限制

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.