Keystone API v3

keystone v3的API已经发布了很久,一直觉得没有有趣的功能值得研究,直到IceHouse出现了“联合keystone”这个功能,才下决心看看V3有什么变化。

注:本文不是详细介绍V3的全部API,只是拣取几个比较有意义的API,解释概念,演示其使用方法。若需要查看完整API定义请移步:官方文档

v3概述

keystone v3整体上沿用了v2的概念定义,使用方法也没有翻天覆地的变化,基本上可以看成是功能增强,扩展和用户体验的增强。

综合来看,v3 有以下变化(粗体的内容会在下文详细描述):

  • Tenant改名为project
  • 新增group概念:一个包若干用户的容器
  • 新增domain概念:一个名字空间,包含若干project,user,group
  • 新增policy概念:集中管理policy规则
  • 新增credential概念:针对用户的通用凭证(SSH, PKI,EC2)存储
  • role除了可以在附加在project和user之上,还可以附加在domain和project上(下文详细描述)
  • user, group, project的名字只要在domain中唯一即可
  • 获取用户的所属project现在需要在URI中显式地指定user_id(之前是GET /tenants 现在是 GET /users/{user_id}/projects)
  • Token显式地指明范围:user+project或者 user+domain
  • 验证token的接口,token不会出现在URI中

Domain

URI:

/v3/domains

{
    "domain": {
        "description": "--optional--",
        "enabled": "--optional--",
        "name": "..."
    }
}

domain类似一个名字空间,这个名字空间适用于三个实体:user,group,project。在同一个domain中,这个三个实体的的名字不能重复。在加入domain之后,名字的唯一性和v2版本相比发生了变化。v2中user,project,role的名字必须全局唯一,现在名字唯一性变成:

  • domain name:全局唯一
  • role name:全局唯一(和v2一致)
  • user name:domai内唯一
  • group name:domai内唯一
  • project name:domai内唯一

值得注意的是domain仅仅是名字空间,并没有带来隔离。一个用户可以和本domain的project关联,也可以和其他domain的project关联。

其实可以看成domain是一个前缀,和v2版本的实体都没变,只是加上了domain的前缀:

  • role name: 不变
  • user name: domain_user (仍然是全局唯一)
  • project name: domain_project (仍然是全局唯一)

domain除了命名上的灵活性,在没有domain时,我们完全可以策略上给每一个user name加上自定义前缀,比如所有测试的用户都叫test_XXX,这样就不怕名字冲突。

还带来了更细力度的policy设置。比如:在v2接口中,系统管理员是一个全局的属性,即如用户gtt有了admin的role,那么整个openstack中,gtt都是有管理员权限的。有了domain之后,可以设计成gttdomain_test中有管理员权限,而在domain_pub中没有。

keystone-cloud-admin--1-

如图所示,通过domain,我们可以设置一个cloud admin,超级管理员,可以设置所有domain中的project,user,group等。在每一个domain中可以设置独立的domain admin,他们则只能管理本domain中的资源。

官方文档描述了通过设置policy来实现这样的功能。这里有文章描述具体如何操作

Group

URI:

/v3/groups

{
    "group": {
        "description": "--optional--",
        "domain_id": "--optional--",
        "name": "..."
    }
}

Group是domain中若干user的集合。将一个group和关联到project/domain等效于将group中的所有用户关联到project/domain上。一旦将role授权给一个group,当用户增加到这个group中,此用户讲自动获得此role。类似的,如果将用户从group中移除,则自动移除用户的此role,同时,用户相关的token会被撤销。

特别的,如果一个group没有以任何role关联到任何project/domain上,那么这个group中的用户不能访问任何资源。

keystone-user-2Fgroup

如上图所示,group简化了绑定角色的操作,可以预先将role绑定到一个group上,之后只要从这个group中加入或者移除用户即可。

Role绑定

和v2一样,在v3中role名是全局唯一的,它是一个“关系”的标签,这个“关系”两端各连着一个实体,表示两者到底是以何种”关系“关联的。

以前role只能绑定在user和tenant(project)之间。由于v3加入了domain和group,role的用途也因此扩展了。现在支持以下4钟实体之间的关系:

  • user —-[role]—- domain
  • group —-[role]—- domain
  • user —-[role]—- project (和v2一致)
  • group —-[role]—- project

注意,user(group)和domain直接绑定,不意味着user(group)和domain中的所有project自动绑定上了role。keystone v3.1有一个API扩展os-inherit来实现这个功能。

总结

本文描述了keystone v3核心功能相对v2的改动,做了详细的概念解释,希望对读者有帮助。

发表评论

电子邮件地址不会被公开。 必填项已用*标注