03.OpenStack认证服务Keystone

徐亮伟, 江湖人称标杆徐。多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。擅长Web集群架构与自动化运维,曾负责国内某大型电商运维工作。
个人博客"徐亮伟架构师之路"累计受益数万人。
笔者Q:552408925、572891887
架构师群:471443208

1.认证服务概述

OpenStack的身份服务提供了集成的管理身份验证,授权和服务目录服务的单点。其他的OpenStack服务使用的身份服务作为一个通用统一的API。此外,提供有关用户的信息,但该服务不包括开栈(如LDAP服务)可以被集成到一个预先存在的基础设施。

为了从身份服务中受益,其他的OpenStack服务需要与它合作。当一个开栈服务从用户接收请求时,它检查与用户是否被授权作出该请求的标识服务。

身份服务包含以下组件:

  • 服务器 中央服务器提供了一种使用RESTful接口验证和授权服务。
  • 驱动程序 驱动程序或服务后端被集成到中央服务器。它们被用于在库外的OpenStack访问身份信息,并且可以在开栈中部署(例如,SQL数据库或LDAP服务器)的基础设施已经存在。
  • 模块 中间件模块中正在使用该标识服务的开栈组件的地址空间中运行。这些模块拦截服务请求,提取用户凭据,并将它们发送到中央服务器进行授权。中间件模块和OpenStack的组件之间的集成使用Python的Web服务器网关接口。 当安装OpenStack的身份服务,您必须在您的OpenStack安装注册的每个服务。然后身份服务可以跟踪安装哪些开栈的服务,并且它们的位置在网络上。

OpenStack的身份服务提供了集成的管理身份验证,授权和服务目录服务的单点。
用户与认证:用户权限与用户行为追踪。
服务目录:提供一个服务目录,包括所有服务项与相关Api的端点

用户认证
User:用户、Tenant:租户项目、Token:令牌、Role:角色

服务目录
Service:服务、Endpoint:端口

2.Keystone安装配置

本节将介绍如何安装和配置OpenStack的身份服务,代号为梯形,本指南部署至控制节点

2.1认证服务先决条件

配置OpenStack的认证服务之前,你必须创建一个数据库和管理令牌。

1.创建Keystone数据库,赋予数据库梯形权限,完成以下操作

mysql -u root -p123456 -e "CREATE DATABASE keystone;"

mysql -u root -p123456 -e "GRANT ALL PRIVILEGES ON \
keystone.* TO 'keystone'@'localhost' IDENTIFIED BY 'keystone';"

mysql -u root -p123456 -e "GRANT ALL PRIVILEGES ON \
keystone.* TO 'keystone'@'%' IDENTIFIED BY 'keystone';"

2.2安装和配置Keystoen

默认的配置文件由分布有所不同。您可能需要添加这些部分和选项,而不是修改现有的部分和选项。此外,在配置片段省略号(...)表示应保留潜在的默认配置选项。
本指南使用的Apache HTTP服务器mod_wsgi的服务端口5000和35357.默认标识服务请求,服务基石仍然监听这些端口。

1.运行以下命令安装Openstack Keystone认证服务

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

2.编辑/etc/keystone/keystone.conf文件并完成以下操作:

[database] 部分中,配置数据库访问

[database]
...
connection = mysql://keystone:keystone@192.168.56.11/keystone

[memcache]部分中,配置缓存服务

[memcache]
...
servers = 192.168.56.11:11211

[token]部分中,配置token的fernet

[token]
...
provider = fernet

3.初始化keyston数据库,并检查数据库

[root@linux-node1 ~]# su -s /bin/sh -c "keystone-manage db_sync" keystone
[root@linux-node1 ~]# mysql -uroot -p123456 -e "use keystone;show tables;"|wc -l
38

4.初始化fernet密钥库

[root@linux-node1 ~]# keystone-manage fernet_setup \
--keystone-user keystone --keystone-group keystone

[root@linux-node1 ~]# keystone-manage credential_setup \
--keystone-user keystone --keystone-group keystone

5.创建身份服务API端点

[root@linux-node1 ~]# keystone-manage bootstrap --bootstrap-password admin \
  --bootstrap-admin-url http://192.168.56.11:35357/v3/ \
  --bootstrap-internal-url http://192.168.56.11:35357/v3/ \
  --bootstrap-public-url http://192.168.56.11:5000/v3/ \
  --bootstrap-region-id RegionOne

2.3配置Apache HTTP Server

1.编辑/etc/httpd/conf/httpd.conf中的文件配置ServerName

ServerName 192.168.56.11:80

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

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

2.4完成认证服务安装

1.启动Apache HTTP服务,并将其配置为启动系统时启动

[root@linux-node1 ~]# systemctl enable httpd memcached
[root@linux-node1 ~]# systemctl start httpd.service memcached.service

2.检查#keystone相关配置,5000服务调用端口,35357管理端口

[root@linux-node1 ~]# netstat -lntp|grep "httpd"
tcp6       0      0 :::5000           :::*                    LISTEN      90577/httpd
tcp6       0      0 :::80             :::*                    LISTEN      90577/httpd
tcp6       0      0 :::35357          :::*                    LISTEN      90577/httpd

3.执行如下命令,配置管理帐户

export OS_USERNAME=admin
export OS_PASSWORD=admin
export OS_PROJECT_NAME=admin
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_DOMAIN_NAME=Default
export OS_AUTH_URL=http://192.168.56.11:35357/v3
export OS_IDENTITY_API_VERSION=3

3.创建项目用户和角色

身份服务为每OpenStack的服务提供认证服务。认证服务使用域,项目(租户),用户和角色的组合。

本指南使用一个服务项目,该项目包含一个您添加到您的环境中的每个服务的唯一用户。

1.创建服务项目

[root@linux-node1 ~]# openstack project create --domain default \
--description "Service Project" service

+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | Service Project                  |
| domain_id   | default                          |
| enabled     | True                             |
| id          | b512727322e64c8a9fe03577e03c144e |
| is_domain   | False                            |
| name        | service                          |
| parent_id   | default                          |
+-------------+----------------------------------+

2.非管理员的任务应该使用一个普通的项目和用户。作为一个例子,本指南创建demo项目和用户。

[root@linux-node1 ~]# openstack project create --domain default \
--description "Demo Project" demo
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | Demo Project                     |
| domain_id   | default                          |
| enabled     | True                             |
| id          | 7f005d2fc6fa46cab5a700d3b2ff94bf |
| is_domain   | False                            |
| name        | demo                             |
| parent_id   | default                          |
+-------------+----------------------------------+

创建demo用户

[root@linux-node1 ~]# openstack user create --domain default \
--password=demo demo
+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| domain_id           | default                          |
| enabled             | True                             |
| id                  | c5923120d10c43eb875da6f9491d64b2 |
| name                | demo                             |
| password_expires_at | None                             |
+---------------------+----------------------------------+

创建普通用户角色

[root@linux-node1 ~]# openstack role create user
+-----------+----------------------------------+
| Field     | Value                            |
+-----------+----------------------------------+
| domain_id | None                             |
| id        | 8c3c43c034a148a08c17d41869fcb758 |
| name      | user                             |
+-----------+----------------------------------+

"demo" 用户加入 "demo" 项目,赋予 "user" 角色

[root@linux-node1 ~]# openstack role add --project demo --user demo user

4.验证Keystone操作

安装其他服务之前,验证服务的运行。出于安全原因,禁止临时身份验证令牌机制.

1.取消临时OS_URL环境变量

[root@linux-node1 ~]# unset OS_URL

2.admin用户,请求身份验证令牌

[root@linux-node1 ~]# openstack --os-auth-url http://192.168.56.11:35357/v3 \
--os-project-domain-name default --os-user-domain-name default \
--os-project-name admin --os-username admin token issue

+------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Field      | Value                                                                                                                                                        |
+------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
| expires    | 2016-10-09 06:41:27+00:00                                                                                                                                    |
| id         | gAAAAABX-diHHH3KKszyA_LWcXQgAphV4PSKtMiGYSLYcfQgiuFH4hWbbciOaTlo1wKOhyeXGeBWhEGm-u6x-0tqY3YvcI8b42b_cqU0GWLCo1ZUT2K3OIFRABJYzTb-                             |
|            | L9XwmYBa6G42NKgUh7Chcamr31watRCwr5m6dq_iSqrjMQ8gnvb40iw                                                                                                      |
| project_id | 0ec016bd5701495ab9cf2b7ffbea28b9                                                                                                                             |
| user_id    | c32a1641c2a343eeae1c156892bc05ea                                                                                                                             |
+------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+

3.demo用户,请求身份验证令牌

[root@linux-node1 ~]# openstack --os-auth-url http://192.168.56.11:5000/v3 \
--os-project-domain-name default --os-user-domain-name default \
--os-project-name demo --os-username demo --os-password demo token issue

+------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Field      | Value                                                                                                                                                        |
+------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
| expires    | 2016-10-09 06:42:48+00:00                                                                                                                                    |
| id         | gAAAAABX-djY05lRv5-91KilWj0Qr9GuZCW_LhGzv7YZkpkVqw-z4Q_MM6K36-3mdUOBm35jXdxwaUyGmLADL1f27dnEMm0kiI_m3ZusSIV7Hbl-                                             |
|            | bIhyjRMDR0NfwG51mi5VIWKbueJcXnFG76sYRBxkSCS7CY75tc2UjwMA0o4YUKclF2jBc98                                                                                      |
| project_id | 7f005d2fc6fa46cab5a700d3b2ff94bf                                                                                                                             |
| user_id    | c5923120d10c43eb875da6f9491d64b2                                                                                                                             |
+------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+

5.创建OpenStack的客户端环境的脚本

在上一节中使用的环境变量和命令选项的组合,以经由开栈客户身份服务进行交互。为了提高客户运营效率,OpenStack的支持简单的客户端脚本环境也被称为OpenRC的文件。这些脚本通常包含的所有客户端常用的选项,还支持独特的选项。欲了解更多信息,请参阅OpenStack的最终用户指南。

5.1创建脚本

创建admin和demo用户的项目和客户端环境的脚本。该指南的未来部分引用这些脚本加载客户端操作相应的凭据。

1.编辑admin-openrc的文件,并添加以下内容

[root@linux-node1 ~]# 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=admin
export OS_AUTH_URL=http://192.168.56.11:35357/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2

2.编辑demo-openrc的文件,并添加以下内容

[root@linux-node1 ~]# vim demo-openrc
export OS_PROJECT_DOMAIN_ID=default
export OS_USER_DOMAIN_ID=default
export OS_PROJECT_NAME=demo
export OS_TENANT_NAME=demo
export OS_USERNAME=demo
export OS_PASSWORD=demo
export OS_AUTH_URL=http://192.168.56.11:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2

6.2使用脚本

1.加载 admin-openrc 文件来填充环境变量的身份服务和管理项目和用户凭据的位置

[root@linux-node1 ~]# chmod +x admin-openrc demo-openrc

2.申请认证令牌

[root@linux-node1 ~]# source admin-openrc
[root@linux-node1 ~]# openstack token issue
+------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Field      | Value                                                                                                                                                        |
+------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
| expires    | 2016-10-09 06:43:38+00:00                                                                                                                                    |
| id         | gAAAAABX-dkKw5oES9dNceaTqUSd7xhikm1DLNML0u_cJF7wCN43lUip1J2BtLjzjozRka_-8UlhX4zVKGstuGxm2R-                                                                  |
|            | m8Y3ElIDwIj8a5pKBOmebQ9aH9fShkE4w5hWIg9odsnoy5WsrGxrD2dujdVfAC5zuyOc3m3Zdtie5W2Ig35S0Y094fDI                                                                 |
| project_id | 0ec016bd5701495ab9cf2b7ffbea28b9                                                                                                                             |
| user_id    | c32a1641c2a343eeae1c156892bc05ea                                                                                                                             |
+------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+