查看原文
其他

OpenStack部署2.0——身份服务(Keystone)部署

李逸皓 运维book思议 2023-10-21

先放个链接,万一有人关注呢

优质文章推荐

↓ ↓ ↓ ↓ ↓

ESXi虚拟化系统创建与应用

Linux ps命令没想到还能这样用

Linux网卡配置文件详解



书接上文:OpenStack部署1.0:基础环境部署(train)

概述

Keystone服务是OpenStack项目中的身份认证服务,它提供了一系列身份、令牌、目录、策略服务,是OpenStack访问控制的基石。

Keystone的主要功能包括:

1、用户管理: Keystone负责管理OpenStack的所有用户,包括创建、删除、禁用用户账号等。

2、项目管理:一个项目对应一组资源的集合,Keystone可以创建项目、维护项目与用户的关系。

3、角色管理:角色定义了一组权限,可以赋予给用户来控制对资源的访问。Keystone负责管理角色信息。

4、服务目录:Keystone维护 OpenStack服务的目录索引,包括服务的API端点信息等。

5、认证服务:对用户的密码和密钥进行验证,验证成功后签发证书。

6、授权管理:负责决定用户是否有权访问指定的服务或资源。

7、令牌管理:颁发身份验证令牌,并在有效期内维护令牌列表。

客户端首先向Keystone发起认证请求,Keystone验证身份信息后返回一个作出相关判断的令牌。客户端使用该令牌向其他服务发起 API 请求,服务根据令牌的信息对客户端进行授权。

Keystone通过SQL数据库来存储用户、项目、角色等身份信息。它也提供了对外的REST API接口,以及命令行工具,如keystone-manage等。

Keystone为OpenStack云平台提供核心的身份认证与访问控制服务,是构建安全可靠的OpenStack私有云的基础。

创建数据库

进入控制节点的数据库中

mysql -uroot -p123

创建身份服务的数据库

create database keystone;

授权数据库

grant all privileges on keystone.* to 'keystone'@'localhost' identified by '123';grant all privileges on keystone.* to 'keystone'@'%' identified by '123';

退出数据库

安装配置服务组件

安装相关软件包

yum install openstack-keystone httpd mod_wsgi -y

解释:

1、openstack-keystone
这个是OpenStack身份服务Keystone的包,它包含了Keystone服务的核心代码和组件。安装这个包后,就可以启动并运行Keystone服务,提供OpenStack的认证、授权、目录等功能。
2、httpd
httpd是Apache HTTP服务器。OpenStack的Keystone默认将服务的API端点发布为web服务,所以需要一个HTTP服务器如Apache来提供web服务。
3、mod_wsgi
mod_wsgi是一个Apache的模块,它可以让WSGI兼容的Python应用在Apache上运行。Keystone的API端点就是一个Python+WSGI应用,所以需要mod_wsgi模块来运行该应用。
安装过程如下:
首先安装openstack-keystone包,获得Keystone服务的代码。然后安装并运行Apache服务器,再加载mod_wsgi模块到Apache。接着配置Apache,使用mod_wsgi托管Keystone的API服务端点应用。这样就可以通过Apache来访问Keystone提供的身份认证接口了。
所以这3个组件一起协作,才可以提供一个可访问的Keystone服务:openstack-keystone提供核心实现代码,httpd提供web服务,mod_wsgi module使得Python应用可以运行在Apache上。
OpenStack-keystone、httpd和mod_wsgi都是安装和运行Keystone服务必不可少的组件,需要搭配使用。

修改配置文件,配置数据库访问

vi /etc/keystone/keystone.conf

内容如下

[database]
connection = mysql+pymysql://keystone:123@controller/keystone[token]
provider = fernet

解释:

1、[database]部分
这个部分配置Keystone使用的数据库。
mysql+pymysql表示使用MySQL数据库,通过PyMySQL驱动连接
keystone:123 中keystone是数据库用户名,123是密码
controller是数据库所在主机
keystone是连接的数据库名
所以这一行配置了Keystone连接后端MySQL数据库的访问信息。
2、[token]部分
这个部分配置Keystone的token机制。
provider表示token提供者,这里是fernet
fernet表示使用fernet token方案
Keystone支持不同的token机制,如UUID、PKI、fernet等。这里配置为fernet,它使用对称密钥加密生成token,安全性较高。
所以这一行配置了Keystone使用fernet token方案生成令牌,是一种安全的机制。

注意:

因为发行版的不同,配置文件中的内容也不同,所以需要仔细查看配置文件内容,添加或修改新配置,删除重复的配置。修改完成后,保存退出

填充数据库

su -s /bin/sh -c "keystone-manage db_sync" keystone
解释:
整条命令的作用就是:
切换到keystone用户,并使用/bin/sh shell执行keystone-manage db_sync命令,来同步Keystone服务使用的数据库结构。
这个命令需要在初始配置Keystone数据库时运行,目的是根据Keystone的代码模型来创建数据库表、建立索引等,使数据库结构与Keystone服务预期一致。
这样Keystone服务就可以正确访问和操作后端数据库来存储用户、项目、证书等信息了。

初始化Fernet密钥库,使身份服务能够在非root用户和组下运行。

keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone#这个命令用于初始化fernet token机制所需要的密钥存储库。#--keystone-user keystone - 指定密钥库目录的owner为keystone用户#--keystone-group keystone - 指定密钥库目录的group为keystone组#这样keystone进程就有访问密钥库的权限了。keystone-manage credential_setup --keystone-user keystone --keystone-group keystone#这个命令用于生成fernet机制所需的密钥,并设置权限。#--keystone-user和--keystone-group同上,也是设置密钥文件的owner和group。#所以这两条命令一个初始化了密钥存储库,一个生成了密钥文件,并都将文件权限设置为keystone用户和组,完成了fernet token机制的初始化配置。

引导身份认证服务

keystone-manage bootstrap --bootstrap-password 123  \ #指定admin用户的密码为123--bootstrap-admin-url http://controller:5000/v3/ \#指定admin用户访问的API端点URL--bootstrap-internal-url http://controller:5000/v3/ \#指定内部访问的API端点URL--bootstrap-public-url http://controller:5000/v3/ \#指定外部访问的API端点URL--bootstrap-region-id RegionOne#指定region为RegionOne

解释:

这条命令会进行以下操作:
1、初始化keystone数据库表结构
2、创建一个指定密码的admin用户
3、设置三个API访问端点URL
4、设置region为RegionOne
通过执行这条bootstrap命令,就可以引导keystone数据库建立初始化内容,创建一个可用的admin账号用于后续操作。并且指定三个不同的访问URL可以启用 keystone v3版本的功能。

修改配置文档

vi /etc/httpd/conf/httpd.conf

修改如下

ServerName controller

创建身份认证服务配置文件的文件链接

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

启动Apache服务

systemctl enable httpd.servicesystemctl start httpd.service

配置环境变量

创建一个用于存放变量的文件,放在家目录下就行

vi admin-openrc

内容如下

export OS_USERNAME=admin#OpenStack用户名,用于登录和认证的账号名。export OS_PASSWORD=123#OpenStack用户对应的密码。export OS_PROJECT_NAME=admin#用户名下所属的项目名称。OpenStack以项目为基本管理单元。export OS_USER_DOMAIN_NAME=Default#用户名所在的域名。默认为"Default"。export OS_PROJECT_DOMAIN_NAME=Default#项目所在的域名。默认为"Default"。export OS_AUTH_URL=http://controller:5000/v3#OpenStack认证服务的端点URL,用于用户进行认证。export OS_IDENTITY_API_VERSION=3#指定要使用的OpenStack Identity API版本,默认为3。

密码可以自定义

应用环境变量

source admin-openrc

验证操作

验证操作是官方提供的一些用于验证服务是否已成功运行的命令,如果这些命令顺利运行,则表示该服务已正常运行。这些操作可以不做,但为了确保万无一失,建议执行一次这些命令。

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

创建默认域
openstack domain create --description "Default Domain" Default

解释:

openstack domain create - 使用openstack命令行客户端工具创建域
--description "Default Domain" - 指定该域的描述为"Default Domain"
Default - 指定创建的域的名称为Default
在OpenStack中,域(domain)用于对用户、组进行逻辑隔离和访问控制。一个域可包含多个用户、组及项目。
默认情况下,Keystone中已经存在一个默认的域"default"。这个指令创建了一个描述为"Default Domain"的同名域。
这样就可以在这个域下创建用户、组、项目等,实现一个自包含的默认环境。

输出如下

-------------+----------------------------------+| Field | Value |+-------------+----------------------------------+| description | Default Domain || enabled | True || id | 2f4f80574fd84fe6ba9067228ae0a50c || name | Default || tags | [] |+-------------+----------------------------------+

创建admin项目

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

解释:

openstack project create - 使用openstack命令行客户端创建项目
--domain default - 指定项目归属的域是default,即默认域
--description "Admin Project" - 为该项目添加描述"Admin Project"
admin - 项目的名称设定为admin
在OpenStack中,项目(project)是基本的管理单元,用于隔离和分配资源。一个项目需要属于一个域,并可以包含多个用户、组。
这个命令在默认域下创建了一个名为admin的项目,创建项目时指定了描述,便于理解该项目的用途。
该admin项目可以用于后续添加管理用户,授予管理权限,因为项目名称显示其用途是管理OpenStack。

输出如下

+-------------+----------------------------------+| Field | Value |+-------------+----------------------------------+| description | Admin Project || domain_id | default || enabled | True || id | aeda23aa78f44e859900e22c24817832 || is_domain | False || name | admin || parent_id | default || tags | [] |+-------------+----------------------------------+

创建admin用户

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

输出如下

User Password:Repeat User Password:+---------------------+----------------------------------+| Field | Value |+---------------------+----------------------------------+| domain_id | default || enabled | True || id | aeda23aa78f44e859900e22c24817832 || name | admin || options | {} || password_expires_at | None |+---------------------+----------------------------------+

创建admin角色

openstack role create admin

输出如下

+-----------+----------------------------------+| Field | Value |+-----------+----------------------------------+| domain_id | None || id | 997ce8d05fc143ac97d83fdfb5998552 || name | admin |+-----------+----------------------------------+

将admin角色添加到admin项目和admin用户上

openstack role add --project admin --user admin admin

开发者为OpenStack服务创建唯一用户时,唯一用户需包含在service项目内。

创建service项目

openstack project create --domain default --description "Service Project" service

输出如下

+-------------+----------------------------------+| Field | Value |+-------------+----------------------------------+| description | Service Project || domain_id | default || enabled | True || id | 5eaf162fb3b949b9ad57d848629757f1 || is_domain | False || name | service || options | {} || parent_id | default || tags | [] |+-------------+----------------------------------+

开始验证身份令牌,先取消设置认证链接和密码的临时环境变量

unset OS_AUTH_URL OS_PASSWORD

验证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

输入密码后,输出如下

+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| Field | Value |+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| expires | 2021-09-02T06:24:17+0000 || id | gAAAAABhMGABAO1rXsg0rnL2qegdQZjdOZAghyvdMes6GJ9nkbQgTyQDDlP4drW0w901eSj_nQWZk7OxdfB64qhguh4v13majISWXAsp3loVpE2Iyja4puT8_MOH02tsXT9FLprEqAniwiYnSo7-wUUR-sDVZ9Cl0P-3yO5ROOzUqUJ-qCJddxE || project_id | 4c1c66c3a11947bab644b3e7d4abfb01 || user_id | b0b89ee8513a42e281be5aeadad6c699 |+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

相关概念讲解:

1、域(Domain)
域是用户、项目、组的逻辑隔离和管理单元。一个OpenStack部署可以有多个域,每个域有自主的项目、用户、组、角色。
2、项目(Project)
项目属于某个特定域,是OpenStack的资源管理单元。项目中可以有多个用户、组。一个项目中的资源仅对项目成员可见。
3、用户(User)
用户必须属于一个域,且会被赋予到一个项目中。用户需要提供用户名、密码认证才能访问项目资源。
4、角色(Role)
角色定义了一组权限规则,可以赋予给用户或组来控制对资源的访问。
它们之间的关系是:
一个域中可以有多个项目。
一个项目中可以有多个用户和组。
用户属于且只能属于一个域。
项目和用户都有角色,来控制对资源的访问。
项目仅对所属域的用户可见。
所以域是最大的隔离单元,项目对资源进行分组访问控制,用户通过角色访问项目资源。
这种层次化的关系让OpenStack可以对大量用户、资源进行细粒度的统一访问控制和管理。
未完待续。。。。

来不及解释了,快上车!(进群看公告)

欢迎新的小伙伴加入!在这里,我们鼓励大家积极参与群内讨论和交流,分享自己的见解和经验,一起学习和成长。同时,也欢迎大家提出问题和建议,让我们不断改进和完善这个平台。

              ↓↓↓ 点个在看,你最好看!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存