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版本
Tenant更改为Project,即租户改为项目
添加了域的概念Domain(对系统资源进行限额)
添加了组的概念Group(为了更好的管理用户,例如linux下对组授权,其组下面的用户也有了相应的权限)
普通用户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_URL
和OS_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 | +------------+-------------------------------------------------------------------------------------------------------------------------+