跳转到: 导航, 搜索

Keystone/Trusts

Trusts

用例

  1. HEAT 和故障转移。它需要将虚拟机从一个主机迁移到另一个主机。
  2. 内容生产。某些内容生成一个大文件,需要将其存储在 Swift 中。

在两种情况下,用户都在设置时授权它随时执行此操作,即使在令牌过期很久之后。

Rules

"Keystone 是委托服务,处理用户的所有委托。它被信任以确保

  • 委托者不能委托其尚未被分配的属性
  • 委托者不能在委托深度耗尽后进行委托
  • 委托者不能在其自身委托的有效期之外进行委托。

换句话说,委托者只能委托小于(或等于)其已经拥有的内容,而不能委托更多。

Current Status of Delegation

目前,用户使用令牌以短期方式进行委托。一旦授予用户令牌,他会将该令牌传递给另一个(服务)用户,以证明其身份和执行某些操作的授权。此外,由于令牌未限定到特定端点,因此它们当前从一个端点传递到另一个端点。这并非安全的方法。如果沿途的任何端点受到破坏,该端点中的所有令牌都可用于任何接受令牌的其他服务。因此,我们将令牌的范围限制为仅该单个端点,并消除攻击。结果是,我们还消除了远程服务用户代表原始用户从其他远程服务请求其他操作的能力。这是信任旨在服务的问题。

Rules

  • Trust 是允许在未来某个时间点进行委托的承诺。实际的委托在令牌中执行。Trust 用于获取令牌。
  • 委托的数据只是 trustor 和 trustee 的用户 ID,以及正在委托的权限。
  • 委托的权限是租户 ID 和必须是分配给 trustor 的角色的子集。
    • 如果缺少所有权限,则不进行任何委托(即,没有一种方法可以表示“委托所有内容”)。
  • 最终参数,委托深度,表示委托是递归的还是非递归的,如果是递归的,则指定委托链的长度。
    • 值为 0(或缺失)表示委托者不能进一步委托这些权限。
    • 值为 1 表示委托者可以将权限委托给任何一组委托者,但后者不能进一步委托。
    • 值为 2 表示委托链可以进一步扩展 2 个长度(即,委托者到子委托者到子子委托者)。
    • 值为“inf”表示委托是无限递归的。
  • 还有一个与委托关联的端点列表。
    • 这进一步将委托限制为指定的端点。
    • 如果缺少端点,则委托将毫无用处。
    • 特殊值“all_endpoints”允许 trust 由与委托的租户关联的所有端点使用。
  • 有一个可选的持续时间值,包括 trust 的开始时间和结束时间。

API

To create a trust

POST /trusts

在 POST 到 trusts 时,trustor 提供

  • trustee: 用户 ID
  • tenantId
  • roles
  • endpoints
  • trust 开始时间(可选,默认为提交时间)
  • trust 结束时间(可选,默认为永不)
  • delegation depth(可选)

trustor ID 从创建用户的 ID 中推断得出。

To enumerate the trusts

GET /trusts/

这将返回一个包含两个列表的文档

  • 第一个是用户是 trustor 的 trust 列表
  • 第二个是用户是 trustee 的 trust 列表

To enumerate the list of trustees for trusts that the user has created

GET /user/<id>/trustees

  • 这将返回一个 trustee 用户 ID 列表,每个 ID 都与关联 trust 的 URL 列表相关联。
  • 这将查看活动的 trust。禁用的 trust 需要额外的参数(disabled)
  • 只有 trustor 才能访问此 URL。任何其他用户将收到 403(Forbidden)。

To enumerate the set of trustors that have nominated the user as the trustee

GET /user/<id>/trustors

  • 这将返回一个 trustor 用户 ID 列表,每个 ID 都与关联 trust 的 URL 列表相关联。
  • 这将查看活动的 trust。禁用的 trust 需要额外的参数(disabled)
  • 只有 trustor 才能访问此 URL。任何其他用户将收到 403(Forbidden)

To view a trust

  • GET /trusts/{trustID}
  • 这将查看活动的 trust。禁用的 trust 需要额外的参数(disabled)
  • 只有 trustor 或 trustee 才能访问此 URL。任何其他用户将收到 403(Forbidden)。

To deactivate a trust

  • DELETE /trusts/{trustID}
  • 这将设置 trust 状态为 disabled。
  • 只有 trustor 才能访问此 URL。任何其他用户将收到 403(Forbidden)。

TrustID

trust id 是一个 blob,对于第一个实现,将是一个 UUID。它对 trustor 和 trustee 来说应该毫无用处。任何其他用户都不应该能够查看它。用户应该能够枚举她的预身份验证,以便查看、修改和删除它们。/users/preauthentications

实现

Implemented in two phases.

Token Format Changes

从 Trust 创建的每个令牌将有两个额外的字段。

  • trustee 字段,包含 trustee 的 userID
  • trust 字段,包含 trust ID。

在执行递归委托时,需要记录委托链,至少是为了让 trustor 能够理解如何将新的 trustee 添加到令牌中。因此,每个令牌将有一个 trusts 字段。这将是一个列表,其中包含链中的每个 trustee 的名称,按从原始 trustee 到请求令牌的 trustee 的顺序排列。

阶段 1

  1. Trusts 今天以“硬编码”的方式实现,具有当前在令牌中公开的属性:(trustor)用户、租户、角色、端点。
  2. 从 trusts 生成的令牌看起来就像普通的令牌一样。它们将有一个额外的字段“trustee”。这将允许当前令牌使用者像现在一样继续使用 trust 令牌。

Phase 2.

  1. 修改令牌架构以允许任意属性集。
  2. 修改 trust 架构以指定要在令牌中使用的任意属性集。