使用RBAC实现服务间通信授权的正确方法是什么?

问题描述 投票:0回答:1

我们有一些网络系统:

  • 前端客户端
  • 用于Oauth2.0实现的keycloak
  • 3个后端服务
    • OrangeService - 是存储有关 Orange 实体的信息的服务
    • AppleService - 是存储有关 Apple 实体信息的服务
    • JuiceService - 异步制作果汁的服务,我们假设
      make_juice
      操作需要大约 10 分钟
  • access_token 生命周期例如 1 分钟

enter image description here

流量:

  • John Doe 在 Keycloak 中进行身份验证并重定向到前端应用程序
  • John Doe 打开 Apple 页面。我们必须只给他看他的苹果。因此,在 AppleService 上,我们获取他的 jwt 并查询 Keycloak 的 UMA 权限,然后我们决定 John Doe 可以看到哪些实体、可以更改哪些实体等。
  • Oranges 页面也会发生同样的情况。
  • 接下来John Doe来到Juice页面,开始长计算操作。 JuiceService 的前端查询。在 Juice 服务上,我们再次检查 John 的 Doe 权限,并接受他的请求,因此我们将任务放入队列中并返回 task_id。
  • 为了计算任务,我们必须从数据服务获取工作线程中的数据。因此我们向 Orange 和 Apple Services 提出请求。但是我们需要在worker中使用一些JWT令牌来处理授权请求。除此之外,该令牌以某种方式与 John Doe 连接就很好了,因此我们可以检查对 DataServices 中请求的实体的访问。
  • 我们绝对不能使用在 JuiceService 端点上收到的访问令牌,因为它的生命周期

我认为这应该如何运作。 JuiceServiceWorker 获得自己的 jwt,因此在 AppleService 上我们可以确定谁来找我们获取数据,并且我们可以获取 John's Doe 对 AppleService 的实际权限(如果我们从 JuiceService 传递权限,它们可能已经过时了),并做出决定关于数据访问。

我觉得这应该有一个很好的解决方案,但是很多google和youtube都没有帮助找到解决方案。有谁知道这个问题的好解决方案,以及使用 keycloak 作为 IAM 的解决方案吗?

有一些解决方案,但我没有什么好的

  1. 增加 jwt 的生命周期,糟糕的解决方案,绝对不好
  2. 在代理或网关上落地授权,所有服务无需授权。不好,降低安全性,因为我们失去了内层,如果攻击者以某种方式通过代理,那么所有服务都将不受保护
  3. 使用户处于keycloak中以获取后端服务。不好,它在 keycloak 中做了一些混搭,此外,当请求从工作人员发送到 DataService 时,我们无法检查 John Doe 权限。
authentication keycloak rbac
1个回答
0
投票

对于此类用例来说,一个有用的技术是使用RFC8693中的令牌交换。它基于 OAuth 范围,传达高级权限。

初始代币

考虑向客户端颁发的具有用户级权限的伪令牌:

{
  "sub": 123,
  "scope": "fruit:write fruit:read",
  "role": "user"
  "exp": (15 minutes)
}

交换代币

交换的令牌具有延长的生命周期,但权限减少:

{
  "sub": 123,
  "scope": "fruit:read",
  "role": "job",
  "transaction_id": 1234,
  "exp": (12 hours)
}

新代币一般会

downscope
原有代币,或者引入限制,例如:

  • 新令牌在正常 API 端点被拒绝
  • 新代币仅对特定交易有效

在您不推翻用户同意的情况下,甚至可以

upscope
。当然,您的 API 必须强制执行此类限制。

嵌入式代币

减少令牌交换请求数量的另一种方法是在用户身份验证时颁发此类令牌,然后将它们作为自定义声明包含在主令牌中。

维护用户身份

这些

token sharing patterns
是在 API 相互调用时保持用户身份和其他重要安全值可进行数字验证和审计的方法。

不过,我无法就特定提供商对该标准的支持提供建议。

© www.soinside.com 2019 - 2024. All rights reserved.