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
代表ownership
OpenStack 的基本单元,因为OpenStack中的所有资源都应归特定项目所有。项目本身必须由特定域拥有,因此所有项目名称不是 全局唯一的,但对于其域是唯一的。如果未指定项目的域,则将其添加到默认域。
域
Domains
是项目,用户和组的高级容器。每个都归一个域所有。每个域定义一个名称空间,其中存在API可见的名称属性。Keystone提供了一个默认域名,名称为“默认”。
在Identity v3 API中,属性的唯一性如下:
- 域名。所有领域的全球独特性。
- 角色名称。在拥有的域内独一无二。
- 用户名。在拥有的域内独一无二。
- 项目名。在拥有的域内独一无二。
- 团队名字。在拥有的域内独一无二。
由于其容器体系结构,域可以用作委派OpenStack资源管理的方式。如果授予适当的分配,则域中的用户仍可以访问另一个域中的资源。
学习keystone主要需要理解下面的图,用户使用自己的用户名、密码从keystone获取身份令牌,然后再拿获取的身份令牌通过openstack的api接口找openstack其它各个组件申请资源,各个组件拿到用户申请后会拿着收到的用户令牌去找keystone进行验证,防止伪造令牌或令牌过期。
一、安装配置OpenStack Identity服务
(1)数据库部分
- 使用数据库访问客户端以
root
用户身份连接到数据库服务器:
$ mysql -u root -p
- 创建
keystone
数据库:
MariaDB [(none)]> CREATE DATABASE keystone;
- 授予对
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
为合适的密码。
- 退出数据库访问客户端。
(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 。
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服务器
- 编辑
/etc/httpd/conf/httpd.conf
文件并配置ServerName
引用控制器节点的 选项:
ServerName 10.37.2.21
- 创建
/usr/share/keystone/wsgi-keystone.conf
文件的链接:
# ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/
- 启动Apache HTTP服务并将其配置为在系统引导时启动:
# systemctl enable httpd.service
# systemctl start httpd.service
- 配置管理帐户
$ 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
2、查看新建域
openstack domain list
3、在xftelecom域下创建新的项目my-project
openstack project create --domain xftelecom \
--description "My Project for xftelecom" myproject
查看对应域名下创建的项目是否成功,默认域名default下创建了admin demo 与 service三个默认项目。
4、在xftelecom域下创建myuser用户
openstack user create --email test@189.cn --password xxxxxx myuser
5、创建myrule角色并在myuser上引用
查看目前系统已有哪些角色,通过openstack role list查看系统角色
引用角色到myproject的myuser中
openstack role add --project myproject --user myuser myrole
验证角色分配
openstack role assignment list --user myuser --names
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
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
总结:
keystone需要先创建项目,项目默认创建在default域中,也可以单独创建其它域然后把项目加入,项目创建完成后需要创建用户,用户创建完成后需要创建角色,然后通过角色实现用户与项目的关联,可以通过角色将将已有用户加入新项目中,也可以通过老角色将老用户加入新项目中。先单独添加用户和项目,再通过角色定义用户属于哪些项目。
测试用户的token情况时,需要编辑环境变量文件,通过source引用环境变量文件后才能进行测试,否则会报401错误。
从Kilo版本开始,keystone已经引入了Fernet来加强加密身份验证令牌的方法,有助于解决UUID和PKI令牌引起的系统性能问题,从Mitaka版本开始完全支持Fernet,建议配置keystone时启用Fernet令牌。令牌默认一小时失效,具体配置在/etc/keystone/keystone.conf中的【token】中配置。