1.3 OpenStack验证服务KeyStone

Keystone(OpenStack Identity Service)是OpenStack框架中,负责身份验证、服务规则和服务令牌的功能,它实现了OpenStack的Identity API。

Keystone类似一个服务总线, 或者说是整个OpenStack框架的注册中心,其他服务通过keystone来注册其服务的Endpoint(服务访问的URL),任何服务之间相互的调用,需要经过Keystone的身份验证,来获得目标服务的Endpoint来找到目标服务。

Keystone概述

Keystone提供了以下两个主要的功能:

  • 用户与认证:用户权限与用户行为跟踪;
  • 服务目录:提供一个服务目录,包括所有服务项与相关Api的端点。

下面我们从这两个主要功能来了解Keystone的概念,和Keystone在Openstack中的作用。

  1. Keystone用户与认证

    Keystone为各个Openstack组件提供用户和认证服务,各个组件都必须与Keystone进行交互。比如登陆认证是用户在访问Openstack各个组件中的API时,必须通过Keystone的用户名和密码验证,最终通过Kyestone验证获取token,完成对用户的登陆认证。如果认证失败,该用户将不能访问该API。

User

User即用户,它是用一个数字代表使用OpenStack云服务的一个人、系统、或服务。身份验证服务将会验证传入的由用户声明将调用的请求。用户如果已经登录,可就能分配令牌(tokens)访问资源。 用户可能被直接分配给特定的租户,用户行为被包含在租户(tenant),Users通过认证信息(credentials,如密码、API Keys等)进行验证。

Credentials

Credentials即证书,用户可以通过身份验证,保证数据通常只被一个用户属于或拥有(因为没有其他人应该知道数据)。

以下为证书的例子: 一个匹配的用户名和密码 一个匹配的用户名和API键 一个身份认证令牌

Authentication

Authentication即认证,认证是确认身份或识别真实性的行为。身份服务通过与用户的一组声明验证以确认传入的请求是由该用户声明过的。这些声明被初始化为一组证书 (username&password, or username and API key)。初始确认后,身份服务将会给用户发布一个确认身份的令牌(Token),在用户随后的请求中可以使用这个令牌授权访问。

Token:

Token即令牌,是一个用户访问资源的任意文本,每一个令牌都有一个范围,描述了可以访问哪些资源。令牌可能随时撤消,是有有效期的。身份认证是支持令牌认证的,它的目的为在未来支持额外的协议。其目的是为了让它首先成为一种集成服务,而不是一种渴望成为丰富的身份存储和管理的解决方案。 T Tenant:

Tenant即租户,它是各个服务中的一些可以访问的资源集合。它是一个容器,用于组织和隔离资源,或标识对象。一个租户可以一个客户、账户、组织、项目的映射。例如,在Nova中一个tenant可以是一些机器,在Swift和Glance中一个tenant可以是一些镜像存储,在Neutron中一个tenant可以是一些网络资源。Users默认的总是绑定到某些tenant上。

Role:

Role即角色,Roles代表一组用户可以访问的资源权限,例如Nova中的虚拟机、Glance中的镜像。Users可以被添加到任意一个全局的或租户内的角色中。在全局的role中,用户的role权限作用于所有的租户,即可以对所有的租户执行role规定的权限;在租户内的role中,用户仅能在当前租户内执行role规定的权限。

Domain:

在KeyStone V3版本将 Tenant 改为 Project 并在其上添加 Domain 的概念,这更加符合现实世界和云服务的映射。利用 Domain 实现真正的多租户(multi-tenancy)架构,Domain 担任 Project 的高层容器。云服务的客户是 Domain 的所有者,他们可以在自己的 Domain 中创建多个 Projects、Users、Groups 和 Roles。通过引入 Domain,云服务客户可以对其拥有的多个 Project 进行统一管理,而不必再向过去那样对每一个 Project 进行单独管理。

Group:

Group 是一组 Users 的容器,可以向 Group 中添加用户,并直接给 Group 分配角色,那么在这个 Group 中的所有用户就都拥有了 Group 所拥有的角色权限。通过引入 Group 的概念,Keystone V3 实现了对用户组的管理,达到了同时管理一组用户权限的目的。这与 V2 中直接向 User/Project 指定 Role 不同,使得对云服务进行管理更加便捷。 Domain、Group、Project、User 和 Role 的关系图

如图 2 所示,在一个 Domain 中包含 3 个 Projects,可以通过 Group1 将 Role Sysadmin直接赋予 Domain,那么 Group1 中的所有用户将会对 Domain 中的所有 Projects 都拥有管理员权限。也可以通过 Group2 将 Role Engineer 只赋予 Project3,这样 Group2 中的 User 就只拥有对 Project3 相应的权限,而不会影响其它 Projects。

  1. Keystone服务目录

    上文说过,Keystone除了用户管理相关的支撑,还有一个重要的作用是一个服务目录。KeyStone为Openstack各个服务提供了一个REST API端点列表。

  2. Service Service即服务,如Nova、Glance、Swift。根据前三个概念(User,Tenant和Role)一个服务可以确认当前用户是否具有访问其资源的权限。但是当一个user尝试着访问其租户内的service时,他必须知道这个service是否存在以及如何访问这个service,这里通常使用一些不同的名称表示不同的服务。在上文中谈到的Role,实际上也是可以绑定到某个service的。

  3. Endpoint Endpoint,翻译为“端点”,我们可以理解它是一个服务暴露出来的访问点,如果需要访问一个服务,则必须知道他的endpoint。因此,在keystone中包含一个endpoint模板(endpoint template,在安装keystone的时候我们可以在conf文件夹下看到这个文件),这个模板提供了所有存在的服务endpoints信息。一个endpoint template包含一个URLs列表,列表中的每个URL都对应一个服务实例的访问地址,并且具有public、private和admin这三种权限。public url可以被全局访问(如http://compute.example.com),private url只能被局域网访问(如http://compute.example.local),admin url被从常规的访问中分离。

KeyStone部署

OpenStack中所有服务的安装可以说是最简单的。复杂的就在于本身的配置文件的修改和与Keystone相关的配置。还记得上面说的,OpenStack的每个组件如果能够使用都必须在Keystone创建Service和Endpoint吗?好的,我们开始。

  1. 安装keystone
[root@linux-node1 ~]# yum install -y openstack-keystone httpd mod_wsgi memcached python-memcached
  1. 设置Memcache开启启动并启动Memcached
#keystone使用Memcached来缓存验证后生成的token。
[root@linux-node1 ~]# systemctl enable memcached.service
[root@linux-node1 ~]# vim /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 192.168.56.11,::1"
[root@linux-node1 ~]# systemctl start memcached.service
  1. Keystone配置

KeyStone的配置只需要修改/etc/keystone/keystone.conf即可,涉及Admin Token和Mysql连接,其它均使用默认配置即可。所有配置文件都存放到/etc/keystone(项目名)目录下。日志都存放在/var/log/keystone(项目名)目录下,其它项目也是如此。 好的,我们暂停一下,在后面的部署中,我们会使用这样的方式列出配置,未列出的配置,保持默认不进行修改,除非特别提示到。另外要注意配置的位置,OpenStack所有服务都会有[DEFAULT] [dtabase] 这样的配置部分,请在文中列出的配置部分里面进行配置,切记!。因为确实有相同的配置存在在不同的配置端的情况,这样例外情况,如果没有按要求配置,可能就无法正常运行。

  • 配置KeyStone数据库

    OpenStack中所有服务的数据库同步都需要依赖与配置文件中的数据库连接的配置,所以必须先修改完毕配置文件后,再进行数据库的初始化操作。

    [root@linux-node1 ~]# vim /etc/keystone/keystone.conf
    [database]
    connection = mysql+pymysql://keystone:keystone@192.168.56.11/keystone
    
  • 设置Token和Memcached

在之前的KeyStone版本由于所有的API通信都要请求Keystone来生产Token,之前是存放在MySQL表里,导致表特别大,经常需要手动清理,而且性能下降,现在新的版本我们可以存放在memcache里面了。

[token]
provider = fernet
  • 同步数据库:
[root@linux-node1 ~]# su -s /bin/sh -c "keystone-manage db_sync" keystone

小提示:为什么要使用keystone用户来同步数据呢,因为同步操作会生产日志/var/log/keystone/keystone.log,如果使用root用户,那么生成的文件权限为root用户,keystone启动的时候没有权限读取该文件,会无法启动。如果你的同步执行有问题,那么可以查看日志获取详细的错误信息。

  • 验证数据库创建是否正常:
[root@linux-node1 ~]# mysql -h 192.168.56.11 -ukeystone -pkeystone -e "use keystone;show tables;"
  1. 初始化fernet keys

    生成完毕之后,会创建/etc/keystone/fernet-keys目录

    [root@linux-node1 ~]# keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
    [root@linux-node1 ~]# keystone-manage credential_setup --keystone-user keystone --keystone-group keystone
    
  2. 初始化keystone

还记得上面说的Openstack的每个组件都必须在Keystone上进行注册。当然也包括Keystone本身。身份认证服务管理了一个与您环境相关的 API 端点的目录。服务使用这个目录来决定如何与您环境中的其他服务进行通信。 OpenStack使用三个API端点变种代表每种服务:admin,internal和public。默认情况下,管理API端点允许修改用户和租户而公共和内部APIs不允许这些操作。在生产环境中,处于安全原因,变种为了服务不同类型的用户可能驻留在单独的网络上。 对实例而言,公共API网络为了让顾客管理他们自己的云在互联网上是可见的。管理API网络在管理云基础设施的组织中操作也是有所限制的。内部API网络可能会被限制在包含OpenStack服务的主机上。此外,OpenStack支持可伸缩性的多区域。为了简单起见,我们这里均使用一个IP地址。192.168.56.11。

[root@linux-node1 ~]# keystone-manage bootstrap --bootstrap-password admin \
 --bootstrap-admin-url http://192.168.56.11:5000/v3/ \
 --bootstrap-internal-url http://192.168.56.11:5000/v3/ \
 --bootstrap-public-url http://192.168.56.11:5000/v3/ \
 --bootstrap-region-id RegionOne
  1. 验证Keystone配置

下面我将上面进行的配置列出来,供读者进行比对,配置应该和本文保持一致。

[root@linux-node1 ~]# grep "^[a-z]" /etc/keystone/keystone.conf 
connection = mysql+pymysql://keystone:keystone@192.168.56.11/keystone
provider = fernet
  1. KeyStone启动

OpenStack Keystone使用Apache来进行启动,提高了性能。 配置ServerName,注意一定要配置,不然会有奇怪的问题出现。

[root@linux-node1 ~]# vim /etc/httpd/conf/httpd.conf
ServerName 192.168.56.11:80
创建配置文件
[root@linux-node1 ~]# ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/

启动keystone,并查看端口。

[root@linux-node1 ~]# systemctl enable httpd.service
[root@linux-node1 ~]# systemctl start httpd.service
[root@linux-node1 ~]# netstat -ntlp | grep httpd
tcp6       0      0 :::5000                 :::*              LISTEN      3408/httpd
tcp6       0      0 :::80                   :::*              LISTEN      3408/httpd
现在,如果你的Keystone没有正常的监听端口,那么请查看日志,后期我们会不停的强调读者通过查看日志来排查问题,OpenStack的日志是值得信赖的。如果你想让朋友帮助解决问题,请不要使用日志截图的方式,请发送完整的日志。

Keystone权限管理

我们已经成功的运行了Keystone服务,要提供身份认证服务,需要使用域、项目、用户和角色的组合。 首先我们要创建一个超级管理员用户、角色和项目。默认情况下。在创建用户之前,我们需要连接到Keystone。问题来了,现在我们没有任何用户,我们如何登录KeyStone呢?这个时候ADMIN_TOKEN就可以帮忙了,我们可以使用这个超级密码直接登录到KeyStone上,所以说,一定要保护好你的ADMIN_TOKEN。 好的,现在我们要连接到Keystone上,有两种方法:

  • 使用--os-token等参数的方式(就是通过参数的方式)
  • 使用环境变量(将参数设置为环境变量,keystone直接读取环境变量)

  • 设置环境变量

在这里,我们使用三个环境变量用来连接keystone。admin用户和密码就是我们前面使用keystone-manage bootstrap初始化的。

[root@linux-node1 ~]# 
export OS_USERNAME=admin
export OS_PASSWORD=admin
export OS_PROJECT_NAME=admin
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_DOMAIN_NAME=Default
export OS_AUTH_URL=http://192.168.56.11:5000/v3
export OS_IDENTITY_API_VERSION=3

请注意环境变量的问题,不要打开新的会话进行操作。

  1. 创建实验用的demo项目、用户和角色

下面我们创建一个普通用户和租户,我们下面的实验均使用这个普通用户进行Openstack的管理。

# openstack domain create --description "An Example Domain" example
# openstack project create --domain default --description "Demo Project" myproject
# openstack user create --domain default --password-prompt myuser
# openstack role create myrole
# openstack role add --project myproject --user myuser myrole

在创建用户的时候可以使用--password-prompt,然后根据提示输入密码

  1. 创建一个服务的项目

    OpenStack服务也需要使用用户名、租户和角色,用来访问OpenStack的各个服务。

    # openstack project create --domain default --description "Service Project" service
    
  2. 创建各个服务连接Keystone的账户 后面我们部署的其它服务都需要到Keystone上进行认证,所以现在就可以提前将各个服务的账号创建上。并全部加入service项目。

    • 创建glance用户

      # openstack user create --domain default --password glance glance
      # openstack role add --project service --user glance admin
      
    • 创建nova用户

      # openstack user create --domain default --password nova nova
      # openstack role add --project service --user nova admin
      
    • 创建placement用户

      # openstack user create --domain default --password placement placement
      # openstack role add --project service --user placement admin
      
    • 创建Neutron用户

      # openstack user create --domain default --password neutron neutron
      # openstack role add --project service --user neutron admin
      
    • 创建cinder用户
      # openstack user create --domain default --password cinder cinder
      # openstack role add --project service --user cinder admin
      

验证Keystone安装

首先,我们需要取消OS_TOKEN和OS_URL这两个变量。这两个变量是用于引导我们创建Admin用户和Keystone服务自身Service和Endpoint注册时候的用的,现在已经不需要了。

[root@linux-node1 ~]# unset OS_AUTH_URL OS_PASSWORD

测试admin用户

密码为admin,需要输入两次,如果能正常获取token说明配置成功。

[root@linux-node1 ~]# openstack --os-auth-url http://192.168.56.11:5000/v3 \
--os-project-domain-name Default --os-user-domain-name Default \
--os-project-name admin --os-username admin token issue
Password:
…
#密码为admin,需要输入两次,如果能正常获取token说明配置成功。

测试myuser用户

密码为你设置的,需要输入两次,如果能正常获取token说明配置成功。

[root@linux-node1 ~]# openstack --os-auth-url http://192.168.56.11:5000/v3 \
--os-project-domain-name Default --os-user-domain-name Default \
--os-project-name myproject --os-username myuser token issue
Password:
…

环境变量脚本配置

使用Keystone命令有两种方式,第一种就像上面。我们使用指定--os-username、--os-password和--os-password这样的选项来进行操作,但是这样在我们日常操作中会比较麻烦。第二种方式就是使用环境变量,这样可以避免每次使用都要制定变量。我们将这些常用的变量设置为环境变量。 下面建立环境变量为其它服务部署和配置使用

  1. 设置admin环境变量脚本
[root@linux-node1 ~]# vim /root/admin-openstack.sh
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://192.168.56.11:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
  1. 创建普通用户的环境变量脚本
[root@linux-node1 ~]# vim /root/demo-openstack.sh
export OS_PROJECT_DOMAIN_NAME=Default
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_NAME=myproject
export OS_USERNAME=myuser
export OS_PASSWORD=123.com
export OS_AUTH_URL=http://192.168.56.11:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2

创建完毕变量后,在后期使用某个账户的权限,只需要source一下就可以使用,例如:

[root@linux-node1 ~]# source /root/admin-openstack.sh
[root@linux-node1 ~]# openstack token issue

测试demo用户,是否能够获取token

[root@linux-node1 ~]# source /root/demo-openstack.sh 
[root@linux-node1 ~]# openstack token issue
Copyright © 赵班长@新运维社区 2019 all right reserved,powered by Gitbook该文件修订时间: 2020-02-04 21:28:43

results matching ""

    No results matching ""