3.2 KeyStone服务部署

摘要
在 OpenStack 的各个服务中,KeyStone 扮演着核心的身份认证角色。本节我们将部署 KeyStone 服务,为整个云平台建立起统一的“通行证”机制。

实验架构

  • 虚拟机1:控制节点
    • 操作系统: CentOS 7.9
    • 配置: 4 CPU,40GB+ 硬盘,8GB 内存
    • 角色: 控制节点、网络节点和对象存储节点
  • 虚拟机2:计算节点
    • 操作系统: CentOS 7.9
    • 配置: 2 CPU,40GB+ 硬盘,4GB 内存
    • 角色: 计算节点、网络节点、对象存储和块存储节点

假如名为 Alice 的用户想要在 OpenStack 平台上创建虚拟机,她需要先向 KeyStone 发送账号和密码进行 身份验证。KeyStone 通过验证后,会给用户 Alice 返回 证书(令牌/Token) 和访问具体服务的 端点(Endpoint),接下来用户携带证书通过端点去访问目标服务……

提示:什么是 Endpoint?
端点(Endpoint)本质上就是一个网络访问地址(URL)。在 OpenStack 中,不同的服务(如计算、镜像等)都会在 KeyStone 中注册自己的 Endpoint,方便其他组件或用户找到并调用它们。

在安装配置 KeyStone 前,需要先在 MariaDB 中为其创建专属数据库,并进行相应的权限配置。

连接到数据库服务器:

以 root 用户身份连接,输入在环境准备阶段设置的 MariaDB 密码。

bash

mysql -u root -p

创建 keystone 数据库:

sql

CREATE DATABASE keystone;

为 keystone 数据库授权:

执行以下命令,授予 keystone 用户相关权限:

sql

GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY 'keystone';

命令解释
  1. GRANT ALL PRIVILEGES

    • 意思是:授予所有权限。
    • 也就是赋予增、删、改、查、建表、删表等几乎所有的操作能力。
  2. ON keystone.*

    • 意思是:把权限作用在哪个地方?
    • 第一个 keystone:代表是名为 keystone数据库
    • .*:代表这个数据库里的所有表
  3. TO 'keystone'@'%'

    • 意思是:把权限给谁?
    • 第二个 'keystone':代表数据库系统的用户名
    • @'%':这是一个安全限制,意思是“该用户能从所有网络位置访问”。
  4. IDENTIFIED BY 'keystone'

    • 意思是:验证身份的密码是什么?
    • 第三个 'keystone':代表这个用户的密码。(在实验环境中,为了好记,通常把密码设置得和组件名字一样;在企业生产环境,这里会是一串复杂的乱码密码)。
    • 特殊动作:在 MariaDB 中,如果这个用户之前不存在,加上这条 IDENTIFIED BY 语句,系统会自动创建这个用户并同时设置好密码

退出数据库:

sql

exit

安装 keystone 相关软件包:

bash

yum install openstack-keystone httpd mod_wsgi -y

修改配置文件 /etc/keystone/keystone.conf

编辑配置文件,在相应的段落中添加或修改内容以完成配置。

[database] 标签下,配置数据库访问路径:

ini

[database]
# ...
connection = mysql+pymysql://keystone:keystone@controller/keystone

[token] 标签下,配置 Fernet 认证的令牌提供者:

ini

[token]
# ...
provider = fernet

同步认证服务数据库:

初始化 KeyStone 数据库表结构:

bash

su -s /bin/sh -c "keystone-manage db_sync" keystone

验证数据库表:

检查同步是否成功,如果在返回的结果中看到了相应的表,则说明同步完成。

bash

mysql -u keystone -p keystone -e "use keystone; show tables;"

初始化 Fernet 密钥存储库:

KeyStone 使用 Fernet 令牌来进行身份验证。我们需要先初始化这些令牌的密钥库。

bash

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

提示:什么是 Fernet 令牌?
Fernet 是一种安全、轻量级的令牌格式。它不需要像早期的令牌格式那样在数据库中大量存储,因此运行效率更高。这两条命令会自动生成用于加密令牌的密钥。
提示:Fernet 单词含义
Fernet(菲奈特)来源于意大利,本意是一种源自意大利的苦味草本利口酒(也可以理解为一种西式“药酒”)。

初始化 KeyStone 服务:

现在我们将初始化 KeyStone 的核心配置,相当于创建一个“超级管理员”。

bash

keystone-manage bootstrap --bootstrap-password admin \
--bootstrap-admin-url http://controller:5000/v3 \
--bootstrap-public-url http://controller:5000/v3 \
--bootstrap-internal-url http://controller:5000/v3 \
--bootstrap-region-id RegionOne

命令解释
  • --bootstrap-password admin:把管理员(admin)的密码设置为 admin
  • --bootstrap-*-url:设置身份认证服务的各个网络访问地址(端点)。
  • --bootstrap-region-id RegionOne:指定服务所在的区域为 RegionOne

KeyStone 默认是一个 Python 编写的 Web 应用程序,在生产环境中,我们通常使用 Apache HTTP 服务(配合 mod_wsgi)来运行它,以获得更好的性能和稳定性。

1)配置 Apache 服务器名称:

编辑 /etc/httpd/conf/httpd.conf 文件,搜索 ServerName,并将其配置为 controller 节点。

你可以直接在文件末尾添加以下内容,或者找到被注释的 ServerName 修改:

apache

ServerName controller

2)创建 KeyStone 的虚拟主机配置文件链接:

让 Apache 知道如何处理发给 KeyStone 的请求。在 /etc/httpd/conf.d/ 目录下创建一个指向 KeyStone WSGI 配置的链接:

bash

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

3)启动并设置 HTTP 服务开机自启:

命令解释
  • systemctl start <服务名> :启动服务
  • systemctl enable <服务名> :设置服务为开机自动启动

验证状态是否为启动:

4)配置管理员环境变量:

为了方便在命令行中操作 OpenStack(不需要每次敲命令都输入长长的参数),我们将管理员的账号信息配置成临时环境变量。

直接在命令行中执行以下命令(注意:这里的密码是之前设置的 admin):

bash

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://controller:5000/v3
export OS_IDENTITY_API_VERSION=3
环境变量的秘密
在终端中执行这些 export 命令后,当你运行 openstack 开头的命令时,系统会自动读取这些变量完成身份验证。这使得我们接下来的操作更加省力!

在 OpenStack 中管理权限,就像管理一家公司:

  • 域(Domain):相当于一个大集团或分公司。
  • 项目(Project/Tenant):相当于公司里的部门。
  • 用户(User):就是部门里的具体员工。
  • 角色(Role):代表员工的职位(如经理、普通员工),决定了他们能做什么。

1)查看现有的域:

当前系统中应该已经存在一个名为 Default 的默认域。

2)创建一个新的测试域 xdxy

3)创建一个名为 service 的项目:

在 OpenStack 中,各个独立的服务(如我们之后要安装的计算服务 Nova、网络服务 Neutron 等)都需要有自己的账号来互相通信。我们把它们统一放到 service 项目下进行统一管理。

4)创建班级与学生账号:

在实际使用云平台时,出于安全考虑,普通的操作不应该在超级管理员(root/admin)下进行。我们可以模拟创建一个学院的实训小组,用来做后面的实验练习。

创建实训小组项目 cloud_computing_group

这就好比我们在云平台上划分出了一个叫“云计算小组”的项目。

创建学生测试账号 monitor

我们要为刚刚的实训小组安排一个同学去操作,我们就叫他 monitor(班长)。 执行命令后,系统会提示你设置密码,为了方便实验,我们直接输入 monitor 作为密码。

创建职位角色 student

我们需要定义一个身份标签,也就是在云平台里的“学生”身份。

将用户、角色和项目绑定在一起:

这行命令的意思是:在 lab_group(实训小组)项目中,赋予 monitor(班长)用户以 student(学生)的身份角色,这样班长就可以在小组项目里顺利开展接下来的实验了。

bash

openstack role add student --project cloud_computing_group --user monitor

资源创建成功
到这里,我们不仅有了具有最高权限的系统管理员账号,还拥有了一个专属的“实训小组”和用于常规实验的“学生班长”账号。

接下来,我们要检查刚刚配置的 KeyStone 能不能正常发放“通行证”(令牌)。

1)清除管理员环境变量:

为了公平测试,我们先取消掉刚才导入的管理员临时环境变量,避免干扰。

bash

unset OS_AUTH_URL 
unset OS_PASSWORD

2)测试管理员获取令牌:

手动指定参数,请求超级管理员 admin 的身份令牌。 执行命令后会要求输入密码,请输入 admin

bash

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

如果屏幕上打印出一个包含 idexpires 等字段的长长表格,说明管理员的登录验证完全成功。

3)测试学生账号获取令牌:

同理,我们要测试一下刚刚创建的学生(班长)能不能获取自己的令牌,顺便测试他能不能访问自己的小组(项目)。 执行命令后输入刚才设置的密码 monitor

bash

openstack --os-auth-url http://controller:5000/v3 \
  --os-project-domain-name xdxy --os-user-domain-name xdxy \
  --os-project-name cloud_computing_group --os-username monitor token issue

恭喜!KeyStone 部署大功告成
如果两个账号都能正常签发身份令牌(Token),证明 KeyStone 认证服务已经完美投产运行!整个云平台的“户籍管理与门禁系统”被你成功建立起来了。

请求超级管理员 admin 的身份令牌,在 bruno 中构建一个 POST 请求,请求体(Body)内容如下,把密码换成你自己设置的密码:

json

{
  "auth": {
    "identity": {
      "methods": ["password"],
      "password": {
        "user": {
          "name": "admin",
          "domain": { "name": "Default" },
          "password": "密码"
        }
      }
    },
    "scope": {
      "project": {
        "name": "admin",
        "domain": { "name": "Default" }
      }
    }
  }
}

同理,我们要测试一下刚刚创建的学生(班长)能不能获取自己的令牌,将刚才请求体的JSON字段进行修改:

  • auth.identity.password.user.name : monitor
  • auth.identity.password.user.domain.name :xdxy
  • auth.identity.password.user.password :monitor
  • scope.project.name : cloud_computing_group
  • scope.project.domain.name: xdxy

如果出现 openstack 命令无法执行的情况,如下图所示:

该问题原因是:admin-openstack.sh 脚本包含了 Windows 格式的换行符(CRLF,即 \r\n

解决办法:

bash

dos2unix admin-openstack.sh

bash

curl -s http://192.168.192.205/scripts/3.2.sh | bash