OpenStack Identity服务提供单点集成,用于管理身份验证,授权和服务目录。通常是用户与openstack交互的第一个服务。经过身份验证后,最终用户可以使用其身份访问其他OpenStack服务。Identity服务还可以与某些外部用户管理系统(例如LDAP)集成。

   用户和服务可以使用由Identity服务管理的服务目录来查找其他服务。每个服务可以有一个或多个端点,每个端点可以是以下三种类型之一:admin,internal或public。

    在生产环境中,出于安全原因,不同的端点类型可能驻留在暴露给不同类型用户的不同网络上。例如,public端点网络可能从Internet上可见,因此客户可以管理他们的云。admin端点网络可能仅限于管理云基础架构的组织内的运营商。internal网络可能仅限于包含OpenStack服务的主机。此外,OpenStack支持多个区域以实现可伸缩性。

Keystone在openstack中提供身份认证、服务目录功能。openstack中的所有其他服务必须向keystone注册其API服务端点endponit,keystone还维护着一个策略引擎,该引擎提供基于规则的访问和服务授权,keystone服务自身由多个提供者组成,它们包括:Identify(身份)、Resource(资源)、Authorizaition(认证)、Token(令牌)、Catalog(目录)、Policy(策略)。keystone有几种主要数据类型:

  • 用户:拥有帐户凭据,与一个或多个项目或域相关联
  • :用户集合,与一个或多个项目或域相关联
  • 项目:OpenStack中的所有权单位,包含一个或多个用户
  • :OpenStack中的所有权单位,包含用户,组和项目
  • 角色:与许多用户 - 项目对相关联的一流元数据。一个3元组,有一个Role,一个Resource和一个Identity
  • 令牌:识别与用户或用户和项目相关联的凭证,一旦用户的凭证已经过验证,令牌服务就会验证和管理用于验证请求的令牌
  • 附加:与用户 - 项目对关联的一桶键值元数据。
  • 规则:描述执行操作的一组要求。给定要检查的匹配列表,只需验证凭据是否包含匹配项。

通用数据模型允许用户和组之间的多对多关系到项目和域;

项目

Projects代表ownershipOpenStack 的基本单元,因为OpenStack中的所有资源都应归特定项目所有。项目本身必须由特定域拥有,因此所有项目名称不是 全局唯一的,但对于其域是唯一的。如果未指定项目的域,则将其添加到默认域。

Domains是项目,用户和组的高级容器。每个都归一个域所有。每个域定义一个名称空间,其中存在API可见的名称属性。Keystone提供了一个默认域名,名称为“默认”。

在Identity v3 API中,属性的唯一性如下:

  • 域名。所有领域的全球独特性。
  • 角色名称。在拥有的域内独一无二。
  • 用户名。在拥有的域内独一无二。
  • 项目名。在拥有的域内独一无二。
  • 团队名字。在拥有的域内独一无二。

由于其容器体系结构,域可以用作委派OpenStack资源管理的方式。如果授予适当的分配,则域中的用户仍可以访问另一个域中的资源。

    学习keystone主要需要理解下面的图,用户使用自己的用户名、密码从keystone获取身份令牌,然后再拿获取的身份令牌通过openstack的api接口找openstack其它各个组件申请资源,各个组件拿到用户申请后会拿着收到的用户令牌去找keystone进行验证,防止伪造令牌或令牌过期。

openstack cinder节点 openstack节点角色_keystone

一、安装配置OpenStack Identity服务

(1)数据库部分

  1. 使用数据库访问客户端以root用户身份连接到数据库服务器:
$ mysql -u root -p
  1. 创建keystone数据库:
MariaDB [(none)]> CREATE DATABASE keystone;
  1. 授予对keystone数据库的适当访问权限:
MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' \
IDENTIFIED BY 'KEYSTONE_DBPASS';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' \
IDENTIFIED BY 'KEYSTONE_DBPASS';

替换KEYSTONE_DBPASS为合适的密码。

  1. 退出数据库访问客户端。

(2)安装配置组件

1.运行以下命令以安装软件包:

# yum install openstack-keystone httpd mod_wsgi

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

2.在keystone.conf中,配置数据库访问和token:

[database]
# ...
connection = mysql+pymysql://keystone:KEYSTONE_DBPASS@controller/keystone

替换KEYSTONE_DBPASS为您为数据库选择的密码。

在该[token]部分中,配置Fernet令牌提供程序:

[token]
# ...
provider = fernet

3.同步Identity服务数据库:

#  keystone-manage db_sync keystone

openstack安装完毕后,通过mysql进入keystone后,执行下面的命令可以查看到openstack对public\internal\admin三个接口分别提供的组件服务url 。

 

openstack cinder节点 openstack节点角色_keystone_02

4.初始化Fernet密钥存储库:

# keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
# keystone-manage credential_setup --keystone-user keystone --keystone-group keystone

5.引导身份服务:

keystone-manage bootstrap --bootstrap-password admin_password --bootstrap-admin-url http://10.37.2.21:5000/v3/   --bootstrap-internal-url http://10.37.2.21:5000/v3/   --bootstrap-public-url http://10.37.2.21:5000/v3/ --bootstrap-region-id RegionOne

(3)配置Apache HTTP服务器

  1. 编辑/etc/httpd/conf/httpd.conf文件并配置ServerName引用控制器节点的 选项:
ServerName 10.37.2.21
  1. 创建/usr/share/keystone/wsgi-keystone.conf文件的链接:
# ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/
  1. 启动Apache HTTP服务并将其配置为在系统引导时启动:
# systemctl enable httpd.service
# systemctl start httpd.service
  1. 配置管理帐户
$ export OS_USERNAME=admin
$ export OS_PASSWORD=ADMIN_PASS
$ export OS_PROJECT_NAME=admin
$ export OS_USER_DOMAIN_NAME=Default
$ export OS_PROJECT_DOMAIN_NAME=Default
$ export OS_AUTH_URL=http://10.37.2.21:5000/v3
$ export OS_IDENTITY_API_VERSION=3

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

1、创建新域xftelecom

openstack domain create --description "xftelecom test" xftelecom

openstack cinder节点 openstack节点角色_openstack cinder节点_03

2、查看新建域
openstack domain list

openstack cinder节点 openstack节点角色_API_04

3、在xftelecom域下创建新的项目my-project

openstack project create --domain xftelecom \
  --description "My Project for xftelecom" myproject

查看对应域名下创建的项目是否成功,默认域名default下创建了admin  demo 与 service三个默认项目。 

 

openstack cinder节点 openstack节点角色_openstack cinder节点_05

4、在xftelecom域下创建myuser用户

openstack user create --email test@189.cn --password xxxxxx myuser

openstack cinder节点 openstack节点角色_openstack cinder节点_06

 5、创建myrule角色并在myuser上引用

openstack cinder节点 openstack节点角色_openstack_07

 查看目前系统已有哪些角色,通过openstack role list查看系统角色

openstack cinder节点 openstack节点角色_API_08

引用角色到myproject的myuser中
openstack role add --project myproject --user myuser myrole

验证角色分配

openstack role assignment list --user myuser --names

openstack cinder节点 openstack节点角色_openstack_09

 

 6、用admin用户申请身份验证令牌

 openstack --os-auth-url http://10.37.2.21:5000/v3   --os-project-domain-name Default --os-user-domain-name Default   --os-project-name admin --os-username admin token issue

openstack cinder节点 openstack节点角色_bootstrap_10

7、用myuser用户申请令牌

首先生成一个环境文件keystonerc_myuser,然后通过source应用环境,最后通过openstack token issue生成myuser用户的token,具体如下图所示。

vi keystonerc_myuser
  unset OS_SERVICE_TOKEN
 export OS_USERNAME=myuser
 export OS_PASSWORD='xxxxxx'
 export PS1='[\u@\h \W(keystone_myuser)]\$ '
 export OS_AUTH_URL=http://10.37.2.21:5000/v3
     
 export OS_PROJECT_NAME=myproject
 export OS_USER_DOMAIN_NAME=Default
 export OS_PROJECT_DOMAIN_NAME=Default
 export OS_IDENTITY_API_VERSION=3source keystonerc_myuser

openstack token issue

openstack cinder节点 openstack节点角色_openstack_11

总结:

    keystone需要先创建项目,项目默认创建在default域中,也可以单独创建其它域然后把项目加入,项目创建完成后需要创建用户,用户创建完成后需要创建角色,然后通过角色实现用户与项目的关联,可以通过角色将将已有用户加入新项目中,也可以通过老角色将老用户加入新项目中。先单独添加用户和项目,再通过角色定义用户属于哪些项目。

    测试用户的token情况时,需要编辑环境变量文件,通过source引用环境变量文件后才能进行测试,否则会报401错误。 

从Kilo版本开始,keystone已经引入了Fernet来加强加密身份验证令牌的方法,有助于解决UUID和PKI令牌引起的系统性能问题,从Mitaka版本开始完全支持Fernet,建议配置keystone时启用Fernet令牌。令牌默认一小时失效,具体配置在/etc/keystone/keystone.conf中的【token】中配置。

openstack cinder节点 openstack节点角色_bootstrap_12