目录

Keystone 认证流程

  1. User 使用凭证(username/password) 到 keystone 验证并获得一个临时的 Token 和 Generic catalog(全局目录),临时的 Token 会存储在 keystone-client(cache UUID locally) 和 keystone-backend 中。
  2. User 使用这个临时 Token 发送给 keystone 并获得一个该 User 能访问的 Tenants 列表
  3. User 再跟 keystone 发送一个请求,表明希望访问的 Tenants
  4. keystone 就会向 User 发送一个管理这个 Tenants 的 Services 列表和允许访问这个 Tenants 的 Token (Tenants Token)
  5. User 会通过这个 Services 和 Generic catalog(全局目录) 映射找到 Services 的 endpoint,并通过 endpoint 找到实际 Services 组件的位置
  6. 然后 User 再拿着 Tenant Token 和 endpoint 来访问实际上的 Service 组
  7. Service 组件会拿着这个 User-Tennat Token 对到 keystone 做进一步的验证(Openstack 要保证每一步操作都是安全的)
  8. 如果通过了 7. 的验证的话,keystone 会返回一系列的确认信息和附加信息(User 希望操作的内容)给 Services
  9. 最后 Services 执行一系列的操作

让 Keystone 为一个新的项目 Service 提供验证功能

  • 在新项目的配置文件中指定使用 Keytone 认证方式
[keystone_authtoken]

auth_uri = http://<keystone_service_ip>:5000
project_domain_id = default
project_name = service
user_domain_id = default
password = fanguiju
username = <new_service_name>
auth_url = http://<keystone_service_ip>:35357
auth_plugin = password

该配置项的意义:

Because most OpenStack services must access the Identity Service, you must configure the IP address of the keystone server to be able to access it. You must also configure the admin_tenant_name, admin_user, and admin_password options for each service to work.

简而言之, 就是让每个不同的 Openstack Service 都使用一个特定的注册在 Keystone 中的 User 去访问 Keystone Service 并请求获得验证服务. 并且该配置项还指定了该项目属于的 Project(资源), 也就是早期版本中的 Tenant. 这里设置的是: 该项目属于 Tenant service. 这个在之后我们会使用到.

  • 所以, 我们首先需要为这个新的项目在 Keystone 中注册一个用户.
fanguiju@fanguiju:~/devstack$ keystone user-create --name <new_service_name> --pass fanguiju --enabled true

fanguiju@fanguiju:~/devstack$ openstack user list
+----------------------------------+----------+
| ID | Name |
+----------------------------------+----------+
| 135b2cb86962401c82044fd4ca9daae4 | admin |
| 40d75aebc9c34978b23081f8c8ca9af5 | <new_service_name> |
| 626110b81b2b4509becafc1964121b7f | nova |
| 85c6b9fa9127439880276f070c60dad6 | demo |
| 887a5e92599847698c1f601d0f337421 | glance |
| 9dc44b1518184c2cacecb2d2f9f8b050 | alt_demo |
| b340851dd5a24eb39a2383bb3f1ff36c | cinder |
+----------------------------------+----------+
  • 因为新的项目的Service 属于 Tenant service, 所以需要在这个 Tenant 中注册该项目的 Service
fanguiju@fanguiju:~/devstack$ openstack service create --name <new_service_name> --description "<new_service_name> Service" recovery
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | <new_service_name> Service |
| enabled | True |
| id | c22ebcb4cdd24114a2d581ce18cdd0ca |
| name | <new_service_name> |
| type | recovery |
+-------------+----------------------------------+ fanguiju@fanguiju:~/devstack$ openstack service list
+----------------------------------+-------------+----------------+
| ID | Name | Type |
+----------------------------------+-------------+----------------+
| 1cfc85bed3e84f2b93c5a9b9c293e1ed | cinder | volume |
| 348c1b372deb4c3fa817d340b439728b | ec2 | ec2 |
| 3fa397c2b5d647389edae03515c64583 | nova | compute |
| 41cfab784e6942189c8dc48fbda59c4e | glance | image |
| 7b534b13bd024a04b44f6eeee882208a | keystone | identity |
| 9b8de3d592054fc9b6b992be056ffd0a | nova_legacy | compute_legacy |
| aed90494567e4deababddd494fc33338 | cinderv2 | volumev2 |
| c22ebcb4cdd24114a2d581ce18cdd0ca | <new_service_name> | recovery |
+----------------------------------+-------------+----------------+

NOTE: Name 是用于显示的标识, 实际在 Servces 之间生效的是 Type .

  • 在 Tenant service 中注册完之后, 还需要创建 endpoint 记录, 让不同项目的 Services 之间可以定位到该新项目的服务
fanguiju@fanguiju:~/devstack$ openstack endpoint create --region RegionOne <new_service_name> --publicurl 'http://<new_service_ip>:8760/v1/$(tenant_id)s' --internalurl 'http://<new_service_ip>:8760/v1/$(tenant_id)s' --adminurl 'http://<new_service_ip>:8760/v1/$(tenant_id)s'
+--------------+------------------------------------------+
| Field | Value |
+--------------+------------------------------------------+
| adminurl | http://<new_service_ip>:8760/v1/$(tenant_id)s |
| id | 3c35ecc67e7444648dd079d5c0562f5b |
| internalurl | http://<new_service_ip>:8760/v1/$(tenant_id)s |
| publicurl | http://<new_service_ip>:8760/v1/$(tenant_id)s |
| region | RegionOne |
| service_id | 513308f8e46944ac8baf1c9758062660 |
| service_name | <new_service_name> |
| service_type | recovery |
+--------------+------------------------------------------+

到目前为止, 其实还没有完成新项目 Service 的添加, 因为现在为止在 Keystone 中新注册的 User 是没有权限访问这个 Tenant 的, 那么自然也无法获取 Tenant 中的 Services 列表. 所以无法为新项目完成验证的功能.

  • 将 User 绑定到 Tenant 和 Role 中
# 先获取 <new_service_id>/<service_id>/<member_id>
openstack user list # <new_service_id>
keystone tenant-list # <service_id>
openstack role list # <member_id> # 将用户绑定到 Relo admin 和 Tenant service 中
keystone user-role-add --user <new_service_id> --role <member_id> --tenant <service_id>
keystone user-role-add --user <new_service_id> --role <admin_id> --tenant <service_id>
  • 验证 User 的权限
fanguiju@fanguiju:~/devstack$ source openrc <new_user> service
fanguiju@fanguiju:~/devstack$ keystone user-list
+----------------------------------+----------+---------+----------------------+
| id | name | enabled | email |
+----------------------------------+----------+---------+----------------------+
| 135b2cb86962401c82044fd4ca9daae4 | admin | True | |
| 9dc44b1518184c2cacecb2d2f9f8b050 | alt_demo | True | alt_demo@example.com |
| b340851dd5a24eb39a2383bb3f1ff36c | cinder | True | |
| 85c6b9fa9127439880276f070c60dad6 | demo | True | demo@example.com |
| 40d75aebc9c34978b23081f8c8ca9af5 | <new_service_user> | True | |
| 887a5e92599847698c1f601d0f337421 | glance | True | |
| 626110b81b2b4509becafc1964121b7f | nova | True | |
+----------------------------------+----------+---------+----------------------+

使用 <new_user> 也能够访问完全的 User list, 表示该 User 具有了 admin 的权限.

最后

小结:

1. Openstack Service 需要一个注册在 Keystone 中的 User 来访问 Keystone service

2. Openstack Service 应该属于 Tenant service 中, 属于服务资源.

3. 这个 User 对 Tenant service 应该具有 admin 或者 member 权限, 所以需要将 User/ Tenant service/Role admin 绑定到一起.

4. 为了 Openstack services 之间可以相互访问, 需要在 service 的 URL 注册到 endpoint 中.

Openstack组件部署 — 将一个自定义 Service 添加到 Keystone的更多相关文章

  1. Openstack组件部署 — Keystone Install & Create service entity and API endpoints

    目录 目录 前文列表 Install and configure Prerequisites 先决条件 Create the database for identity service 生成一个随机数 ...

  2. Openstack组件部署 — Netwotking service组件介绍与网络基本概念

    目录 目录 前文列表 Openstack Networking serivce 基本的Neutron概念 Neutron的抽象对象 网络networks 子网subnets 路由器routers 端口 ...

  3. Openstack组件部署 — keystone(domain, projects, users, and roles)

    目录 目录 前文列表 Create a domain projects users and roles domain projects users and roles的意义和作用 Create the ...

  4. Openstack组件部署 — Keystone功能介绍与认证实现流程

    目录 目录 前文列表 Keystone认证服务 Keystone认证服务中的概念 Keystone的验证过程 简单来说 前文列表 Openstack组件部署 - Overview和前期环境准备 Ope ...

  5. Openstack组件部署 — Networking service_安装并配置Controller Node

    目录 目录 前文列表 前提条件 网络环境 完成下面的步骤以创建数据库 创建service credentials服务凭证 创建Neutron的API Endpoints 配置自服务网络 安装网络组件 ...

  6. Openstack组件部署 — Nova_Install and configure a compute node

    目录 目录 前文列表 Prerequisites 先决条件 Install and configure a compute node Install the packages Edit the etc ...

  7. Openstack组件部署 — Nova_安装和配置Controller Node

    目录 目录 前文列表 Prerequisites 先决条件 To create the databases To create the service credentials Create the C ...

  8. Openstack组件部署 — Networking service_Compute Node

    目录 目录 前文列表 安装组件 配置通用组件 配置自服务网络选项 配置Linux 桥接代理 配置Nova使用网络 完成安装 验证操作Execute following commands on Cont ...

  9. Openstack组件部署 — Nova overview

    目录 目录 前文列表 前言 Compute service overview Nova 的组件 nova-api service nova-api-metadata service nova-comp ...

随机推荐

  1. 多级xml解析方案

    package com.people.xmlToSql; import java.io.File; import java.io.IOException; import java.io.StringW ...

  2. pod 查看当前源/添加源

    1 pod 查看当前源 PeiSongs-iMac:5i5jAPP chenpeisong$ pod repo 0 repos 2 pod repo换源 CocoaPods 镜像使用帮助CocoaPo ...

  3. pycharm运行html文件报404错误

    某次发现运行导入的html文件的时候,打开浏览器会报404错误: 而运行自己写的html文件则正常显示: 最后发现这是pycharm缓存问题,只需重启pycharm清除缓存就ok啦!

  4. 将js/css脚本放到png图片中的实践。

     http://blog.csdn.net/zswang/article/details/7061560 将js/css脚本放到png图片中的实践. 标签: 脚本functionxmlhttprequ ...

  5. 牛客网练习赛 2 烟花(概率dp)

    题目传送门 烟花 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K Special Judge, 64bit IO Format: %lld 题目 ...

  6. box2d——1.tiles瓦片积木

    [调试渲染]   将TestCpp里Box2DTestBed的GLES-Render.h/cpp加入到项目中.声明绘制变量:GLESDebugDrawmDebugDraw. [创建世界]   // 依 ...

  7. 【转】modulenotfounderror: no module named 'matplotlib._path'问题的解决

    今天在装matplotlib包的时候遇到这样的问题,在网上找了很长时间没有类似很好的解决方法,最后自己 研究找到了解决的方法. 之前在pycharm里面已经装了matplotlib包,之后觉着下载包挺 ...

  8. shell中#*,##*,#*,##*,% *,%% *的含义及用法

    介绍下Shell中的${}.##和%%使用范例,本文给出了不同情况下得到的结果.假设定义了一个变量为:代码如下:file=/dir1/dir2/dir3/my.file.txt可以用${ }分别替换得 ...

  9. 五、hibernate表与表之间的关系(一对多关系)

    数据库表与表之间的关系 一对多:一个学校可以有多个学生,一个学生只能有一个学校 多对多:一个学生可以有多个老师,一个老师可以教多个学生 一对一:一个人只能有一个身份证号,一个身份证号只能找到一个人 一 ...

  10. css识别空格回车符

    新闻发布系统文字需要换行,后台返回数据包含空格.回车符号需要默认显示出来.在父元素加上css样式 :white-space:pre:即可. 例:<div class="white-sp ...