概述

  • OpenStack 标识服务为管理身份验证、授权和服务目录提供了单点集成。标识服务通常是用户与之交互的第一个服务。一旦通过身份验证,最终用户就可以使用他们的身份访问其他 OpenStack 服务。同样,其他 OpenStack 服务也利用 Identity 服务来确保用户是他们所说的人,并发现其他服务在部署中的位置。身份服务还可以与一些外部用户管理系统(如 LDAP)集成。
  • 用户和服务可以通过使用由标识服务管理的服务目录来定位其他服务。顾名思义,服务目录是 OpenStack 部署中可用服务的集合。每个服务可以有一个或多个端点,每个端点可以是三种类型之一:admin、internal 或 public。在生产环境中,出于安全原因,不同的端点类型可能位于暴露给不同类型用户的不同网络上。例如,public API 网络可以从 Internet 上看到,因此客户可以管理他们的云。Admin API 网络可能仅限于管理云基础设施的组织内的操作员。Internal API 网络可能仅限于包含 OpenStack 服务的主机。此外,OpenStack 支持多个区域以实现可伸缩性。- - 在 Identity 服务中创建的区域、服务和端点一起构成了部署的服务目录。部署中的每个OpenStack 服务都需要一个服务条目,其中对应的端点存储在标识服务中。这一切都可以在安装和配置标识服务之后完成。
  • 标识服务包含以下组件:
    • Server
    • 集中式服务器使用 RESTful 接口提供身份验证和授权服务。
    • Drivers
    • 驱动程序或服务后端集成到集中式服务器。它们用于访问 OpenStack 外部存储库中的标识信息,并且可能已经存在于部署 OpenStack 的基础结构中(例如,SQL 数据库或 LDAP服务器)。
    • Modules
    • 中间件模块在使用标识服务的 OpenStack 组件的地址空间中运行。这些模块拦截服务请求,提取用户凭据,并将其发送到集中式服务器进行授权。中间件模块和 OpenStack 组件之间的集成使用 pythonweb 服务器网关接口。
    • Keystone 认证服务中的概念
    • Token(令牌): 用于限定 User-Tenant 对进行 OpenStack API 和资源访问的字符串表示。一个临牌会持续一段时间有效,也可以随时撤销。
    • Credentials(凭证): 用于确认用户身份的数据,例如:Username/Password
    • Authentication(检验): 是确定用户身份的过程。
    • Service(服务): Openstack service,即 Openstack 中运行的组件服务。
    • Endpoint(端点): 一个可以通过网络来访问和定位某个 Openstack service 的地址,通常是一个 URL。使用 RESTful 的设计思想,详见 RESTful_URI 资源。
    • Keystone Client(Keystone CLI): Keystone 的命令行工具,可以完成诸如创建用户,角色,服务和端点等绝大多数的 Keystone 管理功能,是常用的 CLI 接口。
  • Keystone 中管理的对象
    1.User(用户)
    一个使用 OpenStack 资源的人、系统、服务,对 Keystone 而言都是用户。
    2.Group(用户组)
    多个用户的集合则被成为用户组,主要是为了将多个用户作为整体,方便批量管理。
    3.Project(项目/租户)
    早期版本被称为 Tenant(租户),是各服务组件中可访问资源的集合,通常用于同属于某个组织或企业的用户来访问。不同的 Project 之间资源是隔离的,资源可以设置配额。
    4.Domain(域)
    域是 User、Group 和 Project 的资源集合,资源可以设置配额。
    5.Region(区域)
    通常指地域范围(如华南/华北,北京/上海等),在 Keystone 中可理解为一个数据中心。
    6.Service(服务)
    一组相关功能的集合,对应 OpenStack 中的各服务组件,如计算服务(Nova)、网络服务(Neutron)、块存储服务(Cinder)等。
    7.Endpoint(服务访问点)
    代表一个服务的访问地址,一般为 URL 地址,用户通过 URL 来访问服务。一个服务的访问地址有三类:
    (1) Public URL 提供给外部用户访问
    (2) Internal URL(Private URL)提供给内部组件间访问。(3) Admin URL 提供给管理员用户访问。
    8.Catalog(服务目录)
    一张服务列表,记录了各 Service 和 Endpoint 的映射关系,用户要访问某个Service 时,通过 Keystone 的 Catalog 来获取该服务的 Endpoint。
    9.Role(角色)
    角色可以理解为权限等级,用户的权限等级越高,在 OpenStack 中能访问的服务和资源就越多。可以给用户或用户组指定角色。10.Policy(访问控制策略)Policy 是用来控制 User 对 Project 中资源的操作权限,实现了对 User 基于Role 的权限管理。
    11.Assignment(赋权)
    代表一次赋权操作,由 Actor(包括 User、Group)、Target(包括 Project、Domain)、Role 的三元组组成。User 在使用 Project 的资源前,必须要与这个 Project 关联,并且制定 User 在 Project 下的 Role,那么“制定 User 在Project 下的 Role”的这个操作就是一次赋权操作,即 Assignment。
    12.Credentials(凭证)
    用于确认用户身份的凭证,可以是以下形式:
    (1) 用户名和密码。
    (2) 用户名和 API Key(密钥)。
    (3) 一个 Keystone 分配的身份的 Token。
    13.Token(令牌)
    Token 是用户访问资源的凭证,当用户访问资源时需要使用的东西,在Keystone 中主要是引入令牌机制来保护用户对资源的访问。每个 Token 都会对应一个用户的账户信息:User 信息(用户名和密码)、Scope(Token 的有效范围,Project 或 Domain)、Role、Expiration。Token 有四种表现形式:PKI、PKIZ、Fernet、UUID。
    14.Authentication
    确定用户身份的过程。
  • Keystone 的认证流程
    1.User 使用 Credentials(用户名和密码)到 Keystone 验证并获得一个临时的Token 和 Catalog。
    2.User 使用此临时 Token 发送给 Keystone 并获得一个该 User 能访问的Project 列表。
    3.User 再向 Keystone 发送一个请求,告知希望访问的 Project。
    4.Keystone 就会向 User 发送一个管理此 Project 的 Service 列表和允许访问此Project 的 Token(Project-Token,代表该 Token 的 Scope 仅限于此Project)。
    5.User 会通过这个 Service 和 Catalog,找到该 Service 的 Endpoint,并通过Endpoint 找到 Service 的实际位置。
    6.然后 User 再携带 Project-Token 通过 Endpoint 来访问 Service。
    7.Service 会发送此 Project-Token 到 Keystone 做进一步验证。
    8.如果通过验证,Keystone 会返回一系列的确认信息和附加信息(User 希望操作的内容)给 Service。
    9.最后 Service 执行 User 希望操作的内容。
    10.如果后续操作还需要访问 Service 列表中的其它 Service,将重复步骤 5~9。

Controller安装与配置

  1. 准备环境
    1. 使用数据库访问客户端连接到数据库 服务器作为用户:root
      $ mysql -u root -p000000
      
    2. 创建数据库:keystone
      MariaDB [(none)]> CREATE DATABASE keystone;
      
    3. 授予对数据库的适当访问权限:keystone
      MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY '000000';
      MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%'IDENTIFIED BY '000000';
      
    4. 退出数据库访问客户端
  2. 安装和配置组件
    1. 运行以下命令以安装软件包:
      # yum install -y openstack-keystone httpd mod_wsgi
      
    2. 编辑文件并完成以下操作:
      vim /etc/keystone/keystone.conf
      
      [database]
      # ...
      connection = mysql+pymysql://keystone:000000@controller/keystone
      [token] #配置 Fernet 令牌提供程序
      # ...
      provider = fernet
      
    3. 填充标识服务数据库:
      # su -s /bin/sh -c "keystone-manage db_sync" keystone
      
    4. 初始化 Fernet 密钥存储库
      # keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
      # keystone-manage credential_setup --keystone-user keystone --keystone-group keystone
      
    5. 引导标识服务:
      # keystone-manage bootstrap --bootstrap-password 000000 \
      --bootstrap-admin-url http://controller:5000/v3/ \
      --bootstrap-internal-url http://controller:5000/v3/ \
      --bootstrap-public-url http://controller:5000/v3/ \
      --bootstrap-region-id RegionOne
      

      注意:在 Queens 发布之前,keystone 需要在两个单独的端口上运行,以容纳 Identity v2api,后者通常在端口 35357 上运行单独的仅管理服务。删除 v2api 后,keystone 可以在同一端口上为所有接口运行

  3. 配置 Apache HTTP 服务器
    1. 编辑文件并配置引用Controller节点的选项:/etc/httpd/conf/httpd.confServerName
      ServerName controller
      
    2. 创建指向该文件的链接:/usr/share/keystone/wsgi-keystone.conf
      # ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/
      
  4. 完成安装
    1. 启动 并 开机自启 Apache HTTP 服务
      # systemctl enable httpd.service
      # systemctl start httpd.service
      
    2. 临时配置管理员账户的相关变量进行管理:
      $ export OS_USERNAME=admin
      $ export OS_PASSWORD=000000
      $ 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
      

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

The Identity service provides authentication services for each OpenStack service. The authentication service uses a combination of domains, projects, users, and roles.

  1. 尽管“Default”域已经存在于梯形管理中 引导步骤 在本指南中,创建新域(domains)的正确方法是:
    $ openstack domain create --description "An Example Domain" example
    
    +-------------+----------------------------------+
    | Field       | Value                            |
    +-------------+----------------------------------+
    | description | An Example Domain                |
    | enabled     | True                             |
    | id          | 47abd84bb0cd46c686a3deeba7b6c146 |
    | name        | example                          |
    | options     | {}                               |
    | tags        | []                               |
    +-------------+----------------------------------+
    
  2. 本指南使用一个服务项目,其中包含每个用户的唯一用户 添加到环境中的服务。创建项目:service
    $ openstack project create --domain default --description "Service Project" service
    
    +-------------+----------------------------------+
    | Field       | Value                            |
    +-------------+----------------------------------+
    | description | Service Project                  |
    | domain_id   | default                          |
    | enabled     | True                             |
    | id          | c063584f9d0c483fb65f6a82a59a28c5 |
    | is_domain   | False                            |
    | name        | service                          |
    | options     | {}                               |
    | parent_id   | default                          |
    | tags        | []                               |
    +-------------+----------------------------------+
    
  3. 常规(非管理员)任务应使用非特权项目和用户。 例如,本指南创建项目和用户 myprojectmyuser
    • 创建项目:myproject
      $ openstack project create --domain default --description "Demo Project" myproject
      
      +-------------+----------------------------------+
      | Field       | Value                            |
      +-------------+----------------------------------+
      | description | Demo Project                     |
      | domain_id   | default                          |
      | enabled     | True                             |
      | id          | 69e85453f04a4efa97ff369327ddcce2 |
      | is_domain   | False                            |
      | name        | myproject                        |
      | options     | {}                               |
      | parent_id   | default                          |
      | tags        | []                               |
      +-------------+----------------------------------+
      

      注意:为此创建其他用户时,请勿重复此步骤。

    • 创建用户:myuser
      $ openstack user create --domain default --password-prompt myuser
      
      User Password:000000
      Repeat User Password:000000
      +---------------------+----------------------------------+
      | Field               | Value                            |
      +---------------------+----------------------------------+
      | domain_id           | default                          |
      | enabled             | True                             |
      | id                  | 043e43eed51a4c54978d3e32969c9cf7 |
      | name                | myuser                           |
      | options             | {}                               |
      | password_expires_at | None                             |
      +---------------------+----------------------------------+
      
    • 创建角色:myrole
      $ openstack role create myrole
      
      +-------------+----------------------------------+
      | Field       | Value                            |
      +-------------+----------------------------------+
      | description | None                             |
      | domain_id   | None                             |
      | id          | d7240ed278c048008303d3f622bd394d |
      | name        | myrole                           |
      | options     | {}                               |
      +-------------+----------------------------------+
      
    • myrole 角色加入 myproject 项目,myuser 用户:
      $ openstack role add --project myproject --user myuser myrole
      

进行验证

  1. 取消设置临时和环境变量:OS_AUTH_URL OS_PASSWORD
    $ unset OS_AUTH_URL OS_PASSWORD
    
  2. 以用户身份请求身份验证令牌:admin
    $ openstack --os-auth-url http://controller:5000/v3 \
    --os-project-domain-name Default --os-user-domain-name Default \
    --os-project-name admin --os-username admin token issue
    
    Password:000000
    +------------+--------------------------------------------------------+
    | Field      | Value                                                                                                                                                                                   |
    +------------+--------------------------------------------------------+
    | expires    | 2023-03-20T13:02:26+0000                                                                                                                                                                |
    | id         | gAAAAABkGEtShIjo1dg5jKhqxeD06k8g6GCb_Hs1ffzeZong6zG-Fn7U9uWIc6rZ9FAct4h9WwNQJZqPhWos4UQWgOsS2mB5jbf2lqB1X73uZhk0rcfqtySQEWCe_BcEYBLDzFJfHVG9ZqwpXPcywp1S90ezLCzMlyAcgv34RoQRToBf2_mM1cE |
    | project_id | fb91e2d3344343d8a78b118d848fd968                                                                                                                                                        |
    | user_id    | e59d86fc61ec4f869ea42a6b6da4839f                                                                                                                                                        |
    +------------+----------------------------------------------+
    
  3. 正如用户在上一节中创建的那样,请求身份验证令牌:myuser
    $ openstack --os-auth-url http://controller:5000/v3 \
      --os-project-domain-name Default --os-user-domain-name Default \
      --os-project-name myproject --os-username myuser token issue
    
    Password:000000
    +------------+-------------------------------------------+
    | Field      | Value                                                                                                                                                                                   |
    +------------+----------------------------------------------+
    | expires    | 2023-03-20T13:03:36+0000                                                                                                                                                                |
    | id         | gAAAAABkGEuYBHnaUkVLfa8rc3_DaCcBswOvLhoj9N0eyC5vzB_LjDA5tZcKq9o4xphWbitQo8iAUbtkmjsbqJDYLvNyuJbliEX9CR-6dj8pyRxjz2Z3w5zxNVAq9FUWYqo58VaF6lsq4rp9ySsRrqx1DlBPuxGOFWZ6MJHZ2cwqIl6EX6yeTG4 |
    | project_id | 69e85453f04a4efa97ff369327ddcce2                                                                                                                                                        |
    | user_id    | 043e43eed51a4c54978d3e32969c9cf7                                                                                                                                                        |
    +------------+---------------------------------------------------------------+
    

all node 创建 OpenStack 客户端环境脚本

前面的部分使用了环境变量和 命令选项,用于通过客户端与标识服务交互。为了提高客户运营效率, OpenStack 支持简单的客户端环境脚本,也称为 OpenRC 文件。这些脚本通常包含以下常见选项 所有客户端,但也支持独特的选项。

  1. 创建脚本

    为 项目和用户创建客户端环境脚本。本指南的后续部分将参考这些内容 用于为客户端操作加载相应凭据的脚本。admin demo

    1. 创建并编辑文件并添加以下内容:admin-openrc.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=000000
      export OS_AUTH_URL=http://controller:5000/v3
      export OS_IDENTITY_API_VERSION=3
      export OS_IMAGE_API_VERSION=2
      
    2. 创建并编辑文件并添加以下内容:demo-openrc.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=000000
      export OS_AUTH_URL=http://controller:5000/v3
      export OS_IDENTITY_API_VERSION=3
      export OS_IMAGE_API_VERSION=2
      
  2. 使用脚本

    要以特定项目和用户身份运行客户端,只需加载即可 运行它们之前的关联客户端环境脚本。 例如:

    1. 加载文件以填充 具有标识服务位置的环境变量 以及项目和用户凭据:admin-openrc.sh
      $ . ~/admin-openrc.sh
      
    2. 请求身份验证令牌:
      $ openstack token issue
      
      +------------+-----------------------------------------------------------------+
      | Field      | Value                                                           |
      +------------+-----------------------------------------------------------------+
      | expires    | 2023-03-20T13:10:24+0000                                                                                                                                                                |
      | id         | gAAAAABkGE0w0DGFiZz58gAYogk_zN9GgRaGH5qDKPxr3OH7Jyrdc9Z6V9p5Z4M3flpvglkhWjqZ7XyGnlcYrHoXd6tYgi1XbS0hVs0jUJ_NPiUrDf9EVH7Khir3sTqIOqMffSeNxJMs15OxU6IIwEu9uaF86ubvaph4CQYDYfryCD10cMtyEMA |
      | project_id | fb91e2d3344343d8a78b118d848fd968                                                                                                                                                        |
      | user_id    | e59d86fc61ec4f869ea42a6b6da4839f                                                   |
      +------------+-----------------------------------------------------------------+
      
      在这里插入图片描述
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐