OpenStack学习笔记二(身份认证keystone)

OpenStack学习笔记二(身份认证keystone)

Scroll Down

一、基本概念

① keystone的基本功能

    keystone作为openstack的Identity Service,提供了用户信息管理和完成各个模块认证服务。

    用户信息管理:user/tenant基本信息,tenant管理

    认证服务:登录认证,各个组件API的权限控制

② keystone的架构

    既然keystone为各个模块提供认证服务,所以各个模块与keystone都有所交互。其中登录认证体现在用户访问各个组件的API时,调用了WSGI框架的authtoken filter,该filter最调用keystone-client ,最终通过keystone验证token,完成对用户的登录认证。如果认证失败,用户将不能访问该API。

keystone在openstack中位置:

image.png

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),然后你拿着房卡,就可以进入房间和享受各种服务。

image.png

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用户身份连接到数据库服务器:

image.png

2、创建keystone数据库:

image.png

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 '此处填自己的密码';

image.png

4、使用quit退出数据库

安装和配置组件

如需更换openstack国内源,点我

1、安装组件

# yum -y install openstack-keystone httpd mod_wsgi
image.png

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

image.png

① 在[database]部分中,配置数据库访问:

image.png

注意:

1、此[database]部分中的任何其他选项都是注释状态
 
2、controller节点必须可解析,即主机名controller-ZJB到IP地址

② 在[token]部分中,配置Fernet token提供者

image.png

3、填充身份服务数据库:

# su -s /bin/sh -c "keystone-manage db_sync" keystone
image.png

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

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

image.png

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

image.png

配置Apache HTTP server

备份配置文件
image.png

1、编辑/etc/httpd/conf/httpd.conf文件并配置 ServerName选项以引用控制器节点:

#vim /etc/httpd/conf/httpd.conf
image.png

2、创建一个链接到/usr/share/keystone/wsgi-keystone.conf文件:

# ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/
image.png

3、启动Apache HTTP服务,并将其配置为在系统启动时启动:

① 这里启动服务时报错:
image.png
报错内容为:
Permission denied: AH00072: make_sock: could not bind to address 0.0.0.0:5000

下面解决问题:

① 检测是否可解析:

image.png

测试结果可解析,说明不是解析的问题

② 查看防火墙状态,看是否是防火墙原因

image.png
image.png

依然报错,说明不是防火墙原因

③ 那可能就是selinux的原因了:
image.png

测试发现之前的openstack-selinux并没有安装成功,重新安装openstack-selinux

image.png

image.png

重启一下系统:

image.png

开机之后发现问题已解决:

image.png

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

image.png

创建域

报错:openstack domain create不是一个openstack命令

image.png

解决:

     搜集资料有的说是keystone版本不对,看看资料,domain确实是v3版本引入的概念
image.png

进入官网发布版本的页面https://releases.openstack.org/#teams,点击自己安装的openstack版本即可查看对应组件的版本信息

image.png
image.png

查看自己安装的版本:

image.png

显然都是最新的版本,自然不存在版本问题

 还有人说是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

image.png

⑤ 重新看下环境变量( 已经有了 )

image.png

创建域、项目、用户、角色:

1、创建一个新域( 虽然 keystone-manage bootstrap已经存在了一个“default”域 ):

$ openstack domain create --description "An Example Domain" example

image.png

2、本次尝试安装keystone使用一个service项目其中包含添加到环境中的每个服务的唯一用户。

     创建service项目:

openstack project create --domain default --description "Service Project" service

image.png

3、常规(非管理员)任务应使用无特权的项目和用户。例如,这里创建的myproject项目和myuser 用户。

     创建myproject项目:
image.png
 注意:
为该项目创建额外用户时,不用重复此步骤。
     创建myuser用户:

$openstack user create --domain default --password-prompt myuser

image.png
     创建myrole角色:

$ openstack role create myrole

image.png
     将myrole角色添加到myproject项目和myuser用户:

$ openstack role add --project myproject --user myuser myrole

在安装其他服务之前,验证一下身份服务的操作

    在控制节点执行这些命令

1、取消设置临时 变量OS_AUTH_URL和OS_PASSWORD环境变量:

$ unset OS_AUTH_URL OS_PASSWORD

image.png

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

image.png

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

image.png

创建脚本

    为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

image.png

image.png

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

image.png

使用脚本

    要将客户端作为特定项目和用户运行,可以在运行它们之前简单地加载关联的客户端环境脚本。例如:

1、加载admin-openrc文件以使用身份服务的位置以及admin项目和用户凭据填充环境变量:

. admin-openrc

2、请求一个身份验证token:

image.png