OpenStack Keystone 总结

一、概述

Keystone(OpenStack Identity Service)是 OpenStack 框架中负责管理身份验证、服务访问规则和服务令牌功能的组件。用户访问资源需要验证用户的身份与权限,服务执行操作也需要进行权限检测,这些都需要通过 Keystone 来处理。Keystone 类似一个服务总线, 或者说是整个 Openstack 框架的注册表,OpenStack 服务通过 Keystone 来注册其 Endpoint(服务访问的URL),任何服务之间的相互调用,都需要先经过 Keystone 的身份验证,获得目标服务的 Endpoint ,然后再调用。

Keystone 的主要功能如下:

  • 管理用户及其权限;
  • 维护 OpenStack 服务的 Endpoint;
  • Authentication(认证)和 Authorization(鉴权)。

Keystone 在整个 OpenStack 架构中的位置如下图:
这里写图片描述

Keystone 的架构如下图:
这里写图片描述

对于架构图中的概念,比如 Policy、Token、Endpoint、Credentials 等等,都是什么意思,应该怎样理解,下面我们进行详细介绍。概念理解后,对架构的理解也就清晰了。

二、基本概念

掌握 Keystone,需要理解下面这些基本概念:

1. User
这里写图片描述

User 指代任何使用 OpenStack 的实体,可以是真正的用户,其他系统或者服务。当 User 请求访问 OpenStack 时,Keystone 会对其进行验证。

Horizon 在 “身份管理->用户” 管理 User:
除了 admin 和 demo,OpenStack 也为 nova、cinder、glance、neutron 等服务创建了相应的 User。 admin 也可以管理这些 User。
这里写图片描述

2. Credentials

这里写图片描述

Credentials 是 User 用来证明自己身份的信息。可以是: (1) 用户名/密码 (2) Token (3) API Key (4) 其他高级方式。

3. Authentication

这里写图片描述

Authentication 是 Keystone 验证 User 身份的过程。User 访问 OpenStack 时向 Keystone 提交用户名和密码形式的 Credentials,Keystone 验证通过后会给 User 签发一个 Token 作为后续访问的 Credential。

4. Token

这里写图片描述

Token 是由数字和字母组成的字符串,User 成功 Authentication 后由 Keystone 分配给 User。Token 用做访问 Service 的 Credential,Service 会通过 Keystone 验证 Token 的有效性。Token 还有 scope 的概念,表明这个 Token 作用在什么范围内的资源,例如某个 Project 范围或者某个 Domain 范围,Token 只能用于认证用户对指定范围内资源的操作。Token 的有效期默认是 24 小时。

Keystone 提供如下几种 Token,可以根据需要配置使用某种 Token:

UUID token:服务 API 收到带有 UUID token 的请求时,必须到 Keystone 进行验证token 的合法性,验证通过之后才能响应用户请求。随着集群规模的扩大,Keystone 需处理大量验证 UUID token 的请求,在高并发下容易出现性能问题。

PKI token:携带更多用户信息并附上了数字签名,服务 API收 到 PKI token 时无需再去Keystone 验证,但是 PKI token 所携带可能随着 OpenStack Region 增多而变得非常长,很容易超出 HTTP Server 允许的最大 HTTP Header(默认为 8 KB),导致 HTTP 请求失败。

PKIZ token:PKI token 的压缩版,但压缩效果有限,无法良好的处理 token 长度过大问题。

Fernet token:携带了少量的用户信息,大小约为 255 Byte,采用了对称加密,无需存于数据库中。前三种 token 都会持久性存于数据库,与日俱增积累的大量 token 引起数据库性能下降,所以用户需经常清理数据库的 token;Fernet token没有这样的需要。

注:在Ocata版本中 Fernet 成为默认的 Token Provider。 PKI 和 PKIz token provider 被移除 。

5. Project

这里写图片描述

Project 用于将 OpenStack 的资源(计算、存储和网络)进行分组和隔离。在企业私有云中,Project 可以是一个部门或者项目组,和公有云的 VPC(虚拟私有网络)概念类似。资源的所有权是属于 Project 的,而不是 User。每个 User(包括 admin)必须挂在 Project 里才能访问该 Project 的资源,一个 User 可以属于多个 Project。

Horizon 在 “身份管理->项目” 中管理 Project:
可以通过 “管理成员” 将 User 添加到 Project 中。
这里写图片描述

6. Service

这里写图片描述

OpenStack 的 Service 包括 Compute (Nova)、Block Storage (Cinder)、Object Storage (Swift)、Image Service (Glance) 、Networking Service (Neutron) 等。每个 Service 都会提供若干个 Endpoint,User 通过 Endpoint 访问资源和执行操作。

7. Endpoint

这里写图片描述

Endpoint 是一个网络上可访问的地址,通常是一个 URL。Service 通过 Endpoint 暴露自己的 API。Keystone 负责管理和维护每个 Service 的 Endpoint。
这里写图片描述

8. Role

安全包含两部分:Authentication(认证)和 Authorization(鉴权)。Authentication 解决的是“你是谁?”的问题, Authorization 解决的是“你能干什么?”的问题。Keystone 是借助 Role 来实现 Authorization 的。Role 是全局(global)的,因此在一个 keystone 管辖范围内其名称必须唯一。

Horizon 在 “身份管理->角色” 中管理 Role:
可以为 User 分配一个或多个 Role。
这里写图片描述

Service 决定每个 Role 能做什么事情。Service 通过各自的 policy.json 文件对 Role 进行访问控制。Role 的名称没有意义,其意义在于 policy.json 文件根据 role 的名称所指定的允许进行的操作。
这里写图片描述

上面是Nova 服务 /etc/nova/policy.json 中的示例,配置含义为:

  • 对于 createattach_networkattach_volume 操作,任何 Role 的 User 都可以执行; 但只有 admin 这个 Role 的 User 才能执行 forced_host 操作。
  • OpenStack 默认配置只区分 admin 和非 admin Role。 如果需要对特定的 Role 进行授权,可以修改 policy.json

9. Group

这里写图片描述

Group 是一个 domain 部分 user 的集合,其目的是为了方便分配 role。给一个 group 分配 role,结果会给 group 内的所有 users 分配这个 role。

Horizon 在 “身份管理->组” 中管理 Group:
这里写图片描述

10. Domain

这里写图片描述

Domain 表示 Project、Group 和 User 的集合,在公有云或者私有云中常常表示一个客户,和 VDC(虚拟机数据中心)的概念类似。Domain 可以看做一个命名空间,就像域名一样,全局唯一。在一个 Domain 内,Project、Group、User 的名称不可以重复,但是在两个不同的 Domain 内,它们的名称可以重复。因此,在确定这些元素时,需要同时使用它们的名称和它们的 Domain 的 id 或者 name。

下图表示了 Domain、Project、User、Group、Role 之间的关系:
这里写图片描述

下面是一个整体关系图:
这里写图片描述

三、交互流程

Keystone 与 OpenStack 其他服务交互流程如下:
这里写图片描述

首先用户向 Keystone 提供自己的身份验证信息,如用户名和密码。Keystone 会从数据库中读取数据对其验证,如验证通过,会向用户返回一个 token,此后用户所有的请求都会使用该 token 进行身份验证。如用户向 Nova 申请虚拟机服务,nova 会将用户提供的 token 发给 Keystone 进行验证,Keystone 会根据 token 判断用户是否拥有进行此项操作的权限,若验证通过那么 nova 会向其提供相对应的服务。其它组件和 Keystone 的交互也是如此。

下面通过 “查询可用 image” 这个实际操作示例让大家对相关概念及交互流程建立更加感性的认识。

示例 :User admin 要查看 Project 中的 image。
第一步,登陆。
这里写图片描述
输入用户名密码后,点击“连接”按钮,OpenStack 内部发生了哪些事情?
这里写图片描述
返回的 token 中包含了 User 的 Role 信息。

第二步,显示操作界面。
这里写图片描述
请注意,顶部显示 admin 可访问的 Project 为 “admin” 和 “demo”。
其实在此之前发生了一些事情:
这里写图片描述

同时,admin 可以访问 “实例”, “卷”,“映像” 等服务:
这里写图片描述
这是因为 admin 已经从 Keystone 拿到了各 Service 的 Endpoints:
这里写图片描述

第三步,显示 Image 列表。
点击“映像”,会显示映像列表:
这里写图片描述
背后发生了这些事:
首先,admin 将请求发送到 Glance 的 Endpoint:
这里写图片描述

Glance 向 Keystone 询问 admin 身份的有效性:
这里写图片描述
接下来 Glance 会查看 /etc/glance/policy.json,判断 admin 是否有查看 image 的权限。
这里写图片描述
权限判定通过,Glance 将 image 列表发给 admin。

四、REST API 调用

上面的示例是在界面操作完成的,我们也可以通过调用 REST API 来实现。
同样的示例 :User admin 要查看 Project 中的 image。

第一步,获取Token。
URL http://controller:35357/v3/auth/tokens
传入的参数包括 user id,user password,project id,示例如下:

{
    "auth": {
        "identity": {
            "methods": [
                "password"
            ],
            "password": {
                "user": {
                    "id": "ee4dfb6e5540447cb3741905149d9b6e",
                    "password": "admin" }
            }
        },
        "scope": {
            "project": {
                "id": "a6944d763bf64ee6a275f1263fae0352"
            }
        }
    }
}

执行成功后,会返回 Token 信息。
这里写图片描述

第二步,根据token获取image列表。
URL http://controller:9292/v2/images
其中请求的 Header 需要加上上一步返回的 Token。
这里写图片描述

下面是返回的 images 列表信息(JSON 格式):
这里写图片描述

五、总结

本文对 OpenStack 认证服务 Keystone 做了详细的介绍,包括其功能、架构、基本概念以及和其他服务的交互流程。本文内容参考了网络上的很多有价值的文章,在这里表示非常感谢!

参考文档
https://www.cnblogs.com/charles1ee/p/6293387.html
http://www.cnblogs.com/CloudMan6/p/5365474.html
http://www.cnblogs.com/CloudMan6/p/5373311.html
https://www.ibm.com/developerworks/cn/cloud/library/1506_yuwz_keystonev3/index.html
http://www.cnblogs.com/sammyliu/p/5955984.html

相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页