1
2
3
4
5
6
7
作者:李晓辉

联系方式:

微信:Lxh_Chat

邮箱:939958092@qq.com

前言

在云计算环境中,身份认证和授权是确保系统安全性和可靠性的关键环节。OpenStack作为一个强大的开源云平台,提供了灵活的资源管理和高效的虚拟化能力。而Keystone服务作为OpenStack的身份认证和授权核心组件,负责管理用户身份、角色和权限,确保只有经过授权的用户才能访问云资源。本文将详细介绍如何在OpenStack环境中安装和配置Keystone服务,帮助读者顺利搭建一个安全可靠的云平台。

Keystone服务概述

Keystone的作用

Keystone是OpenStack的身份认证和授权服务,它在OpenStack架构中扮演着至关重要的角色。以下是Keystone的主要功能:

  1. 身份认证:Keystone负责验证用户的身份信息,确保用户在访问OpenStack资源时提供有效的凭证(如用户名和密码、Token等)。它支持多种身份认证方式,包括本地用户认证、LDAP认证等。

  2. 授权:Keystone管理用户的权限和角色,控制用户对OpenStack资源的访问。通过定义角色和策略,管理员可以灵活地分配用户权限,确保用户只能访问他们被授权的资源。

  3. 服务目录:Keystone维护一个服务目录,记录了OpenStack环境中所有服务的端点信息。其他OpenStack服务(如Nova、Neutron、Cinder等)通过服务目录发现和调用彼此的服务。

  4. Token管理:Keystone生成和管理Token,用于在OpenStack服务之间进行身份验证。Token是一种临时凭证,用户在通过身份认证后获得Token,并在后续的API请求中使用Token进行身份验证。

Keystone的架构

Keystone服务由以下几个主要组件构成:

  1. keystone服务:这是Keystone的核心服务,负责处理身份认证和授权请求。

  2. keystone.conf配置文件:这是Keystone的主要配置文件,包含了数据库连接信息、身份认证驱动配置、Token管理配置等。

  3. 数据库:Keystone使用关系型数据库(如MariaDB)存储用户信息、角色信息、服务目录等数据。

  4. API端点:Keystone提供RESTful API接口,供其他OpenStack服务和客户端调用,进行身份认证和授权操作。

工作原理

Keystone的工作原理可以概括为以下几个步骤:

  1. 用户认证:用户通过客户端(如OpenStack命令行工具、Horizon仪表板等)向Keystone发送身份认证请求,提供用户名和密码等凭证。

  2. 生成Token:Keystone验证用户凭证,如果验证通过,则生成一个Token,并将其返回给用户。

  3. Token验证:用户在后续的API请求中携带Token,其他OpenStack服务通过调用Keystone的API验证Token的有效性。

  4. 授权检查:在验证Token有效后,Keystone根据用户的角色和策略进行授权检查,确定用户是否有权限访问请求的资源。

  5. 服务调用:如果授权检查通过,用户可以访问相应的OpenStack资源,其他服务通过服务目录获取目标服务的端点信息,并进行调用。

通过以上机制,Keystone确保了OpenStack环境中的身份认证和授权的安全性和灵活性。接下来我将详细介绍如何安装和配置Keystone服务,以确保你的OpenStack环境能够安全地管理用户身份和资源访问。

准备keystone数据库

根据先决条件文章中的信息得知,我的数据库管理员密码是: LiXiaohui

1
mysql -uroot -pLiXiaohui

创建数据库

1
CREATE DATABASE keystone;

分配权限

1
2
3
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY 'LiXiaohui';
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY 'LiXiaohui';
exit

安装配置 keystone组件

安装keystone

1
yum install openstack-keystone httpd python3-mod_wsgi -y

安装CRUDINI编辑器(可选)

这一步是为了防止手工vim修改配置文件改错,如果你熟练掌握vim搜索和输入,这一步并不是必须的

1
yum install crudini -y

准备keystone配置文件

/etc/keystone/keystone.conf[database]和[token]修改正确的值,注意密码要正确,controller名称需要能解析

1
2
crudini --set /etc/keystone/keystone.conf database connection mysql+pymysql://keystone:LiXiaohui@controller/keystone
crudini --set /etc/keystone/keystone.conf token provider fernet

或者手工编辑以下选项

1
2
3
4
5
6
[database]
...
connection = mysql+pymysql://keystone:LiXiaohui@controller/keystone
[token]
...
provider = fernet

准备keystone数据库

keystone-manage db_sync 会创建所有必要的表和初始数据结构

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

初始化Fernet密钥库

keystone-manage fernet_setup 命令用于初始化和管理Fernet密钥库。Fernet是一种对称加密机制,用于加密和解密身份认证令牌(Tokens)。Keystone使用Fernet密钥库来生成和验证Tokens,确保身份认证的安全性。

keystone-manage credential_setup 命令用于初始化和管理凭据加密密钥。Keystone使用这些密钥来加密和解密用户的凭据信息,如密码、API密钥等。这确保了用户凭据的安全性。

1
2
keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
keystone-manage credential_setup --keystone-user keystone --keystone-group keystone

完成上述命令后,可以通过以下步骤验证设置是否成功:

1
2
ls /etc/keystone/fernet-keys/
ls /etc/keystone/credential-keys/

构建Keystone服务

1
2
3
4
5
keystone-manage bootstrap --bootstrap-password LiXiaohui \
--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

keystone-manage bootstrap 命令用于:

  1. 创建初始的管理员用户。

  2. 配置Keystone服务的API端点。

  3. 设置服务目录中的初始服务和端点。

  4. 初始化默认的域和项目。

配置HTTPD服务

既然工作在http上,我们就需要为keystone服务准备httpd服务

1
sed -i '/^ServerRoot/a\ServerName controller:80' /etc/httpd/conf/httpd.conf

链接wsgi-keystone.conf,准备好配置文件

下面命令的作用是将/usr/share/keystone/wsgi-keystone.conf文件链接到/etc/httpd/conf.d/目录下。这样做的目的是让Apache HTTP服务器能够加载Keystone的WSGI配置文件,从而正确地运行Keystone服务。

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

启动httpd服务

1
systemctl enable httpd.service --now

导出环境变量

设置环境变量,以便在命令行中使用OpenStack客户端工具(如openstack命令)时,能够自动使用管理员用户进行身份认证。这些环境变量定义了访问OpenStack服务所需的身份认证信息和其他配置参数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 设置环境变量
export OS_USERNAME=admin
export OS_PASSWORD=LiXiaohui
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 PYTHONWARNINGS="ignore"

# 解释:这些环境变量定义了访问OpenStack服务所需的身份认证信息和其他配置参数。
# OS_USERNAME 和 OS_PASSWORD 是管理员用户的用户名和密码。
# OS_PROJECT_NAME 是管理员所属的项目名称。
# OS_USER_DOMAIN_NAME 和 OS_PROJECT_DOMAIN_NAME 是用户和项目所属的域名。
# OS_AUTH_URL 是Keystone服务的API端点,用于身份认证。
# OS_IDENTITY_API_VERSION 指定使用的身份认证API版本。
# PYTHONWARNINGS="ignore" 用于忽略Python警告信息,使输出更加清晰。

测试keystone功能

创建domain、project、user、roles,这些步骤是用于测试keystone是否工作正常的,不报错就行了

1
2
3
4
5
6
7
8
9
10
11
[root@controller ~]# openstack domain create --description "An Example Domain" example
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | An Example Domain |
| enabled | True |
| id | bd66615ead9545bd818e38de04330ddd |
| name | example |
| options | {} |
| tags | [] |
+-------------+----------------------------------+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@controller ~]# openstack project create --domain default --description "Service Project" service
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | Service Project |
| domain_id | default |
| enabled | True |
| id | 45b31ccce6854ea4925b731e257c53de |
| is_domain | False |
| name | service |
| options | {} |
| parent_id | default |
| tags | [] |
+-------------+----------------------------------+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@controller ~]# openstack project create --domain default --description "Demo Project" myproject
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | Demo Project |
| domain_id | default |
| enabled | True |
| id | 18c97bc23c844cf8b6aa950927779d59 |
| is_domain | False |
| name | myproject |
| options | {} |
| parent_id | default |
| tags | [] |
+-------------+----------------------------------+
1
2
3
4
5
6
7
8
9
10
11
[root@controller ~]# openstack user create --domain default --password LiXiaohui myuser
+---------------------+----------------------------------+
| Field | Value |
+---------------------+----------------------------------+
| domain_id | default |
| enabled | True |
| id | bf296091131d4465891fe70de4c6c528 |
| name | myuser |
| options | {} |
| password_expires_at | None |
+---------------------+----------------------------------+
1
2
3
4
5
6
7
8
9
10
11
[root@controller ~]# openstack role create myrole
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | None |
| domain_id | None |
| id | cfc708779c4f4119a77488e0f6001159 |
| name | myrole |
| options | {} |
+-------------+----------------------------------+
[root@controller ~]# openstack role add --project myproject --user myuser myrole

现在发现都不报错,可以创建自己的环境变量文件了

1
2
3
4
5
6
7
8
9
10
cat > adminrc.sh <<'EOF'
export OS_USERNAME=admin
export OS_PASSWORD=LiXiaohui
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 PYTHONWARNINGS="ignore"
EOF

创建好之后,以后再执行任何openstack命令,就只需要source adminrc.sh就可以了