一、关于Keystone
Keystone是一个 OpenStack 的 Identity 服务,提供API客户端身份验证、服务发现、以及通过OpenStack的身份API进行分布式多租户授权。
Identity 服务提供了管理身份验证、授权和服务目录的功能,它通常是用户与 OpenStack 交互的第一个服务。通过身份验证后,用户可以使用他们的身份访问其他 OpenStack 服务。同样,其他 OpenStack 服务利用 Identity 服务来确保用户的真实身份,并发现其他服务。Identity 服务还可以与一些外部用户管理系统(如LDAP)集成。
用户和服务可以通过使用由 Identity 服务管理的服务目录来定位其他服务。服务目录是OpenStack 部署的可用服务的集合。每个服务可以有一个或多个端点,每个端点都可以是admin、 internal 或 public 。在生产环境中,出于安全原因,不同的端点类型可能位于暴露给不同类型用户的独立网络上。例如,公共API网络可能在互联网上可见,因此客户可以管理他们的云。管理API网络可能仅限于管理云基础设施的组织内的运营商。内部API网络可能仅限于包含OpenStack服务的主机。此外,OpenStack支持多个区域以实现可扩展性。为了简单起见,本次学习将管理网络用于所有端点类型和默认区域。在 Identity 服务中创建的区域、服务和端点共同构成了部署的服务目录。部署中的每个 OpenStack 服务都需要一个服务条目,其中相应的端点存储在 Identity 服务中。这一切都可以在安装和配置 Identity 服务后完成。
二、Keystone的结构
Keystone被组织为一组在一个或多个端点上公开的内部服务。其中许多服务是由前端以组合的方式使用的。例如,authenticate调用将使用Identity服务验证用户/项目凭据,成功后,使用token服务创建并返回令牌。
- Identity: Identity 服务提供身份验证凭据验证以及有关用户和组的数据。在基本情况下,此数据由Identity服务管理,使其也能够处理与此数据相关的所有CRUD操作。在更复杂的情况下,数据由权威的后端服务管理。这方面的一个例子是当Identity服务充当LDAP的前端时。在这种情况下,LDAP服务器是身份数据的来源,身份服务的作用是准确地传递信息。
- Users:用户代表单个API使用者。用户本身必须由特定域拥有,因此所有用户名都不是全局(整个系统)唯一的,而是在其所在的域内是唯一的。
- Groups:组是表示用户集合的容器。组本身必须由特定域拥有,因此所有组名称都不是全局唯一的,而是仅对其域唯一的。
- Resource:资源服务提供有关项目和域的数据。
- Projects:项目是 OpenStack 中的基本单元,因为所有 OpenStack 中的资源应该由特定项目拥有。项目本身必须由特定域拥有,因此所有项目名称不是全局唯一的,而是在其域内唯一。如果项目没有指定域,那么会自动将其添加到默认域(default)。
- Domains:域是项目、用户和组的高级容器。每个域定义一个命名空间,其中存在 API 可见的名称属性。Keystone提供了一个默认域,恰如其名为“default”。由于其容器架构,域可以用作委派的一种方式 管理OpenStack资源。域中的用户仍可访问 另一个域中的资源(如果授予了适当的权限)。域的属性如下所示:
域:具有全局唯一性,不能有重复的域名。
角色:在域中独一无二,不同域中可以有相同的角色名。
用户:在域中独一无二,不同域中可以有相同的用户名。
项目:在域中独一无二,不同域中可以有相同的项目名。
组:在域中独一无二,不同域中可以有相同的组名。
- Roles:角色定义用户可以获得的授权级别。角色可以在域或项目级别授予。也可以在单个用户或组级别分配角色。
- Token:当用户的凭据(账户、密码等)通过验证,令牌服务就会验证和管理用于验证请求的令牌。
- Catalog:目录服务提供用于端点发现的端点注册表。
Keystone包含以下几种主要数据类型:
-
用户:具有帐户凭据,与一个或多个项目或域相关联
-
组:用户的集合,与一个或多个项目或域相关联
-
项目:OpenStack中的所有权单位,包含一个或多个用户
-
域:OpenStack中的所有权单位,包含用户,组和项目
-
角色:与许多用户-项目对关联的第一类元数据。
-
令牌:标识与用户或用户和项目关联的凭据
-
附加功能:与用户-项目对关联的键值元数据桶。
-
规则:描述执行操作的一组要求。
三、Keystone安装和配置
本章节介绍如何在控制节点上安装和配置OpenStack 的 Identity服务:Keystone。出于可扩展性的目的,此配置部署Fernet令牌和Apache HTTP服务器来处理请求。
* 在继续操作之前,请确保已经完成《(零)OpenStack ( Train版 ) 搭建环境 》中的步骤。
* 本章节操作全在控制节点上。
1、先决条件
* 在安装和配置身份服务之前,必须创建数据库(《(零)OpenStack ( Train版 ) 搭建环境 》中章节四)
①、使用root用户访问数据库
# -u root 登录的用户名
# -p123 该用户的密码(此处root密码为123)
$ mysql -u root -p123
②、创建Keystone的数据库:
MariaDB [(none)]> CREATE DATABASE keystone;
Query OK, 1 row affected (0.000 sec)
③、对 Keystone 数据库授予正确的访问权限:
给keystone用户授权,让其可以用任何IP远程连接keystone数据库并进行相应操作
# 123 为 keystone 数据库密码,远程访问时需要用户名keystone和密码123一起使用
MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY '123';
Query OK, 0 rows affected (0.001 sec)
MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY '123';
Query OK, 0 rows affected (0.000 sec)
④、退出数据库
# exit
2、安装和配置组件
* 默认配置文件因软件版本不同,内容可能有所不同,所以可能需要添加部分配置和选项,而不是去修改现有的内容,此外,配置时应仅添加或修改以下所描述的行、段,其他非注释的已有内容不应修改或删除,需要保留。
①、安装所需的软件包:
# yum install openstack-keystone http mod_wsgi -y
②、编辑配置文件: /etc/keystone/keystone.conf
- 先对配置文件进行整理:
# 先将配置文件复制一份备份
# cp /etc/keystone/keystone.conf /etc/keystone/keystone.conf.back
#
# 将配置文件里的注释全部清除掉,方便修改配置文件 将源文件里#开头的行删除
# cat /etc/keystone/keystone.conf.back | grep "^[^#]" > /etc/keystone/keystone.conf
#
# 编辑配置文件 如需查看配置文件各项的作用,可以去备份文件里查看注释说明
# vim /etc/keystone/keystone.conf
- 配置数据库访问:[database]
[database]
#格式:connection = mysql+pymysql://用户名:密码@主机名/数据库
connection = mysql+pymysql://keystone:123@syl-ct/keystone
- 配置令牌的提供程序Fernet:[token]
[token]
# 这个选项设定keystone的令牌种类
provider = fernet
③、填充 keystone 数据库:
# su -s /bin/sh -c "keystone-manage db_sync" keystone
# 如果出现报错:Failed to open some config files: /etc/keystone/keystone.conf,修改配置文件的访问权限即可,此错误原因是权限不足,读取不了配置文件。
④、初始化Fernet密钥存储库:
# keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
# keystone-manage credential_setup --keystone-user keystone --keystone-group keystone
⑤、启动身份服务:
* 记住这里的管理员密码
# 这里的123是设定admin用户密码,需要设定一个合适的管理员密码,下面url里的 syl-ct 为控制节点的主机名
# keystone-manage bootstrap --bootstrap-password 123 \
--bootstrap-admin-url http://syl-ct:5000/v3/ \
--bootstrap-internal-url http://syl-ct:5000/v3/ \
--bootstrap-public-url http://syl-ct:5000/v3/ \
--bootstrap-region-id RegionOne
3、配置 Apache HTTP 服务器
* 安全部署时应将web服务器配置为使用SSL
①、编辑配置文件: /etc/httpd/conf/httpd.conf
# 将此项设置为控制节点主机名,一般在95行左右,且被注释了,可以在vim的普通模式使用 '?ServerName' 进行查找,如果不存在,那就自行添加一条
ServerName syl-ct
②、创建指向该文件的链接:/usr/share/keystone/wsgi-keystone.conf
# ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/
4、完成安装
①、启动Apache HTTP服务并设置为开机自启:
# systemctl enable httpd.service
# systemctl start httpd.service
②、通过设置环境变量来使用admin管理员帐户:
* 可以创建一个txt文件,将此内容写进去,使用时用 “ . 文件名”即可快捷登录OpenStack
export OS_USERNAME=admin
export OS_PASSWORD=123 # 此处密码为 2-(5) 中设置的管理员密码
export OS_PROJECT_NAME=admin
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_DOMAIN_NAME=Default
export OS_AUTH_URL=http://syl-ct:5000/v3
export OS_IDENTITY_API_VERSION=3
四、创建用户
Identity服务为每个OpenStack服务提供身份验证服务。身份验证服务使用域、项目、用户和角色的组合。
* 域、项目、用户和角色的创建需要使用具有管理员权限的用户(三、4、②),
1、域的创建
在之前Keystone安装步骤中,默认域 “default” 就已经创建好了,以下为创建新域的方法:
# description: 域的介绍 , syl: 域名
# openstack domain create --description "The syl domain" syl
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | The syl domain |
| enabled | True |
| id | b0672c986879437aa8e6045922748b0c |
| name | syl |
| options | {} |
| tags | [] |
+-------------+----------------------------------+
2、系统项目Service
创建一个Service 项目,在OpenStack 中部署的每一个服务拥有一个用户,把这些服务用户包含在 Service 项目中:service
# --description:项目介绍,--domain:所属域 ,service:项目名
# openstack project create --description "Service Project" --domain default service
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | Service Project |
| domain_id | default |
| enabled | True |
| id | 28e9baae8004480cbde07888fd7a95a3 |
| is_domain | False |
| name | service |
| options | {} |
| parent_id | default |
| tags | [] |
+-------------+----------------------------------+
3、普通用户
* 常规(非管理员)任务应该使用非特权项目和用户
- 创建项目:sylProject
* 当再次为此项目创建其他用户时,无需在重复此步骤,因为项目已经创建好,只需用后续步骤将用户加入项目即可
# openstack project create --description "This is syl's Project" --domain default sylProject
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | This is syl's Project |
| domain_id | default |
| enabled | True |
| id | 0a4dec7a0a7f4fdc8187fa274299e0e2 |
| is_domain | False |
| name | sylProject |
| options | {} |
| parent_id | default |
| tags | [] |
+-------------+----------------------------------+
- 用户:syl
# 注 --description不是必需的,--domain 和 --password 是必需的,123为用户密码,syl为用户名
# 用户密码有两张设置方法:
# 一、--password xx密码, 密码明文显示并包含在命令中,直接设置,如下
# openstack user create --description "This is syl." --domain default --password 123 syl
+---------------------+----------------------------------+
| Field | Value |
+---------------------+----------------------------------+
| description | This is syl. |
| domain_id | default |
| enabled | True |
| id | 0145a9b4bc3e46b192bfb3f7aab8f46a |
| name | syl |
| options | {} |
| password_expires_at | None |
+---------------------+----------------------------------+
# 二、--password-prompt, 在命令回车后执行时输入密码,密码并不显示
# openstack user create --description "This is syl." --domain default --password-prompt syl
User Password:
Repeat User Password:
+---------------------+----------------------------------+
| Field | Value |
+---------------------+----------------------------------+
| description | This is syl. |
| domain_id | default |
| enabled | True |
| id | 0145a9b4bc3e46b192bfb3f7aab8f46a |
| name | syl |
| options | {} |
| password_expires_at | None |
+---------------------+----------------------------------+
- 角色:sylrole
# openstack role create sylrole
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | None |
| domain_id | None |
| id | e0e6198ef5ce43439bde593c477cc7fe |
| name | sylrole |
| options | {} |
+-------------+----------------------------------+
- 加入角色
# 注 此条命令没有输出
# openstack role add --project sylProject --user syl sylrole
* 重复以上步骤以创建其他项目和用户
五、验证
1、取消用户环境变量
# unset OS_AUTH_URL OS_PASSWORD
2、使用admin用户请求身份令牌:
# 此处的密码为 admin 用户的密码
# openstack --os-auth-url http://syl-ct:5000/v3 --os-project-domain-name Default --os-user-domain-name Default --os-project-name admin --os-username admin token issue
Password:
Password:
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Field | Value |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| expires | 2023-07-30T10:30:33+0000 |
| id | gAAAAABkxi25YGUhcifWFKBl3Xwzvw3K_RtTIuN6Rdec6fv1nUvmLuKvZuFBOCPxcwdv-2cf_wkNEu3qC12th7lYxmQbJa_nJGhHUn_FaedKjcdpa663NHEfdt94pqjb7_IpHp7wrlaaUu6SFAYqHnynbn7qUSugAyJSauz3HyToKBCWhs7nbsQ |
| project_id | d9132d41e61b49138d7528631164fe80 |
| user_id | 859caca6a4d44b67b174312ecafe50b8 |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
3、使用第四章节创建的用户来请求身份令牌:
# openstack --os-auth-url http://syl-ct:5000/v3 --os-project-domain-name Default --os-user-domain-name Default --os-project-name sylProject --os-username syl token issue
Password:
Password:
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Field | Value |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| expires | 2023-07-30T10:35:17+0000 |
| id | gAAAAABkxi7Vu4MoxQfIUgf_m3QD53NxzB7l8o_IxFFKO2LYlK3AKPi90SytFAK3QGZ02a7lYfaCBdHl9Td9mIa6F4uAEoXKwAkc6cZDh6Zh5UyPbFnmXICmCcRwJAsneobw4BwYZG9B6bfY3SSfnzFIzeBE4Ma7D4t0S1tZZ1Me7eFeyqVPgcI |
| project_id | 0a4dec7a0a7f4fdc8187fa274299e0e2 |
| user_id | 0145a9b4bc3e46b192bfb3f7aab8f46a |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
六、用户脚本
前面的部分使用了环境变量和命令选项,用于通过客户端与标识服务交互。为了提高使用效率, OpenStack 支持简单的客户端环境脚本,也称为 OpenRC 文件。
1、创建脚本
* 客户端环境脚本的路径不受限制,为方便起见,可以将脚本放置在任何位置, 但是,请确保它们是可访问的并且位于安全的环境中,因为它们包含用户、密码等敏感凭据。
①、创建管理员脚本:admin-openrc
# vim admin-openrc
export OS_USERNAME=admin # 用户名
export OS_PASSWORD=123 # 用户密码
export OS_PROJECT_NAME=admin # 用户项目
export OS_USER_DOMAIN_NAME=Default # 用户所属域
export OS_PROJECT_DOMAIN_NAME=Default # 用户项目所属域
export OS_AUTH_URL=http://syl-ct:5000/v3 # 身份认证服务的端点
export OS_IDENTITY_API_VERSION=3 # 身份认证服务的版本
②、创建普通用户脚本: syl-openrc
# vim syl-openrc
export OS_USERNAME=syl # 用户名
export OS_PASSWORD=123 # 用户密码
export OS_PROJECT_NAME=sylProject # 用户项目
export OS_USER_DOMAIN_NAME=Default # 用户所属域
export OS_PROJECT_DOMAIN_NAME=Default # 用户项目所属域
export OS_AUTH_URL=http://syl-ct:5000/v3 # 身份认证服务的端点
export OS_IDENTITY_API_VERSION=3 # 身份认证服务的版本
2、使用脚本
要以特定项目和用户身份登录OpenStack平台,只需运行它们的客户端环境脚本即可。
①、加载用户客户端环境脚本(用户凭据):
# 注: .和admin-openrc之间需要保留空格
# . admin-openrc
②、请求身份验证令牌
[root@syl-ct ~]# openstack token issue
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Field | Value |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| expires | 2023-07-30T10:50:15+0000 |
| id | gAAAAABkxjJXu3Pwh_bRPsz-S4LvHSvjf6hBgMfgVlUdbjCmGPQK-Cs2ZPLajbUmPDunByiD8PFvjToumndAXrBQpREJ1SiZRCEGTHCobpdJKPTlBpaovInXvWhTS64h-kOkS0ll4kYALc0M4daNvGv-typy3BVgcZj0Q_25x4ZES34Px6lQRys |
| project_id | d9132d41e61b49138d7528631164fe80 |
| user_id | 859caca6a4d44b67b174312ecafe50b8 |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
七、OpenStack基本命令及使用
1、OpenStack一般命令格式如下:
# 需要使用相应的权限执行命令,执行超出登录用户权限的命令时会报错 403 权限不足
# openstack (项目选项) (动作选项) --参数
2、用户操作的常用命令包括以下:
# 项目选项:
user
role
project
domain
# 动作选项,以下列出部分选项,不同项目的动作选项不同
create # 创建一个指定名的该项
delete # 删除指定名的该项
list # 查看该项的所有内容
set # 修改该项指定名的属性
show # 查看该项指定名的详细属性
# 例:
# openstack user list #查看所有用户(需管理员权限的用户)
+----------------------------------+-------+
| ID | Name |
+----------------------------------+-------+
| 859caca6a4d44b67b174312ecafe50b8 | admin |
| 0145a9b4bc3e46b192bfb3f7aab8f46a | syl |
+----------------------------------+-------+
# openstack user set --disable syl # 修改用户syl的状态属性(禁用)
# openstack user show syl # 查看用户syl的详细属性
+---------------------+----------------------------------+
| Field | Value |
+---------------------+----------------------------------+
| description | This is syl. |
| domain_id | default |
| enabled | False | #(已禁用)
| id | 0145a9b4bc3e46b192bfb3f7aab8f46a |
| name | syl |
| options | {} |
| password_expires_at | None |
+---------------------+----------------------------------+