Part 3 - 安装 Keystone 认证服务

2021-03-01
6分钟阅读时长

【版本】

当前版本号v20230313

版本修改说明
v20230313增加后台进程(服务)说明
v20220323修正一个拼写错误
v20220309增加提醒service和endpoint不能重复创建
v20220208优化步骤
v20210324加入验证步骤
v20210316步骤23去掉了容易导致出错的<>
v20210309新增验证命令
v20210303祛除了配置文件MD5校验的步骤
v20210301初始化版本

【实验名称】

云计算部署实战 Part 3 - 安装 Keystone 认证服务

【实验目的】

  • 掌握搭建 Openstack Keystone 组件
  • 熟练掌握 Linux 命令(vi、tar、mv等等)的使用

【实验环境】

  • 内存:至少4G
  • 硬盘:至少空余40G
  • 操作系统: 64位 Windows系统。

【实验资源】

  • FinalShell
  • CentOS 7 系统镜像
  • VirtualBox
  • Openstack 源

【实验步骤】

  1. 使用 root 用户登录控制节点(Controller)。输出 Hostname ,确认所在节点是控制节点。
hostname

结果:

controller+你的学号后3位
注意以下步骤在控制节点(Controller)上执行!

创建 Keystone 数据库

  1. 连接 MariaDB,进入数据库命令行,输入密码123456
mysql -u root -p
  1. 【数据库命令行】创建一个名为keystone的库。
CREATE DATABASE keystone;
  1. 【数据库命令行】创建名为 keystone,密码为KEYSTONE_DBPASS 的数据库用户,并授权访问 keystone 库。
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' \
  IDENTIFIED BY 'KEYSTONE_DBPASS';
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' \
  IDENTIFIED BY 'KEYSTONE_DBPASS';
  1. 查看keystone库,此时库中没有任何表(Table)。
use keystone;
show tables;
  1. 【数据库命令行】输入 exit; 退出数据库命令行。
exit;

Keystone 安装和配置

  1. 安装 Keystone 相关软件包。
yum install openstack-keystone httpd mod_wsgi -y
  1. 备份 Keystone 的配置文件keystone.conf 为 keystone.conf.bak。
cp /etc/keystone/keystone.conf{,.bak}
  1. 清除 Keystone 配置文件的注释。
grep -Ev '^$|#' /etc/keystone/keystone.conf.bak >/etc/keystone/keystone.conf
  1. 安装openstack-utils
yum install openstack-utils -y
  1. 配置 Keystone 的admin_token,数据库连接,token provider。注意替换你的学号。
openstack-config --set /etc/keystone/keystone.conf DEFAULT admin_token  ADMIN_TOKEN
openstack-config --set /etc/keystone/keystone.conf database connection  mysql+pymysql://keystone:KEYSTONE_DBPASS@controller+你学号后3位/keystone
openstack-config --set /etc/keystone/keystone.conf token provider  fernet
  1. 执行同步数据库
cd /etc/keystone/
su -s /bin/sh -c "keystone-manage db_sync" keystone
  1. 此时再次连接 MariaDB,查询 keystone 库中是否有表,并记录到报告。参考步骤2步骤5步骤6

  2. 初始化 fernet。

cd /etc/keystone/
keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
  1. 追加 Apache (httpd)的配置,注意替换你的学号。这里主要是增加ServerName的配置。
echo "ServerName controller+你学号后3位" >>/etc/httpd/conf/httpd.conf
  1. 增加一个Apache的虚拟主机(VirtualHost)配置,keystone-public运行在5000端口,keystone-admin运行在35357端口。
vi /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>
  1. 启动Apache(httpd),并设置为开机启动。
systemctl enable httpd.service
systemctl start httpd.service

Keystone 环境变量设置

  1. 设置 Keystone 的相关环境变量。注意替换为你的学号。
export OS_TOKEN=ADMIN_TOKEN
export OS_URL=http://controller+你的学号后3位:35357/v3
export OS_IDENTITY_API_VERSION=3

Keystone 创建 service 和 endpoint

  1. 创建1个 Keystone 的服务(Service)。命令正常创建会展示以下类似代码。
openstack service create --name keystone --description "OpenStack Identity" identity

注意这行代码不能重复运行多次,运行openstack service list应该只能查看到一个 keystone 的 service,如果有多个可以用 openstack service delete '替换为service ID'命令删除

  • 正常返回类似以下内容
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | OpenStack Identity               |
| enabled     | True                             |
| id          | 27c6ff83af90458dabf2fc19ab02efda |
| name        | keystone                         |
| type        | identity                         |
+-------------+----------------------------------+

如果提示找不到 openstack 命令,请运行以下代码安装 openstack 客户端。

yum install python-openstackclient -y
  1. 创建3个端点(endpoint)。注意替换为你的学号。每行命令正常创建会展示以下类似代码。
openstack endpoint create --region RegionOne \
  identity public http://controller+你的学号后3位:5000/v3
openstack endpoint create --region RegionOne \
  identity internal http://controller+你的学号后3位:5000/v3
openstack endpoint create --region RegionOne \
  identity admin http://controller+你的学号后3位:35357/v3

注意这里 endpoint 不能重复运行,运行命令openstack endpoint list应该只能查看到3个 keystone 的 endpoint,如果有多个可以用 openstack endpoint delete '替换为endpoint ID'命令删除

+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 3b4738ec31644bdb90bf8f8515eac596 |
| interface    | internal                         |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 27c6ff83af90458dabf2fc19ab02efda |
| service_name | keystone                         |
| service_type | identity                         |
| url          | http://controller+你的学号:5000/v3    |
+--------------+----------------------------------+

Keystone 创建用户

  1. 运行以下命令分别创建域default、项目admin、用户admin、角色admin
openstack domain create --description "Default Domain" default

openstack project create --domain default --description "Admin Project" admin

openstack user create --domain default --password ADMIN_PASS admin

openstack role create admin
  1. 查询刚创建的用户的ID
openstack user list

正常会返回类似以下内容

+----------------------------------+-------+
| ID                               | Name  |
+----------------------------------+-------+
| 用户ID                           | admin |
+----------------------------------+-------+
  1. 复制上文的用户ID,关联项目admin,用户admin,角色admin
openstack role add --project admin --user 替换为用户ID admin

控制节点验证步骤

  1. 移除上面步骤19设置的环境变量。
unset OS_TOKEN
unset OS_URL
unset OS_IDENTITY_API_VERSION
  1. 创建一个设置环境变量的脚本,输入以下内容,注意替换为你的学号。这个环境变量脚本主要方便我们预设一些全局设置,用来测试 keystone 能否正常运行。
vim /etc/keystone/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://controller+你的学号后3位:35357/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
  1. 执行脚本,设置环境变量。
source /etc/keystone/admin-openrc
  1. 查看token,可以多运行几次,查看 token id 是否更新。
openstack token issue

类似结果:

+------------+-------------------------------------------------+
| Field      | Value                                           |
+------------+-------------------------------------------------+
| expires    | 2021-03-24T08:27:30.000000Z                     |
| id         | gAAAAABgWunifA_DeD3mcJMerIIFLqXy7tajYuAmAVvM1pM |
|            | 9yTeRaM5gXVDImlqbrivC1IwtpxtJR2Gq6EHMJ1iSZ10iRa |
|            | dJzqZWYjoWLha-bSlbqb3y0Iyzo-                    |
|            | liAC02tVsiv6ZPge4KXndvwxTk79_dkw--              |
|            | zvXUlKmM5SY68n2eQZttddTcPSQ                     |
| project_id | 70667e2a19c640b796c9e2de6571a33c                |
| user_id    | 5b74a6845f264ae9912b78d4a32f5f73                |
+------------+-------------------------------------------------+
  1. 清除环境变量,使用 openstack 命令验证是否能够获取 Token。注意替换学号。
unset OS_PROJECT_DOMAIN_NAME
unset OS_USER_DOMAIN_NAME
unset OS_PROJECT_NAME
unset OS_USERNAME
unset OS_PASSWORD
unset OS_AUTH_URL
unset OS_IDENTITY_API_VERSION
unset OS_IMAGE_API_VERSION

openstack --os-auth-url http://controller+你的学号后3位:5000/v3 \
  --os-project-domain-name default --os-user-domain-name default \
  --os-project-name admin --os-username admin --os-auth-type password \
  --os-password ADMIN_PASS token issue

类似结果:

+------------+-------------------------------------------------+
| Field      | Value                                           |
+------------+-------------------------------------------------+
| expires    | 2021-03-24T08:27:30.000000Z                     |
| id         | gAAAAABgWunifA_DeD3mcJMerIIFLqXy7tajYuAmAVvM1pM |
|            | 9yTeRaM5gXVDImlqbrivC1IwtpxtJR2Gq6EHMJ1iSZ10iRa |
|            | dJzqZWYjoWLha-bSlbqb3y0Iyzo-                    |
|            | liAC02tVsiv6ZPge4KXndvwxTk79_dkw--              |
|            | zvXUlKmM5SY68n2eQZttddTcPSQ                     |
| project_id | 70667e2a19c640b796c9e2de6571a33c                |
| user_id    | 5b74a6845f264ae9912b78d4a32f5f73                |
+------------+-------------------------------------------------+
  1. 查询 keystone identity service,表里应该只有一行记录。
source /etc/keystone/admin-openrc
openstack service list |grep -E "ID|keystone"

类似结果:

| ID                               | Name     | Type     |
| 27c6ff83af90458dabf2fc19ab02efda | keystone | identity |
  1. 查询 keystone endpoint,表里应该有3行记录。
source /etc/keystone/admin-openrc
openstack endpoint list |grep -E "ID|keystone"

类似结果:

| ID                               | Region    | Service Name | Service Type | Enabled | Interface | URL                                           |
| 3b4738ec31644bdb90bf8f8515eac596 | RegionOne | keystone     | identity     | True    | internal  | http://controller999:5000/v3                 |
| 82fae374b1b34d08bf70c9e13695b03e | RegionOne | keystone     | identity     | True    | public    | http://controller999:5000/v3                 |
| c471090d01e9471cbd2afd57fe71e7fb | RegionOne | keystone     | identity     | True    | admin     | http://controller999:35357/v3
  1. 控制节点上查看以下服务是否是 active 的状态。正常应该出现5个服务 active。
systemctl -a |grep -E "UNIT|chronyd|memcached|rabbitmq|mariadb|httpd"

【后台进程(服务)说明】

服务名称日志目录说明
chronyd/var/log/chronychrony是网络时间协议(NTP)的实现。它可以替代ntpd,实现服务器
rabbitmq-server/var/log/rabbitmqRabbitMQ 是高级消息队列协议(AMQP)开放标准的实现,常用于服务器之间的消息通讯,Openstack 使用 RabbitMQ 作为底层组件来实现不同模块之间的远程调用(RPC)。
mariadb/var/log/mariadbMariaDB 是非常流行的开源关系型数据库,它能够兼容MySQL
memcached/var/log/messagesMemcached 是一个基于内存的,开源的分布式对象缓存系统。 Openstack 会使用 Memcached 存储一些短期的对象,例如令牌等。
httpd/var/log/httpdApache Web 服务器,对外提供 HTTP 等协议的 Web 访问服务

【思考和探索】

  1. 关于用户,角色,权限的关系,你是如何理解的?
  2. 现在需要创建一个符合如下要求的域、项目、用户、角色,并且能够成功获取到token,你能够完成命令的编写并实现这个要求吗?
domain=default
project=roomaccess
user=stu+你学号后3位
role=student