认证服务介绍

OpenStack核心组件原理与应用一文中,我们介绍了OpenStack的架构及安装前的准备工作,这篇我们来完成 OpenStack 第一个服务——认证服务的部署。 上篇“服务与项目名称对照表”中,认证服务的 Service 名字为“Identity Service”,项目名称为“Keystone”,主要功能是为 OpenStack 集群中的其他组件提供认证和授权服务。它能列出所有 OpenStack 服务的端点目录。其它服务将身份认证服务当做通用的统一 API 来使用,所以 Identity Service 是需要最先部署的组件。为了从 Identity Service 服务中获益,其他的 OpenStack 服务需要与它合作。当某个 OpenStack 服务收到来自用户的请求时,该服务询问 Identity 服务,验证该用户是否有权限进行此次请求。

Identity Service 包含的组件:

  • 服务器:一个中心化的服务器使用 RESTful 接口来提供认证和授权服务。
  • 驱动:驱动或服务后端被整合进集中式服务器中。它们被用来访问 OpenStack 外部仓库的身份信息, 并且它们可能已经存在于 OpenStack 被部署在的基础设施(例如,上篇中已经安装的 MariaDB 数据库或 LDAP 服务器)中。
  • 模块:中间件模块运行于使用身份认证服务的 OpenStack 组件的地址空间中。这些模块拦截服务请求,取出用户凭据,并将它们送入中央服务器寻求授权。中间件模块和OpenStack组件间的整合使用 Python Web 服务器网关接口。

当安装 OpenStack 身份服务,用户必须将之注册到其 OpenStack 安装环境的每个服务,身份服务才可以追踪那些已经在 OpenStack 中安装的服务,并在网络中定位它们。

安装和配置

这一章描述如何在控制节点上安装和配置 OpenStack 身份认证服务,代码名称为 keystone,以下操作均在控制节点上完成。出于性能原因,这里配置部署 Fernet 令牌和 Apache HTTP 服务处理请求。 在配置 OpenStack 身份认证服务前,必须创建一个数据库和管理员令牌。 1.创建数据库:

[root@ct1 ~]# mysql -u root -p
MariaDB [(none)]> create database keystone;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY 'KEYSTONE_DBPASS';    #将KEYSTONE_DBPASS改为数据库的真实密码,以下也是。
MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY 'KEYSTONE_DBPASS';
MariaDB [(none)]> flush privileges;

2.生成一个随机值在初始化的配置中作为管理员的令牌

[root@ct1 ~]# openssl rand -hex 10

3.安装并配置组件

[root@ct1 ~]# yum -y install openstack-keystone httpd mod_wsgi
[root@ct1 ~]# vim /etc/keystone/keystone.conf
[DEFAULT]
admin_token = ADMIN_TOKEN   #openssl rand –hex 10 命令生成的随机值
[database]
connection = mysql+pymysql://keystone:KEYSTONE_DBPASS@ct1.vtlab.io/keystone
[token]  #配置Fernet UUID令牌的提供者
provider = fernet
[root@ct1 ~]# su –s /bin/sh –C “keystone-manage db_sync” keystone #初始化身份认证服务的数据库,可以通过 tail -f /var/log/keystone/keystone.log 查看初始化日志
[root@ct1 ~]# keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone  #初始化Fernet keys

4.配置 HTTP 服务

[root@ct1 ~]# vim /etc/httpd/conf/httpd.conf
ServerName ct1.vtlab.io
[root@ct1 ~]# vim /etc/httpd/conf.d/wsgi-keystone.conf
Listen 5000
Listen 35357

<VirtualHost *:5000>
    WSGIDaemonProcess keystone-public processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP}
    WSGIProcessGroup keystone-public
    WSGIScriptAlias / /usr/bin/keystone-wsgi-public
    WSGIApplicationGroup %{GLOBAL}
    WSGIPassAuthorization On
    ErrorLogFormat "%{cu}t %M"
    ErrorLog /var/log/httpd/keystone-error.log
    CustomLog /var/log/httpd/keystone-access.log combined

    <Directory /usr/bin>
        Require all granted
    </Directory>
</VirtualHost>

<VirtualHost *:35357>
    WSGIDaemonProcess keystone-admin processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP}
    WSGIProcessGroup keystone-admin
    WSGIScriptAlias / /usr/bin/keystone-wsgi-admin
    WSGIApplicationGroup %{GLOBAL}
    WSGIPassAuthorization On
    ErrorLogFormat "%{cu}t %M"
    ErrorLog /var/log/httpd/keystone-error.log
    CustomLog /var/log/httpd/keystone-access.log combined

    <Directory /usr/bin>
        Require all granted
    </Directory>
</VirtualHost>

#启动服务
[root@ct1 ~]# systemctl enable httpd.service
[root@ct1 ~]# systemctl start httpd.service

5.创建服务实体和API端点 身份认证服务提供其他服务的目录和位置。每个添加到 OpenStack 中的服务在目录中需要一个 service 实体和一些 API endpoints 。 默认情况下,身份认证服务数据库不包含支持传统认证和目录服务的信息。你必须为身份认证服务创建的临时身份验证令牌用来初始化服务实体和API端点。 你必须使用 "--os-token" 参数将认证令牌的值传递给:command:openstack 命令。类似的,你必须使用"--os-url" 参数将身份认证服务的 URL传递给 OpenStack 命令或者设置OS_URL环境变量。本指南使用环境变量以缩短命令行的长度。 a.设置令牌环

[root@ct1 ~]# export OS_TOKEN=ADMIN_TOKEN
#将ADMIN_TOKEN换为之前生成的认证令牌,例如:
[root@ct1 ~]# export OS_TOKEN=294a4c8a8a475f9b9836

b.配置端点URL

[root@ct1 ~]# export OS_URL=http://ct1.vtlab.io:35357/v3

c.配置认证 API 版本

[root@ct1 ~]# export OS_IDENTITY_API_VERSION=3

d.创建服务实体,在OpenStack 环境中,认证服务管理服务目录。服务使用这个目录来决定环境中的可用服务

[root@ct1 ~]# openstack service create --name keystone --description "OpenStack Identity" identity

e.创建认证服务的API端点,身份认证服务管理了与整个环境相关的 API 端点和目录。服务使用这个目录来决定如何与环境中的其他服务进行通信。 API 端点有三种:admin、internal、public 默认情况下,admin api 端点允许修改用户和租户,public 和 internal api 不允许这些操作。

[root@ct1 ~]# openstack endpoint create --region RegionOne identity public http://ct1.vtlab.io:5000/v3
[root@ct1 ~]# openstack endpoint create --region RegionOne identity internal http://ct1.vtlab.io:5000/v3
[root@ct1 ~]# openstack endpoint create --region RegionOne identity admin http://ct1.vtlab.io:35357/v3

每个添加到OpenStack环境中的服务要求一个或多个服务实体和三个认证服务中的API 端点。

6.创建域、项目、用户和角色 a.创建域 "default"

[root@ct1 ~]# openstack domain create --description "Default Domain" default

b.为进行管理操作,创建 admin 项目、用户和角色

[root@ct1 ~]# openstack project create --domain default --description "Admin Project" admin
[root@ct1 ~]# openstack user create --domain default --password-prompt admin
[root@ct1 ~]# openstack role create admin
#添加admin角色到admin项目和用户上。
[root@ct1 ~]# openstack role add --project admin --user admin admin

创建的任何角色必须映射到每个OpenStack服务配置文件目录下的"policy.json" 文件中。默认策略是给予"admin"角色大部分服务的管理访问权限。 示例: 本示例演示每个服务都包含的独有的service项目。创建 service项目:

[root@ct1 ~]# openstack project create --domain default --description "Service Project" service

常规(非管理)任务应该使用无特权的项目和用户。作为例子,本指南创建 demo 项目和用户:

a. 创建demo项目:

[root@ct1 ~]# openstack project create --domain default --description "Demo Project" demo

b. 创建demo用户:

[root@ct1 ~]# openstack user create --domain default --password-prompt demo

c. 创建 user 角色:

[root@ct1 ~]# openstack role create user

d. 添加 user 角色到demo项目和用户:

[root@ct1 ~]# openstack role add --project demo --user demo user

验证

在安装其他服务前,需要确认身份认证服务已正常运行。 在控制节点上执行如下命令:

  1. 因为安全性的原因,关闭临时认证令牌机制: 编辑 /etc/keystone/keystone-paste.ini 文件,从[pipeline:public_api]、[pipeline:admin_api]、[pipeline:api_v3]部分删除 token_auth 字段。
  2. 重置 OS_TOKEN 和 OS_URL 环境变量
[root@ct1 ~]# unset OS_TOKEN OS_URL
  1. 作为 admin 用户请求认证令牌:
[root@ct1 ~]# openstack --os-auth-url http://ct1.vtlab.io:35357/v3 --os-project-domain-name default --os-user-domain-name default --os-project-name admin --os-username admin token issue
  1. 作为 demo用户请求认证令牌:
[root@ct1 ~]# openstack --os-auth-url http://ct1.vtlab.io:5000/v3 --os-project-domain-name default --os-user-domain-name default --os-project-name demo --os-username demo token issue

使用5000的API端口,只允许对身份认证服务API的常规访问,不能进行管理操作

创建OpenStack客户端环境脚本

前一节中使用环境变量和命令选项的组合通过 "openstack" 客户端与身份认证服务交互。为了提升客户端操作的效率,OpenStack 支持简单的客户端环境变量脚本即 OpenRC 文件。这些脚本通常包含客户端所有常见的选项,当然也支持独特的选项。更多信息,请参考: https://docs.openstack.org/queens/user/ 创建 admin、demo 项目和用户客户端环境变量脚本。本指南接下来会引用这些脚本为客户端操作加载合适的的凭证。

[root@ct1 ~]# 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=ADMIN_PASS
export OS_AUTH_URL=http://ct1.vtlab.io:35357/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
#将 ADMIN_PASS替换为认证服务中为admin用户设置的密码
[root@ct1 ~]# 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=DEMO_PASS
export OS_AUTH_URL=http://ct1.vtlab.io:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
#将DEMO_PASS替换为认证服务中为demo用户设置的密码

加载环境变量脚本: 使用特定租户和用户运行客户端,你可以在运行之前简单地加载相关客户端脚本:

  1. 加载 admin-openrc文件来配置身份认证服务的环境变量和 admin项目及用户证书:
[root@ct1 ~]# source admin-openrc  #或者 . admin-openrc
  1. 请求认证令牌:
[root@ct1 ~]# openstack token issue

下期预告

认证服务 Keystone 的部署及基础应用已经介绍完了,下期来创建我们的镜像服务。