keystone作为openstack的Identity Service,提供了用户信息管理和完成各个模块认证服务。
用户信息管理:user/tenant基本信息,tenant管理
认证服务:登录认证,各个组件API的权限控制
既然keystone为各个模块提供认证服务,所以各个模块与keystone都有所交互。其中登录认证体现在用户访问各个组件的API时,调用了WSGI框架的authtoken filter,该filter最调用keystone-client ,最终通过keystone验证token,完成对用户的登录认证。如果认证失败,用户将不能访问该API。
① 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 。其它的概念是由于安全和权限等因素引入。
以创建一个虚拟机(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,最终创建虚拟机
MariaDB [(none)]>GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY '此处填自己的密码';
MariaDB [(none)]>GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY '此处填自己的密码';
# yum -y install openstack-keystone httpd mod_wsgi
① 在[database]部分中,配置数据库访问:
1、此[database]部分中的任何其他选项都是注释状态 2、controller节点必须可解析,即主机名controller-ZJB到IP地址
② 在[token]部分中,配置Fernet token提供者
# su -s /bin/sh -c "keystone-manage db_sync" keystone
# keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
# keystone-manage credential_setup --keystone-user keystone --keystone-group keystone
( 在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 |
#vim /etc/httpd/conf/httpd.conf
# ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/
① 这里启动服务时报错:报错内容为: Permission denied: AH00072: make_sock: could not bind to address 0.0.0.0:5000
下面解决问题:
① 检测是否可解析:
测试结果可解析,说明不是解析的问题
② 查看防火墙状态,看是否是防火墙原因
依然报错,说明不是防火墙原因
③ 那可能就是selinux的原因了:
测试发现之前的openstack-selinux并没有安装成功,重新安装openstack-selinux
重启一下系统:
开机之后发现问题已解决:
|
$ 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 |
⑤ 重新看下环境变量( 已经有了 )
$ openstack domain create --description "An Example Domain" example
创建service项目:
openstack project create --domain default --description "Service Project" service
创建myproject项目: 注意: 为该项目创建额外用户时,不用重复此步骤。 创建myuser用户:
$openstack user create --domain default --password-prompt myuser
$ openstack role create myrole
将myrole角色添加到myproject项目和myuser用户:
$ openstack role add --project myproject --user myuser myrole
在控制节点执行这些命令
$ unset OS_AUTH_URL OS_PASSWORD
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
$ 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 项目以及用户创建客户端环境脚本。后面的部分将参考这些脚本来加载用于客户端操作的适当凭据。
注意:
客户端环境脚本的路径不受限制。为方便起见,你可以将脚本放置在任何位置,但是请确保脚本可以访问并且位于适合你部署的安全位置,因为它们确实包含敏感的凭据。
|
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 |
|
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 |
要将客户端作为特定项目和用户运行,可以在运行它们之前简单地加载关联的客户端环境脚本。例如:
. admin-openrc