一、基本概念
① keystone的基本功能
keystone作为openstack的Identity Service,提供了用户信息管理和完成各个模块认证服务。
用户信息管理:user/tenant基本信息,tenant管理
认证服务:登录认证,各个组件API的权限控制
② keystone的架构
既然keystone为各个模块提供认证服务,所以各个模块与keystone都有所交互。其中登录认证体现在用户访问各个组件的API时,调用了WSGI框架的authtoken filter,该filter最调用keystone-client ,最终通过keystone验证token,完成对用户的登录认证。如果认证失败,用户将不能访问该API。
keystone在openstack中位置:
3、keystone基本概念介绍
① User
User可简单的理解为用户,用户携带信物(token)能够访问openstack各个服务和资源。
② Tenant
Tenant即租户,早期版本又称为project,它是各个服务中的一些可以访问的资源集合。比如通过nova创建虚拟机时要指定到某个租户中,在cinder创建卷也要指定到某个租户中。用户访问租户的资源前,必须与该租户关联,并且指定该用户在该租户下的角色
③ Role
Role即角色,可以理解为VIP等级,用户的Role越高,在openstack中能访问的服务和资源就更多。
④ Service
Service即服务,如Nova、Glance、Swift、heat、ceilometer等。Nova提供云计算的服务,Glance提供镜像管理服务,Swift提供对象存储服务,heat提供资源编排服务,ceilometer则是提供告警计费服务,cinder提供块存储服务。
⑤ Endpoint
Service的显得太抽象笼统。Endpoint则具体化Service。Endpoint翻译为“端点”,我们可以理解它是一个服务暴露出来的访问点,如果需要访问一个服务,则必须知道他的endpoint,而endpoint一般为url,我们知道了服务的url,我们就可以访问它。Endpoint 的url具有public、private和admin这三种权限。public url可以被全局访问,private url只能被局域网访问,admin url被从常规的访问中分离。
⑥ Token
Token即是信物、令牌,用户通过用户名和密码获取在某个租户下的token,通过token,可以实现单点登录
⑦ Credentials
该术语可以简单的理解为用户和密码。
keystone 里面的概念很多,其中最重要的是 User 和 Tenant 。其它的概念是由于安全和权限等因素引入。
举个形象的例子:
如果把宾馆比作为Tenant,住宿的人就是User ,而宾馆就是 Tenant,宾馆可以提供多种诸如住宿、娱乐、饮食等多种服务(Service),具体来说,住宿是一种具体的服务(Endpoint)。就住宿而言,有普通间和总统套房,如果你的VIP等级(Role)高,你可以享受到豪华的总统套房。入住前,我们需要拿身份证开房(Credential),认证身份证不是冒牌货后(Authenticaiton),会给你一个房卡(Token),然后你拿着房卡,就可以进入房间和享受各种服务。
4、keystone的访问流程
以创建一个虚拟机(server)为例,结合下图简述下keystone在openstack的访问流程。
1)用户Alice通过自己的户名和密码向keystone申请token,keystone认证用户名和密码后,返回token1
2)Alice通过token1发送keystone查询他所拥有的租户,keystone验证token1成功后,返回Alice的所有Tenant
3)Alice选择一个租户,通过用户名和密码申请token,keystone认证用户名、密码、tenant后,返回token2。(其实1、2步仅仅是为了查询tenant,如果已经知道tenant,可以忽略1、2步)
4)Alice通过token2发送创建server的请求,keystone验证token2(包括该token是否有效,是否有权限创建虚拟机等)成功后,然后再把请求下发到nova,最终创建虚拟机
二、安装流程记录
下面将会介绍如何在控制器节点上安装和配置代号为Keystone的OpenStack身份服务。为了实现可伸缩性,此配置部署了Fernet令牌和Apache HTTP服务器来处理请求。
在执行下面的操作之前请确认已经完成了OpenStack安装指南中前提必备安装步骤
1、使用数据库访问客户端以root用户身份连接到数据库服务器:
2、创建keystone数据库:
3、授予对keystone数据库的适当访问权限:
MariaDB [(none)]>GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY '此处填自己的密码';
MariaDB [(none)]>GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY '此处填自己的密码';
4、使用quit退出数据库
安装和配置组件
如需更换openstack国内源,点我
1、安装组件
# yum -y install openstack-keystone httpd mod_wsgi
2、编辑/etc/keystone/keystone.conf文件并完成以下操作:
① 在[database]部分中,配置数据库访问:
注意:
1、此[database]部分中的任何其他选项都是注释状态 2、controller节点必须可解析,即主机名controller-ZJB到IP地址
② 在[token]部分中,配置Fernet token提供者
3、填充身份服务数据库:
# su -s /bin/sh -c "keystone-manage db_sync" keystone
4、初始化Fernet密钥存储库:
# keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
# keystone-manage credential_setup --keystone-user keystone --keystone-group keystone
5、引导身份服务:
( 在Queens发行之前,keystone需要在两个单独的端口上运行以适应Identity v2 API,后者通常在端口35357上运行单独的仅管理员服务。删除v2 API后,keystone可以在同一端口上运行所有接口。)
# keystone-manage bootstrap --bootstrap-password 此处设置管理账户密码 \
--bootstrap-admin-url http://controller-ZJB:5000/v3/ \
--bootstrap-internal-url http://controller-ZJB:5000/v3/ \
--bootstrap-public-url http://controller-ZJB:5000/v3/ \
--bootstrap-region-id RegionOne
配置Apache HTTP server
备份配置文件
1、编辑/etc/httpd/conf/httpd.conf文件并配置 ServerName选项以引用控制器节点:
#vim /etc/httpd/conf/httpd.conf
2、创建一个链接到/usr/share/keystone/wsgi-keystone.conf文件:
# ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/
3、启动Apache HTTP服务,并将其配置为在系统启动时启动:
① 这里启动服务时报错:
报错内容为:
Permission denied: AH00072: make_sock: could not bind to address 0.0.0.0:5000
下面解决问题:
① 检测是否可解析:
测试结果可解析,说明不是解析的问题
② 查看防火墙状态,看是否是防火墙原因
依然报错,说明不是防火墙原因
③ 那可能就是selinux的原因了:
测试发现之前的openstack-selinux并没有安装成功,重新安装openstack-selinux
重启一下系统:
开机之后发现问题已解决:
4、配置管理用户
$ 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://controller:5000/v3
$ export OS_IDENTITY_API_VERSION=3
创建域
报错:openstack domain create不是一个openstack命令
解决:
① 搜集资料有的说是keystone版本不对,看看资料,domain确实是v3版本引入的概念
进入官网发布版本的页面https://releases.openstack.org/#teams,点击自己安装的openstack版本即可查看对应组件的版本信息
查看自己安装的版本:
显然都是最新的版本,自然不存在版本问题
②还有人说是openstackclient和keystone没有安装成功,我也rpm看了,并不是这个原因,不在赘述
③ 确定问题所在:没有source环境变量导致
我们来看一下前面设置的环境变量是否存在:( 截图不能显示完整,不在展示 ),export并没有前面设置的环境变量,于是我意识到了问题所在:因为在shell的命令行下直接使用export定义变量,该变量只在当前的shell或其子shell(BASH)下是有效的,我使用的ssh连接终端,一旦关闭变量也就失效了,再打开新shell时就没有这个变量,需要使用的话还需要重新定义。所以自然找不到OS_AUTH_URL入口
④ 解决办法:( 重新导入 )
# export OS_USERNAME=admin
# export OS_PASSWORD=1790600080
# export OS_PROJECT_NAME=admin
# export OS_USER_DOMAIN_NAME=Default
# export OS_PROJECT_DOMAIN_NAME=Default
# export OS_AUTH_URL=http://controller-ZJB:5000/v3
# export OS_IDENTITY_API_VERSION=3
⑤ 重新看下环境变量( 已经有了 )
创建域、项目、用户、角色:
1、创建一个新域( 虽然 keystone-manage bootstrap已经存在了一个“default”域 ):
$ openstack domain create --description "An Example Domain" example
2、本次尝试安装keystone使用一个service项目其中包含添加到环境中的每个服务的唯一用户。
创建service项目:
openstack project create --domain default --description "Service Project" service
3、常规(非管理员)任务应使用无特权的项目和用户。例如,这里创建的myproject项目和myuser 用户。
创建myproject项目:
注意:
为该项目创建额外用户时,不用重复此步骤。
创建myuser用户:
$openstack user create --domain default --password-prompt myuser
创建myrole角色:
$ openstack role create myrole
将myrole角色添加到myproject项目和myuser用户:
$ openstack role add --project myproject --user myuser myrole
在安装其他服务之前,验证一下身份服务的操作
在控制节点执行这些命令
1、取消设置临时 变量OS_AUTH_URL和OS_PASSWORD环境变量:
$ unset OS_AUTH_URL OS_PASSWORD
2、以admin用户身份请求一个token身份认证:
openstack --os-auth-url http://controller-ZJB:5000/v3 --os-project-domain-name Default --os-user-domain-name Default --os-project-name admin --os-username admin token issue
3、使用前面被创建的myuser用户,请求一个身份认证token
$ openstack --os-auth-url http://controller-ZJB:5000/v3 --os-project-domain-name Default --os-user-domain-name Default --os-project-name myproject --os-username myuser token issue
创建脚本
为admin和demo 项目以及用户创建客户端环境脚本。后面的部分将参考这些脚本来加载用于客户端操作的适当凭据。
注意:
客户端环境脚本的路径不受限制。为方便起见,你可以将脚本放置在任何位置,但是请确保脚本可以访问并且位于适合你部署的安全位置,因为它们确实包含敏感的凭据。
1、创建和编辑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://controller-ZJB:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
2、创建和编辑demo-openrc文件并添加以下内容:
export OS_PROJECT_DOMAIN_NAME=Default
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_NAME=myproject
export OS_USERNAME=myuser
export OS_PASSWORD=MYUSER的密码
export OS_AUTH_URL=http://controller-ZJB:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
使用脚本
要将客户端作为特定项目和用户运行,可以在运行它们之前简单地加载关联的客户端环境脚本。例如:
1、加载admin-openrc文件以使用身份服务的位置以及admin项目和用户凭据填充环境变量:
. admin-openrc