Centos7 OpenStack的部署之Keystone的构建

Keystone的概述

Keystone的定义
Keystone主要为OpenStack的所有组件提供认证和访问策略,也包含用户访问资源的请求以及基于角色的权限管理。
Keystone是所有组件的交互中心,所有组件在交互之前,都要请求keystone组件进行身份认证,这样方可进行下一步操作。
keystone为OpenStack所有组件提供了一个统一的验证方式(Token)

keystone认证方式

keystone有两种验证方式:一种是基于用户名和密码,另一种是基于令牌(Token)

  • 用户管理 (验证用户的身份信息合法性)
  • 服务目录管理(存放每一个service的名称和endpoint端点信息,给客户端访问提供一个访问路线)

keystone认证服务中的关键字

user(用户):使用服务的用户,可以是一个人、服务、系统。只要是使用了OpenStack中的服务都可以称作用户
注:用户需通过keystone的认证,方可访问OpenStack中的服务资源
**除了我们创建的admin和demo用户之外,我们还会创建每一个服务对应的用户,比如:Nova、glance、neutron等服务的用户

Credentials(凭证):确认用户身份的信息,包含:用户名和密码、TokenAuthentication(验证):证明用户身份的过程

Token(令牌):身份验证成功后,keystone会分配一个token给用户
注:用户访问任何服务都是通过这个Token令牌来进行验证的

Tenant(租户 也叫做 Project):Project可以是一个人、项目,资源的集合
注:一个project可以对应多个user

Service(服务):OpenStack中的服务,比如:Nova、glance、neutron等
注:每一个service可以存在多个endpoint端点信息,user通过endpoint来访问service中的资源

Endpoint(端点):访问service的URL地址
注:keystone复制管理每一个service的endpoint,便提供给用户访问

Role(角色):用户操作的权限
注:service中的角色可以指定的给user,是user在service中具有相应的操作权限
比如:Nova存在一个管理员admin角色,我们将admin角色划分给user,这样user就具有Nova服务中的管理员权限了

V3版本更新
1.Tenant更改为Project
2.添加了Domain(对系统资源进行限额 一个域中可以存在多个项目以及用)
3.添加了Group (组的概念为了更好的管理用户,例如linux下对组授权,其组下面的用户也有了相应的权限)

用户和组件之间的交互过程

用户想要访问整OpenStack体系,会提供用户和密码向Keystone组件进行认证,认证成功以后,Keystone会发送一个Token给用户,然后获取到service和endpoint信息。此后用户所有的请求都会使用该 token 进行身份验证。
比如:用户想要访问Nova组件进行虚拟机的创建
用户获取到Token以及服务目录信息后,会向Nova组件发送创建虚拟机的请求,Nova组件收到用户的Token后,会向keystone发送请求,验证此Token是否具备创建虚拟机的权限,认证成功后,Nova组件就会提供相应的服务给用户。其他组件交互也是如此

Keystone认证服务的构建

测试环境

主机 IP地址
controller ens33:192.168.1.10 ens37:192.168.2.10
compute ens33:192.168.1.20 ens37:192.168.2.20

Keystone的配置

以下操作均在controller节点进行

安装keystone相关软件包

[root@controller ~]# yum install -y openstack-keystone httpd mod_wsgi 

创建keystone数据库

[root@controller ~]# mysql -uroot -p
MariaDB [(none)]> create database keystone;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> grant all privileges on keystone.* to 'keystone'@'localhost' identified by 'keystone';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> grant all privileges on keystone.* to 'keystone'@'%' identified by 'keystone';
Query OK, 0 rows affected (0.00 sec)

生成管理员的令牌环

[root@controller ~]# openssl rand -hex 10
6f8dd605dadf059a56f7

编辑keystone配置文件

配置数据库连接、定义管理员初始令牌的值

[root@controller ~]# vi /etc/keystone/keystone.conf 
14 admin_token = 6f8dd605dadf059a56f7
737 connection = mysql+pymysql://keystone:keystone@controller/keystone
2922 provider = fernet

为keystone创建数据表

[root@controller ~]# su -s /bin/sh -c "keystone-manage db_sync" keystone 

查看创建表是否成功
[root@controller ~]# mysql -h 192.168.1.10 -ukeystone -pkeystone -e "use keystone;show tables;"

初始化Fernet keys

[root@controller ~]# keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone 
[root@controller ~]# keystone-manage credential_setup --keystone-user keystone --keystone-group keystone 

配置Apache服务器

[root@controller ~]# cp /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/
[root@controller ~]# vi /etc/httpd/conf/httpd.conf 
 95 ServerName controller
[root@controller ~]# systemctl start httpd 
[root@controller ~]# systemctl enable httpd 
[root@controller ~]# ss -tan | grep 5000
LISTEN     0      128         :::5000                    :::*                  
[root@controller ~]# ss -tan | grep 35357
LISTEN     0      128         :::35357                   :::* 

keystone的连接方式

1.使用环境变量的方式来连接keystone(环境初始化常用)
格式:
export OS_TOKEN=OpenSSL生成的随机值
export OS_URL=http://controller:35357/v3 (连接到keystone的地址以及端口信息)
export OS_IDENTITY_API_VERSION=v3 (定义版本信息)

2.使用命令行的方式来连接到keystone(需要在创建完成域、项目、用户,服务之后才能够使用)
格式:
openstack --os-auth-url http://controller:35357/v3 \
--os-project-domain-name default --os-user-domain-name default \
--os-project-name 项目名称 --os-username 用户名称 token issue

5000端口和35357端口的区别:
5000端口是普通用户进行身份认证的端口
35357端口是admin用户和普通用户认证的端口

定义环境变量

[root@controller ~]# export OS_TOKEN=6f8dd605dadf059a56f7
[root@controller ~]# export OS_URL=http://controller:35357/v3
[root@controller ~]# export OS_IDENTITY_API_VERSION=3

创建域、项目、用户和角色

以下创建的为管理员环境即admin

创建default域

[root@controller ~]# openstack domain create --description "Default Domain" default
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | Default Domain                   |
| enabled     | True                             |
| id          | 81bf28300f9c474d9d26d64ec2c751f4 |
| name        | default                          |
| tags        | []                               |
+-------------+----------------------------------+

--description:指定描述信息

创建admin项目

[root@controller ~]# openstack project create --domain default --description "Admin Project" admin
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | Admin Project                    |
| domain_id   | 81bf28300f9c474d9d26d64ec2c751f4 |
| enabled     | True                             |
| id          | 05367053571a461da02673fed3067196 |
| is_domain   | False                            |
| name        | admin                            |
| parent_id   | 81bf28300f9c474d9d26d64ec2c751f4 |
| tags        | []                               |
+-------------+----------------------------------+

--domain:指定项目所属域的名称

创建admin用户

[root@controller ~]# openstack user create --domain default --password-prompt admin 
User Password:
Repeat User Password:
+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| domain_id           | 81bf28300f9c474d9d26d64ec2c751f4 |
| enabled             | True                             |
| id                  | 8ba7a31a940743409415f4bbf7be61aa |
| name                | admin                            |
| options             | {
     }                               |
| password_expires_at | None                             |
+---------------------+----------------------------------+

--password-prompt:创建用户的时候,需要设置密码

创建admin角色

[root@controller ~]# openstack role create admin 
+-----------+----------------------------------+
| Field     | Value                            |
+-----------+----------------------------------+
| domain_id | None                             |
| id        | d6e81cc64a0e4123a7b210a062d8f4cf |
| name      | admin                            |
+-----------+----------------------------------+

将以上创建的关联在一起

[root@controller ~]# openstack role add --project admin --user admin admin 

将admin用户加入admin项目中,并赋予admin角色

创建普通用户环境

创建方法和上面的一致,普通用户就相当于我们在阿里云上注册的一个新账号

创建user项目

[root@controller ~]# openstack project create  --domain default --description "User Project" user
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | User Project                     |
| domain_id   | 81bf28300f9c474d9d26d64ec2c751f4 |
| enabled     | True                             |
| id          | 819d37dccd4148d3995a85a690c7752a |
| is_domain   | False                            |
| name        | user                             |
| parent_id   | 81bf28300f9c474d9d26d64ec2c751f4 |
| tags        | []                               |
+-------------+----------------------------------+

创建user用户

[root@controller ~]# openstack user create --domain default --password-prompt user
User Password:
Repeat User Password:
+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| domain_id           | 81bf28300f9c474d9d26d64ec2c751f4 |
| enabled             | True                             |
| id                  | 0298ee7b20bd4dbc965c4931b3dd8b28 |
| name                | user                             |
| options             | {
     }                               |
| password_expires_at | None                             |
+---------------------+----------------------------------+

创建user角色

[root@controller ~]# openstack role create user 
+-----------+----------------------------------+
| Field     | Value                            |
+-----------+----------------------------------+
| domain_id | None                             |
| id        | fd8c5fe04efe4e329c26dc138ad26af5 |
| name      | user                             |
+-----------+----------------------------------+

将以上三者关联到一起

[root@controller ~]# openstack role add --project user --user user user 

将user用户加入到user项目中,并赋予user角色

创建服务实体和API端点信息

服务实体包括:keystone、Nova、glance、neutron等
API端点信息:访问每一个服务的URL路径
端点信息可以分为如下三类:
admin (管理员入口)
internal(私有 内部通信)
public(公有 其他通信)

创建keystone服务实体

[root@controller ~]# openstack service create --name keystone --description "Openstack Identity" identity
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | Openstack Identity               |
| enabled     | True                             |
| id          | 9be4fafed2f94284bbe0eab06bebcd55 |
| name        | keystone                         |
| type        | identity                         |
+-------------+----------------------------------+

--name:指定服务实体的名称

创建public公有端点信息

[root@controller ~]# openstack endpoint create --region RegionOne identity public http://controller:5000/v3 
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 4c60f64c8db6410d8cee9a6dea33b9f3 |
| interface    | public                           |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 9be4fafed2f94284bbe0eab06bebcd55 |
| service_name | keystone                         |
| service_type | identity                         |
| url          | http://controller:5000/v3        |
+--------------+----------------------------------+

指定的端口为5000:代表外部访问的人都是普通用户

创建internal私有端点信息

[root@controller ~]# openstack endpoint create --region RegionOne identity internal http://controller:5000/v3
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 77c9b0360b4247d8ac79573d46a1e014 |
| interface    | internal                         |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 9be4fafed2f94284bbe0eab06bebcd55 |
| service_name | keystone                         |
| service_type | identity                         |
| url          | http://controller:5000/v3        |
+--------------+----------------------------------+

类型为internal表示为内部,端口为5000,内部普通人员访问

创建admin管理员端点信息

[root@controller ~]# openstack endpoint create --region RegionOne identity admin http://controller:35357/v3
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 05070bd98bdb4fa585057481e8237910 |
| interface    | admin                            |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 9be4fafed2f94284bbe0eab06bebcd55 |
| service_name | keystone                         |
| service_type | identity                         |
| url          | http://controller:35357/v3       |
+--------------+----------------------------------+

类型为admin,代表管理员入口,端口为35357 管理员访问的端口
5000端口管理员不适用

查看创建的端口信息

[root@controller ~]# openstack endpoint list 
+----------------------------------+-----------+--------------+--------------+---------+-----------+----------------------------+
| ID                               | Region    | Service Name | Service Type | Enabled | Interface | URL                        |
+----------------------------------+-----------+--------------+--------------+---------+-----------+----------------------------+
| 05070bd98bdb4fa585057481e8237910 | RegionOne | keystone     | identity     | True    | admin     | http://controller:35357/v3 |
| 4c60f64c8db6410d8cee9a6dea33b9f3 | RegionOne | keystone     | identity     | True    | public    | http://controller:5000/v3  |
| 77c9b0360b4247d8ac79573d46a1e014 | RegionOne | keystone     | identity     | True    | internal  | http://controller:5000/v3  |
+----------------------------------+-----------+--------------+--------------+---------+-----------+----------------------------+

验证测试

删除原先我们定义的环境变量

[root@controller ~]# unset OS_TOKEN OS_URL

然后我们再次执行命令会报错
[root@controller ~]# openstack service list 
Missing value auth-url required for auth plugin password

**这里提示要进行用户认证,这里还没有连接到keystone

在之前,我们说过,连接的keystone的方式有两种,一种是通过环境变量,一种是通过命令行的方式,我们把环境变量删除了,自然而然就连接不上了

使用命令行的方式来连接到keystone测试

因为我们已经创建完成了admin环境和user环境

[root@controller ~]# openstack --os-auth-url http://controller:35357/v3 --os-project-domain-name default --os-user-domain-name default --os-project-name admin --os-username admin token issue
Password: 
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Field      | Value                                                                                                                                                                                   |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| expires    | 2021-01-14T04:56:22+0000                                                                                                                                                                |
| id         | gAAAAABf_8DmOAkqy_cQ9gxvUMiN6niv2c9Aa9MN82sK3gcAcTzRDKtuDL9mejT3ROLmHhVhIXi43gr8XtwiBoxq0ONvuoYRlU18yCgLH4Gn0c26YtXH8xou0PcEAkHHYesaF_AvSpBvKVziLp6ShfbKFz1NKmN6VCtwLBPPvB04pAEquUhlpIY |
| project_id | 05367053571a461da02673fed3067196                                                                                                                                                        |
| user_id    | 8ba7a31a940743409415f4bbf7be61aa                                                                                                                                                        |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

返回如上信息代表成功

以上方法是通过命令行的方式来连接到,敲命令的时候有一些复杂,我们可以通过把环境变量写在脚本里面,这样实现的效果比较方便实用

编写admin-OpenStack.sh

[root@controller ~]# vi admin-openstack.sh
填写admin用户相关的身份认证信息即可 
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
export OS_AUTH_URL=http://controller:35357/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2

验证测试
[root@controller ~]# source admin-openstack.sh 
[root@controller ~]# openstack user list 
+----------------------------------+-------+
| ID                               | Name  |
+----------------------------------+-------+
| 0298ee7b20bd4dbc965c4931b3dd8b28 | user  |
| 8ba7a31a940743409415f4bbf7be61aa | admin |
+----------------------------------+-------+

编写user-OpenStack.sh

[root@controller ~]# vi user-openstack.sh 
export OS_PROJECT_DOMAIN_NAME=default
export OS_USER_DOMAIN_NAME=default 
export OS_PROJECT_NAME=user
export OS_USERNAME=user
export OS_PASSWORD=user
export OS_AUTH_URL=http://controller:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2

验证测试
[root@controller ~]# source user-openstack.sh 
[root@controller ~]# openstack project list 
+----------------------------------+------+
| ID                               | Name |
+----------------------------------+------+
| 819d37dccd4148d3995a85a690c7752a | user |
+----------------------------------+------+

至此,keystone认证服务就搭建完成了

你可能感兴趣的:(linux,openstack)