OpenStack系列(3)

一、身份认证服务概述

OpenStack Identity服务提供单点集成,用于管理身份验证、授权和服务目录。
身份认证服务通常是用户与之交互的第一个服务。经过身份认证后,最终用户可以使用其身份访问其他OpenStack服务。同样,其他OpenStack服务利用身份服务来确保用户是他们所声称的人,并发现部署中的其他服务。Identity服务还可以与某些外部用户管理系统(例如LDAP)集成。

用户和服务可以使用由Identity服务管理的服务目录来查找其他服务。顾名思义,服务目录是OpenStack部署中可用服务的集合。每个服务可以有一个或多个端点,每个端点可以是以下三种类型之一:admin,internal或public。在生产环境中,出于安全原因,不同的端点类型可能驻留在暴露给不同类型用户的不同网络上。例如,公共API网络可能从Internet上可见,因此客户可以管理他们的云。管理API网络可能仅限于管理云基础架构的组织内的运营商。内部API网络可能仅限于包含OpenStack服务的主机。此外,OpenStack支持多个区域以实现可伸缩性。RegionOne区域。在身份服务中创建的区域,服务和端点一起构成部署的服务目录。部署中的每个OpenStack服务都需要一个服务条目,其中相应的端点存储在Identity服务中。这可以在安装和配置Identity服务之后完成。
Identity服务包含以下组件:

  • 服务器 集中式服务器使用RESTful接口提供身份验证和授权服务。
  • 驱动程序 驱动程序或服务后端集成到中央服务器。它们用于访问OpenStack外部存储库中的身份信息,并且可能已存在于部署OpenStack的基础架构中(例如,SQL数据库或LDAP服务器)。
  • 模块 中间件模块在使用Identity服务的OpenStack组件的地址空间中运行。这些模块拦截服务请求,提取用户凭据,并将它们发送到中央服务器以进行授权。中间件模块和OpenStack组件之间的集成使用Python Web服务器网关接口。

OpenStack认证组件KeyStone组件介绍
KeyStone主要有两个功能:用户管理和服务目录
用户管理主要包括:认证和授权
认证方式有四种:即token令牌、账号和密码、服务目录、策略
001.PNG
认证核心术语
用户相关:
User: 能使用OpenStack服务的一个用户。
Project: 之前叫Tenant(租户),是组件服务的一种资源隔离方式
Role: 角色,是User访问指定Project资源的一种权限
Token: 令牌,一个综合的加密认证信息

使用方式:给一个User赋予在指定Porject中一个资源访问的Role角色。

服务目录相关:
Service: OpenStack各组件提供的服务,用于用户访问
Endpoint: 用户访问Service的一个url链接入口
KeyStone配置信息
配置文件:/etc/keystone/keystone.conf
日志文件:/var/log/keystone/keyston.log

二、安装和配置

在OpenStack中,任何组件的部署基本上都按照数据库配置、软件安装、软件配置、数据同步、http配置、权限设置这六个方面来操作。

1. keystone部署

  1. 数据库配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #创建keystone数据库
    CREATE DATEBASE keystone;
    #创建keystone数据库用户,并授权keystone数据库
    GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY 'KEYSTONE_DB123456';
    GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY 'KEYSTONE_DB123456';
    FLUSH PRIVILEGES;

    show grants for keystone;
    show grants for keystone@localhost;
  2. 软件安装

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    apt-get install keystone apache2 libapache2-mod-wsgi

    vim /etc/keystone/keystone.conf

    # 在[database]部分,配置数据库访问
    # 将KEYSTONE_DBPASS替换为数据库密码
    [database]
    #...
    connection =
    mysql+pymysql://keystone:KEYSTONE_DB123456@ctl01/keystone

    #在[token]部分,配置Fernet UUID令牌的提供者
    [token]
    #...
    provider = fernet
  3. 初始化keystone数据库

    1
    su -s /bin/sh -c "keystone-manage db_sync" keystone
  4. keystone配置,初始化Fernet keys

    1
    2
    keystone-manage fernet_set_up --keystone-user keystone --keystone-group keystone
    keystone-manage credential_setup --keystone-user keystone --keystone-group keystone
  5. 启动keystone服务

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 在Queens发布之前,keystone需要在两个独立的端口上运行,以容纳Identity v2 API
    # 该API通常在端口35357上运行单独的仅管理服务。
    # 通过删除v2 API, keystone可以在同一端口上运行所有端口

    keystone-manage bootstrap
    --bootstrap-password KEYSTONE_DB123456
    --bootstrap-admin-url http://ctl01:5000/v3/
    --bootstrap-internal-url http://ctl01:5000/v3/
    --bootstrap-public-url http://ctl01:5000/v3/
    --bootstrap-region-id RegionOne
  6. 验证数据库是否写入数据

    1
    2
    3
    # 应该有44张表
    mysql -uroot -p'KEYSTONE_DB123456' -D keystone -se "show tables;"
    mysql -uroot -p'KEYSTONE_DB123456' -D keystone -se "show tables;" | wc -l

2. 配置Apache HTTP服务器

  1. 编辑配置文件

    1
    2
    3
    4
    # 编辑/etc/httpd/conf/httpd.conf文件,配置ServerName选项为控制节点
    vim /etc/httpd/conf/httpd.conf

    ServerName ctl01
  2. Create a link

    1
    ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/
  3. 重启Apache服务

    1
    service apache2 restart
  4. 配置环境变量

    1
    2
    3
    4
    5
    6
    7
    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://ctl01:5000/v3
    export OS_IDENTITY_API_VERSION=3

3. 创建域、项目、用户和角色

Identity服务为每个OpenStack服务提供身份验证服务。身份验证服务使用域、项目、用户和角色的组合。

  1. 创建example域

    1
    2
    openstack domain create --description "An Example Domain" example
    openstack domain list
  2. 创建service项目

    1
    2
    openstack project create --domain default --description "Service Project" service
    openstack project list
  3. 创建demo用户

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # Create the demo project;
    # 在为此项目创建其他用户时,请勿重复此步骤
    openstack project create --domain default --description "Demo Project" demo

    # Create the demo user;
    openstack user create --domain default --password-prompt demo
    密码:123456a?

    # Create the user role
    openstack role create user

    # Add the user role to the demo project and user(此命令不提供输出);
    openstack role add --project demo --user demo user

    # 可以重复此过程以创建其他项目和用户

4. 验证服务

在安装其他服务前验证Identity服务的操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 取消设置临时变量OS_AUTH_URL和OS_PASSWORD环境变量
unset OS_AUTH_URL OS_PASSWORD

# 作为admin用户,请求身份验证令牌
openstack --os-auth-url http://ctl01:5000/v3
--os-project-domain-name Default
--os-user-domain-name Default
--os-project-name admin
--os-username admin token issue

# 作为demo用户,请求身份验证令牌
openstack --os-auth-url http://ctl01:5000/v3
--os-project-domain-name Default
--os-user-domain-name Default
--os-project-name demo
--os-username demo token issue

5. 创建OpenStack客户端环境脚本

前面的部分使用环境变量和命令选项的组合来通过openstack客户端与Identity服务进行交互。为了提高客户端操作的效率,OpenStack支持简单的客户端环境脚本,也称为OpenRC文件。这些脚本通常包含所有客户端的公共选项,但也支持唯一选项。
创建客户端环境的脚本admin和demo项目和用户。后续将引用这些脚本来加载客户端操作的适当凭据。客户端环境脚本的路径不受限制。为方便起见,可以将脚本放在任何位置,但请确保他们可以访问并位于适合部署的安全位置,因为他们包含敏感凭据。

  1. 创建脚本

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    # 1.编辑文件admin-openrc并添加如下内容:
    cat <<EOF >/home/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://ctl01:5000/v3
    export OS_IDENTITY_API_VERSION=3
    export OS_IMAGE_API_VERSION=2
    EOF

    # 2.编辑文件demo-openrc并添加如下内容:
    cat <<EOF >/home/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=ADMIN_PASS
    export OS_AUTH_URL=http://ctl01:5000/v3
    export OS_IDENTITY_API_VERSION=3
    export OS_IMAGE_API_VERSION=2
    EOF
  2. 使用脚本

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

1
2
3
4
5
6
# 1.加载admin-openrc文件来身份认证服务的环境变量位置和admin项目和用户证书
source /home/admin-openrc
echo $OS_USERNAME

# 2.请求认证令牌
openstack token issue

参考文档

  1. https://www.jianshu.com/p/7e81c339d801