KeyStone概述

OpenStack Identity服务提供单点集成,用于管理身份验证,授权和服务目录。

身份验证服务通常是用户与之交互的第一个服务。经过身份验证后,最终用户可以使用其身份访问其他OpenStack服务。同样,其他OpenStack服务利用身份服务来确保用户是他们所说的人,并发现部署中的其他服务。Identity服务还可以与某些外部用户管理系统(例如LDAP)集成。

用户和服务可以使用由Identity服务管理的服务目录来查找其他服务。顾名思义,服务目录是OpenStack部署中可用服务的集合。每个服务可以有一个或多个端点,每个端点可以是以下三种类型之一:admin,internal或public。在生产环境中,出于安全原因,不同的端点类型可能驻留在暴露给不同类型用户的不同网络上。例如,公共API网络可能从Internet上可见,因此客户可以管理他们的云。管理API网络可能仅限于管理云基础架构的组织内的运营商。内部API网络可能仅限于包含OpenStack服务的主机。此外,OpenStack支持多个区域以实现可伸缩性。RegionOne区域。在身份服务中创建的区域,服务和端点一起构成部署的服务目录。部署中的每个OpenStack服务都需要一个服务条目,并在Identity服务中存储相应的端点。这可以在安装和配置Identity服务之后完成。

Identity服务包含以下组件:

服务器

一个中心化的服务器使用RESTful接口来提供认证和授权服务。

驱动程序

驱动或服务后端被整合进集中式服务器中。它们被用来访问OpenStack外部仓库的身份信息,并且它们可能已经存在于OpenStack被部署在的基础设施(例如,SQL数据库或LDAP服务器)中。

模块

中间件模块运行于使用身份认证服务的OpenStack组件的地址空间中。这些模块拦截服务请求,取出用户凭据,并将它们送入中央是服务器寻求授权。中间件模块和OpenStack组件间的整合使用Python Web服务器网关接口。

  KeyStone术语

  • User:用户,它是用一个数字代表使用OpenStack云服务的一个人、系统或者服务,身份验证服务将会验证传入的由用户申明调用的请求。

  • Project:项目,它是一个人或服务所拥有的资源集合。不同的项目之间资源是隔离的,资源可以设置配额,项目中可以有多个用户,每一个用户会根据权限的划分来使用项目中的资源,用户在使用项目的资源前,必须要与这个项目关联,并且制定用户在项目下的角色,一个assignment(关联) 即:Project-User-Role。

  • Token:令牌,它是一串数字字符串,当用户访问资源时需要使用的东西,在keystone中主要是引入令牌机制来保护用户对资源的访问,同时引入PKI、PKIZ、fernet、UUID其中一个随机加密产生一串数字,对令牌加以保护,token并不是长久有效的,是有时效性的,在有效的时间内可以访问资源。

  • Role:角色,它是一堆ACL集合,主要用于权限的划分,例如Nova中的虚拟机、Glance中的镜像,可以给User指定Role,是user获得role对应的操作权限,系统默认使用管理Role的角色 管理员用户admin,在老版本中普通用户是member,而新版本则是user。

  • Service:服务,它是一个通讯簿,一个服务可以确认当前用户是否具有访问其资源的权限,但是当一个用户尝试着访问其项目内的服务时,他必须知道这个服务是否存在,以及如何联系。

  • Endpoint:端点,它是用来通过访问和定位某个openstack service的地址,通常是一个URL,我们也可以理解为它是一个暴露出来的访问点,如果需要访问一个服务,则必须知道他的端点,端点的每一个Url都对应一个服务实例的访问地址,并且具有public、private和admin这三种权限,public url可以被全局访问,默认端口为5000,private url只能被局域网访问,默认端口为5000,admin url可以被从常规的访问中分离,默认端口为35357。

  V3版本

  1. Tenant更改为Project,即租户改为项目

  2. 添加了域的概念Domain(对系统资源进行限额)

  3. 添加了组的概念Group(为了更好的管理用户,例如linux下对组授权,其组下面的用户也有了相应的权限)

  4. 普通用户member更改为user

  KeyStone认证流程

用户通过api接口想创建一个实例,首先会将自己的相关信息发给keystone。认证成功后,keystone会颁给用户一个临时的令牌(Token)和一个访问服务的地址(Endpoint)。用户把临时令牌(Token)提交给keystone,keystone并返回一个项目(Project),用户向keystone发送带有特定项目凭证,告诉keystone用户在哪个项目中,keystone收到请求后,会发送一个项目的token到用户,用户拿着令牌(Token)和一个访问服务的地址(Endpoint)找到可访问服务,服务向keystone进行认证,令牌(Token)是否合法,它允许访问使用该服务(判断用户中角色(Role)权限),keystone向服务提供额外的信息。用户是允许方法服务,这个令牌(Token)匹配请求,这个令牌(Token)是用户的,服务执行用户发起的请求,创建实例,服务会将状态报告给用户,最后返回结果,实例已经创建。

  安装和配置

1.在安装和配置Identity服务之前,必须创建数据库

MariaDB [(none)]> CREATE DATABASE keystone;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY '123';
MariaDB [(none)]> flush privileges;

2.运行以下命令来安装包

[root@controller ~]# yum install -y openstack-keystone httpd mod_wsgi

3.编辑文件/etc/keystone/keystone.conf并完成如下动作

#在[database]部分,配置数据库访问
[database]
# ...
connection = mysql+pymysql://keystone:[email protected]/keystone

#在[token]部分,配置Fernet UUID令牌的提供者
[token]
# ...
provider = fernet

4.初始化身份认证服务的数据库

[root@controller ~]# su -s /bin/sh -c "keystone-manage db_sync" keystone

5.初始化Fernet key

[root@controller ~]# keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
[root@controller ~]# keystone-manage credential_setup --keystone-user keystone --keystone-group keystone

6.创建管理员账户与引导身份服务

[root@controller ~]# keystone-manage bootstrap --bootstrap-password 123 --bootstrap-admin-url http://192.168.137.51:35357/v3/ --bootstrap-internal-url http://192.168.137.51:5000/v3/ --bootstrap-public-url http://192.168.137.51:5000/v3/ --bootstrap-region-id RegionOne

7.编辑/etc/httpd/conf/httpd.conf文件,配置ServerName选项为控制节点

ServerName 192.168.137.51:80

8.创建一个链接到/usr/share/keystone/wsgi-keystone.conf文件

[root@controller ~]# ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/

9.启动 Apache HTTP 服务并配置其随系统启动

[root@controller ~]# systemctl enable httpd.service
[root@controller ~]# systemctl start httpd.service

到这里为止我们基本安装已经完成,启动Apache服务后我们可以看到三个端口:80、35357、5000,当然,我们也可以查看/usr/share/keystone/wsgi-keystone.conf文件使用的端口分别有哪些和指向到了什么目录下

10.配置admin账户

[root@controller ~]# export OS_USERNAME=admin
[root@controller ~]# export OS_PASSWORD=123
[root@controller ~]# export OS_PROJECT_NAME=admin
[root@controller ~]# export OS_USER_DOMAIN_NAME=Default
[root@controller ~]# export OS_PROJECT_DOMAIN_NAME=Default
[root@controller ~]# export OS_AUTH_URL=http://192.168.137.51:35357/v3
[root@controller ~]# export OS_IDENTITY_API_VERSION=3

  创建域、项目、用户和角色

Identity服务为每个OpenStack服务提供身份验证服务。身份验证服务使用域,项目,用户和 角色的组合。

1.创建Service Project,后续服务都加入到这个项目中

[root@controller ~]# openstack project create --domain default --description "Service Project" service
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | Service Project                  |
| domain_id   | default                          |
| enabled     | True                             |
| id          | a6306dfc6ac944b48fdaed30fdc0daf1 |
| is_domain   | False                            |
| name        | service                          |
| parent_id   | default                          |
+-------------+----------------------------------+

2.常规(非管理)任务应该使用无特权的项目和用户,作为展示创建demo项目和用户

#创建demo项目
[root@controller ~]# openstack project create --domain default --description "Demo Project" demo
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | Demo Project                     |
| domain_id   | default                          |
| enabled     | True                             |
| id          | 243522d50796454f9909333176175676 |
| is_domain   | False                            |
| name        | demo                             |
| parent_id   | default                          |
+-------------+----------------------------------+

#创建demo用户
[root@controller ~]# openstack user create --domain default --password-prompt demo
User Password:
Repeat User Password:
+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| domain_id           | default                          |
| enabled             | True                             |
| id                  | e375ef47b2ab49b3b73374cd5790fb19 |
| name                | demo                             |
| options             | {}                               |
| password_expires_at | None                             |
+---------------------+----------------------------------+

#创建user角色
[root@controller ~]# openstack role create user
+-----------+----------------------------------+
| Field     | Value                            |
+-----------+----------------------------------+
| domain_id | None                             |
| id        | e76183c8e18e4cba8dacf66117772162 |
| name      | user                             |
+-----------+----------------------------------+

#将user角色添加到项目demo用户demo
[root@controller ~]# openstack role add --project demo --user demo user

  验证操作

1.撤销临时环境变量OS_AUTH_URLOS_PASSWORD

[root@controller ~]# unset OS_AUTH_URL OS_PASSWORD

2.测试admin用户

[root@controller ~]# openstack --os-auth-url http://192.168.137.51:35357/v3 --os-project-domain-name default --os-user-domain-name default --os-project-name admin --os-username admin token issue
+------------+-------------------------------------------------------------------------------------------------------------------------+
| Field      | Value                                                                                                                   |
+------------+-------------------------------------------------------------------------------------------------------------------------+
| expires    | 2018-11-26T00:10:11+0000                                                                                                |
| id         | gAAAAABb-yvTfoMZaD72e5NwuiwRSeppwjBYVs3n8UKFGwCyTD0LXRm2nCAUDeAnfmL39d1gmPCAAYsUXVuxI1OXLTscT-                          |
|            | JOwnYWFty0W3KbhvShrufSxr45OhYMKIL88gNu__wLxKq9K_YBRmLF7VyRvoJ_0kVxo7HFUlKvmLKvtU5XdnEPTKA                               |
| project_id | 2013d449ba6d4cd8a3d69cee893e6ab9                                                                                        |
| user_id    | b0bed0d065a54f23b9de7f2332a8be45                                                                                        |
+------------+-------------------------------------------------------------------------------------------------------------------------+

3.测试demo用户

[root@controller ~]# openstack --os-auth-url http://192.168.137.51:5000/v3 --os-project-domain-name default --os-user-domain-name default --os-project-name demo --os-username demo token issue
+------------+-------------------------------------------------------------------------------------------------------------------------+
| Field      | Value                                                                                                                   |
+------------+-------------------------------------------------------------------------------------------------------------------------+
| expires    | 2018-11-26T00:11:36+0000                                                                                                |
| id         | gAAAAABb-ywoYRmxBMTuAQeBqoA7gmdXA8i-i4vpULGy4Mwe-_2tJEq4237eEq6z67aIrAXbDpBlpRTyGv5XitBhFfw7CR9jfCR1eHDcpMaKvOoyIpMIaAB |
|            | sehsPGUQbZivTx9vtpa4jgOR_7bTRyaMB2GfWtj43XxodYBso_dTfRRm0TFu2YJE                                                        |
| project_id | 243522d50796454f9909333176175676                                                                                        |
| user_id    | e375ef47b2ab49b3b73374cd5790fb19                                                                                        |
+------------+-------------------------------------------------------------------------------------------------------------------------+

  创建OpenStack客户端环境脚本

1.创建admin用户环境脚本

[root@controller ~]# vim admin-openrc
export OS_PROJECT_DOMAIN_NAME=Default
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=123
export OS_AUTH_URL=http://192.168.137.51:35357/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2

2.创建demo用户环境脚本

[root@controller ~]# vim demo-openrc
export OS_PROJECT_DOMAIN_NAME=Default
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_NAME=demo
export OS_USERNAME=demo
export OS_PASSWORD=123
export OS_AUTH_URL=http://192.168.137.51:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2

3.测试使用

[root@controller ~]# . admin-openrc 

[root@controller ~]# openstack token issue
+------------+-------------------------------------------------------------------------------------------------------------------------+
| Field      | Value                                                                                                                   |
+------------+-------------------------------------------------------------------------------------------------------------------------+
| expires    | 2018-11-26T00:16:31+0000                                                                                                |
| id         | gAAAAABb-y1PSG-I6pxr7zJLN5MfFZkvENLgFCjVSWIDJp4_9e7uyiUurdAiB3Z32K5ANiZCEZr5ZfHxBixZKUshAAs-                            |
|            | 35qKInUc3M1a37zgUPlkjaxbP3NUk4zZYYFkdKRFr_c8Dbn45vrKHWuSDVnpJNrmkTILcnj72PMgkUuM5IRgcXho87w                             |
| project_id | 2013d449ba6d4cd8a3d69cee893e6ab9                                                                                        |
| user_id    | b0bed0d065a54f23b9de7f2332a8be45                                                                                        |
+------------+-------------------------------------------------------------------------------------------------------------------------+