3-OpenStack认证服务Keystone

熊 0 阅读 虚拟化

1. keystone简介

Keystone (OpenStack Identity Service)是OpenStack中的一个独立的提供安全认证的模块 , 主要负责openstack用户的身份认证、令牌管理、提供访问资源的服务目录、以及基于用户角色的访问控制。

openstack-keystone-1

Keystone类似一个服务总线 , 或者说是整 个Openstack框架的注册表,其他服务通过keystone来注册其服务的Endpoint (服务访问的URL) , 任何服务之间相互的调用 , 需要经过Keystone的身 份验证 , 来获得目标服务的Endpoint来找到目标服务。

Keystone服务在Openstack架构中的位置 :

openstack-keystone-2

2.Keystone作用

在Openstack中 , Ketstone负责用户认证和服务目录两大功能的实现 , 相当于一个注册中心 , 主要有以下功能 :

  1. 用户与认证 , 包括用户权限与用户行为跟踪。

    • 身份认证 : 负责令牌的发放和校验

    • 用户授权 : 授权用户有指定的可执行动作的范围

    • 用户管理 : 管理用户的账户

  2. 服务目录 , 即提供一个服务目录 , 包括所有的服务项和相关API的端点。

    • 服务目录 : 提供可用服务的API端点位置

  3. SOA相关知识。

3. Keystone基本架构

openstack-keystone-3
1953408-20210402221437860-1431072280

4. Keystone的管理对象

Keystone服务贯穿整个架构 , 在进行身份认证服务的整个流程中 , 有几个重要的概念。

  • Domain : 域 , keystone中资源( project、user、group) 的持有者

  • 用户 ( user ) : 指的是使用openstack架构的用户。

  • 用户组(Group) : 可以把多个用户作为一个整体进行角色管理

  • 证书 ( credentials ) : 用于确认用户身份的凭证 , 证明自己是自己 , 包括用户的用户名和密码 , 或是用户名和API密钥 , 或者身份管理服务提供的认证令牌。

  • 认证 ( authentication ) : 确定用户身份的过程。

  • 项目 ( project ) : 可以理解为一个人 , 或服务所拥有的资源的集合。

  • 角色 ( role ) : 用于划分权限 , 通过给user指定role , 使user获得role对应操作权限

  • 委托(Trust) : 把自己拥有的角色临时授权给别人

  • 服务 ( service ) : openstack架构的组件服务 , 如nova、neutron、cinder、swift、glance等。

  • 令牌 ( token ) : 由字符串表示 , 作为访问资源的凭证 , 是用户的身份/权限证明文件 ; token决定了用户的权限范围 , 在指定的权限内进行操作 ; 也包括令牌的有效期 , 在指定的时间范围内用户才有这些权限。

  • 端点 ( endpoint ) : 一个可以通过网络来访问和定位某个openstack service的地址 , 即用户创建一个项目过程中需要的各个服务资源的位置

  • 区域(Region): 在 Keystone里基本代表一个数据中心

  • 访问控制策略(Policy) : 定义接口访问控制规则

  • Assignment: 一个( actor , target , role) 三元组叫一个assignment , 其中actor包括user、group ; target包括domain、project。每个assignment代表一次赋权操作

  • 令牌(Token): 令牌 , 用户访问服务的凭证 , 代表着用户的账户信息 , 一般需要包含user信息、scope信息( project、domain或者trust) 、role信息。分别为PKI、UUID、PKIZ、Fernet几种类型。

4.1 Keystone对象模型

  • user|project|domain|role|assignment

1953408-20210425193703353-2087391122
  • assignment : user, group, project, domain, role绑定关系

    1953408-20210425193848663-1807855169

  • Region|service|endpoint

    1953408-20210425194014509-2087269787
  • Region|service|endpoint关系

    1953408-20210425194149935-1536600420

4.2 虚拟机创建流程

openstack-keystone-4

4.3 工作流程

openstack-keystone-5
  • 用户通过命令行或者horizon控制面板的方式登录openstack , 凭借自己的证书 ( credentials ) 给keystone验证。

  • Keystone对用户的证书验证 , 验证通过则会发布一个令牌 ( token ) 和用户所需服务的位置点 ( endpoint ) 给用户。

  • 用户得到了位置点 ( endpoint ) 之后 , 携带自己的令牌 , 向nova发起请求 , 请求创建虚拟机。

  • nova会拿着用户的token向keystone进行认证 , 看是否允许用户执行这样的操作。

  • keystone认证通过之后 , 返回给nova , nova即开始执行创建虚拟机的请求。首先需要镜像资源 , nova带着令牌 ( token ) 和所需要的镜像名向glance提出镜像资源的请求。

  • glance会拿着token去向keystone进行认证 , 看是否允许提供镜像服务。keystone认证成功后 , 返回给glance。glance向nova提供镜像服务。

  • 创建虚拟机还需要网络服务 , nova携带token向neutron发送网络服务的请求

  • neutron拿着nova给的token向keystone进行认证 , 看是否允许向其提供网络服务。keystone认证成功后 , 返回给nuetron。nuetron则给nova提供网络规划服务。

  • nova获取了镜像和网络之后 , 开始创建虚拟机 , 通过hypervisior可调用底层硬件资源进行创建。创建完成返回给用户 , 成功执行了用户的请求。

5. Token

  • Token是什么?

    • 用户向Keystone提供一组有效的用户信息 , Keystone向用户返回一个token。

    • token包含这个用户的信息 , 用户的角色信息 ( role ) , token的作用域 ( scope ) , token的有效期 ( expiration ) 。

    • 使用这个token可以访问其他的openstack服务。

  • 为什么使用Token?

    • 使用token访问api服务比用户名+密码访问更方便。

    • Token具有有效期 , 在客户端缓存token比缓存用户名密码更安全。

Token在Openstack中的应用

  1. USER向Keystone组件申请Token。

  2. USER创建虚拟机 ( 找nova-api创建 ) , Head中携带Token。

  3. nova-api检验Token是否有效 ( 找Keystone校验 ) 。

  4. Token通过接口透传 , 进入到nova-compute ( ?horizen中携带token的vnc界面 ) 。

  5. nova-compute进行网口相关操作 ( 找neutron-server ) , Head中携带Token。

  6. 校验Token是否有效 ( 找Keystone ) 。

创建Token

1953408-20210425194905200-219683822

Token交互

1953408-20210425194905580-1775389592
  1. 用户从Keystone申请token

  2. 用户使用token访问服务

  3. 被访问组件验证token

  4. 用户得到返回消息

Token的生成和验证

  • UUID Token: 每次验证需要访问Keyston服务端。

  • PKI Token: Token验证在客户端即可完成。

Token的验证流程

1953408-20210425194905992-1670565136

6. 安装keystone

6.1 数据库配置

  1. 创建数据库

    [root@node02 ~]# mysql
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 11
    Server version: 10.5.22-MariaDB MariaDB Server
    ​
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    ​
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    ​
    MariaDB [(none)]> CREATE DATABASE keystone;
    Query OK, 1 row affected (0.001 sec)
    ​
    MariaDB [(none)]> SHOW DATABASES;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | keystone           |
    | mysql              |
    | performance_schema |
    +--------------------+
    4 rows in set (0.002 sec)
    ​
    ​
  2. 创建keystone用户并授权请允许从任何主机链接数据库

    MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%'  IDENTIFIED BY 'keystone123';
    Query OK, 0 rows affected (0.006 sec)
    ​
    MariaDB [(none)]> flush privileges;
    Query OK, 0 rows affected (0.004 sec)
    ​

    验证 : 在node01上使用keystone用户连接数据库 , 看看是否能够正常连接?

    [root@node01 ~]# dnf install mariadb -y
    ​
    [root@node01 ~]# mysql -ukeystone -pkeystone123 -hnode02
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 12
    Server version: 10.5.22-MariaDB MariaDB Server
    ​
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    ​
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    ​
    MariaDB [(none)]> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | keystone           |
    +--------------------+
    2 rows in set (0.002 sec)
    ​

    能够从别的主机用keystone账号连接到mysql , 并看到我们刚才创建的数据库 , 说明我们创建的keystone账号没有问题 ;

6.2 安装配置组件

  1. 在控制节点中安装软件包 , 安装openstack-keystone、httpd和mod_wsgi

    #centos7以下版本命令
    [root@node01 ~]# dnf install openstack-keystone httpd mod_wsgi -y
    ​
    #centos8及以上版本命令
    [root@node01 ~]# dnf install  openstack-keystone httpd python3-mod_wsgi
  2. 编辑文件 /etc/keystone/keystone.conf 并完成如下动作:  

    在 [database] 部分 , 配置数据库访问:vim /etc/keystone/keystone.conf

    keystone123为数据库密码 , openstack-vip.net为VIP地址的域名解析

    [database]
    # ...
    connection = mysql+pymysql://keystone:keystone123@openstack-vip.net/keystone

    连接数据库前边的mysql+pymysql://这一段不用变 , 默认格式就是这个 , 双斜线后面的是keystone用户 , 冒号后面是对应keystone用户的密码 ; @后面是数据库服务器地址 ; 斜线后面是指连接那个数据库 ; 我这里是因为配置了主机名解析 , 所以数据库服务器我用主机名代替了 ;

    [token]配置段配置provider = fernet

    [token]
    provider = fernet
  3. 在控制端初始化keystone的数据库:

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

    以上命令会通过我们刚才配置的连接数据库的地址 , 通过keystone连接到数据库中创建一堆表 ;

    验证 : 在node02上验证 , 看看keystone库中是否多了很多表?

    [root@node01 ~]# mysql -ukeystone -pkeystone123 -hnode02
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 15
    Server version: 10.5.22-MariaDB MariaDB Server
    ​
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    ​
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    ​
    MariaDB [(none)]> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | keystone           |
    +--------------------+
    2 rows in set (0.002 sec)
    ​
    MariaDB [(none)]> use keystone
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    ​
    Database changed
    MariaDB [keystone]> show tables;
    +------------------------------------+
    | Tables_in_keystone                 |
    +------------------------------------+
    | access_rule                        |
    | access_token                       |
    | alembic_version                    |
    | application_credential             |
    | application_credential_access_rule |
    | application_credential_role        |
    | assignment                         |
    | config_register                    |
    | consumer                           |
    | credential                         |
    | endpoint                           |
    | endpoint_group                     |
    | expiring_user_group_membership     |
    | federated_user                     |
    | federation_protocol                |
    | group                              |
    | id_mapping                         |
    | identity_provider                  |
    | idp_remote_ids                     |
    | implied_role                       |
    | limit                              |
    | local_user                         |
    | mapping                            |
    | nonlocal_user                      |
    | password                           |
    | policy                             |
    | policy_association                 |
    | project                            |
    | project_endpoint                   |
    | project_endpoint_group             |
    | project_option                     |
    | project_tag                        |
    | region                             |
    | registered_limit                   |
    | request_token                      |
    | revocation_event                   |
    | role                               |
    | role_option                        |
    | sensitive_config                   |
    | service                            |
    | service_provider                   |
    | system_assignment                  |
    | token                              |
    | trust                              |
    | trust_role                         |
    | user                               |
    | user_group_membership              |
    | user_option                        |
    | whitelisted_config                 |
    +------------------------------------+
    49 rows in set (0.002 sec)
    ​
    MariaDB [keystone]> 
    ​

  4. 初始化Fernet key

    [root@node01 ~]# keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
    2024-09-15 14:49:12.057 40952 INFO keystone.common.utils [-] /etc/keystone/fernet-keys/ does not appear to exist; attempting to create it
    2024-09-15 14:49:12.058 40952 INFO keystone.common.fernet_utils [-] Created a new temporary key: /etc/keystone/fernet-keys/0.tmp
    2024-09-15 14:49:12.059 40952 INFO keystone.common.fernet_utils [-] Become a valid new key: /etc/keystone/fernet-keys/0
    2024-09-15 14:49:12.059 40952 INFO keystone.common.fernet_utils [-] Starting key rotation with 1 key files: ['/etc/keystone/fernet-keys/0']
    2024-09-15 14:49:12.059 40952 INFO keystone.common.fernet_utils [-] Created a new temporary key: /etc/keystone/fernet-keys/0.tmp
    2024-09-15 14:49:12.059 40952 INFO keystone.common.fernet_utils [-] Current primary key is: 0
    2024-09-15 14:49:12.059 40952 INFO keystone.common.fernet_utils [-] Next primary key will be: 1
    2024-09-15 14:49:12.059 40952 INFO keystone.common.fernet_utils [-] Promoted key 0 to be the primary: 1
    2024-09-15 14:49:12.060 40952 INFO keystone.common.fernet_utils [-] Become a valid new key: /etc/keystone/fernet-keys/0
    [root@node01 ~]#  keystone-manage credential_setup --keystone-user keystone --keystone-group keystone
    2024-09-15 14:49:26.421 40954 INFO keystone.common.utils [-] /etc/keystone/credential-keys/ does not appear to exist; attempting to create it
    2024-09-15 14:49:26.422 40954 INFO keystone.common.fernet_utils [-] Created a new temporary key: /etc/keystone/credential-keys/0.tmp
    2024-09-15 14:49:26.422 40954 INFO keystone.common.fernet_utils [-] Become a valid new key: /etc/keystone/credential-keys/0
    2024-09-15 14:49:26.422 40954 INFO keystone.common.fernet_utils [-] Starting key rotation with 1 key files: ['/etc/keystone/credential-keys/0']
    2024-09-15 14:49:26.423 40954 INFO keystone.common.fernet_utils [-] Created a new temporary key: /etc/keystone/credential-keys/0.tmp
    2024-09-15 14:49:26.423 40954 INFO keystone.common.fernet_utils [-] Current primary key is: 0
    2024-09-15 14:49:26.423 40954 INFO keystone.common.fernet_utils [-] Next primary key will be: 1
    2024-09-15 14:49:26.423 40954 INFO keystone.common.fernet_utils [-] Promoted key 0 to be the primary: 1
    2024-09-15 14:49:26.423 40954 INFO keystone.common.fernet_utils [-] Become a valid new key: /etc/keystone/credential-keys/0

    提示:以上命令会在/etc/keystone/fernet-keys/目录下生成两个key文件 ;

    [root@node01 ~]# ll /etc/keystone/fernet-keys/
    total 8
    -rw------- 1 keystone keystone 44 Sep 15 14:49 0
    -rw------- 1 keystone keystone 44 Sep 15 14:49 1
  5. 随机生成10进制数字 , 绕过keystone管理员密码验证 , 直接拥有管理员权限。

    [root@node01 ~]# openssl rand -hex 10
    e1cf389264501c270fef

    引导服务 , 这里使用的ADMIN_PASS使用上面生成的随机密码。controller为控制器访问域名

    keystone-manage bootstrap --bootstrap-password ADMIN_PASS \
      --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

    实际命令使用如下

    [root@node01 ~]# keystone-manage bootstrap --bootstrap-password e1cf389264501c270fef \
      --bootstrap-admin-url http://openstack-vip.net:5000/v3/ \
      --bootstrap-internal-url http://openstack-vip.net:5000/v3/ \
      --bootstrap-public-url http://openstack-vip.net:5000/v3/ \
      --bootstrap-region-id RegionOne
      
    2024-09-15 15:05:00.026 40980 INFO keystone.cmd.bootstrap [None req-bf6c40d0-5cb8-4300-af05-210c506ad29f - - - - - -] Created domain default
    2024-09-15 15:05:00.133 40980 INFO keystone.cmd.bootstrap [None req-bf6c40d0-5cb8-4300-af05-210c506ad29f - - - - - -] Created project admin
    2024-09-15 15:05:00.178 40980 WARNING keystone.common.password_hashing [None req-bf6c40d0-5cb8-4300-af05-210c506ad29f - - - - - -] Truncating password to algorithm specific maximum length 72 characters.: keystone.exception.UserNotFound: Could not find user: admin.
    2024-09-15 15:05:00.598 40980 INFO keystone.cmd.bootstrap [None req-bf6c40d0-5cb8-4300-af05-210c506ad29f - - - - - -] Created user admin
    2024-09-15 15:05:00.621 40980 INFO keystone.cmd.bootstrap [None req-bf6c40d0-5cb8-4300-af05-210c506ad29f - - - - - -] Created role reader
    2024-09-15 15:05:00.654 40980 INFO keystone.cmd.bootstrap [None req-bf6c40d0-5cb8-4300-af05-210c506ad29f - - - - - -] Created role member
    2024-09-15 15:05:00.694 40980 INFO keystone.cmd.bootstrap [None req-bf6c40d0-5cb8-4300-af05-210c506ad29f - - - - - -] Created implied role where b2513b9860e24bcca2e40171101040af implies 05faf76692994c71a8b5a03efe3d527a
    2024-09-15 15:05:00.717 40980 INFO keystone.cmd.bootstrap [None req-bf6c40d0-5cb8-4300-af05-210c506ad29f - - - - - -] Created role manager
    2024-09-15 15:05:00.752 40980 INFO keystone.cmd.bootstrap [None req-bf6c40d0-5cb8-4300-af05-210c506ad29f - - - - - -] Created implied role where b14c0e49e1814002a787f695f88952ba implies b2513b9860e24bcca2e40171101040af
    2024-09-15 15:05:00.773 40980 INFO keystone.cmd.bootstrap [None req-bf6c40d0-5cb8-4300-af05-210c506ad29f - - - - - -] Created role admin
    2024-09-15 15:05:00.804 40980 INFO keystone.cmd.bootstrap [None req-bf6c40d0-5cb8-4300-af05-210c506ad29f - - - - - -] Created implied role where 7f69cadf5b0e4a5ab75042ec0dbd50cd implies b14c0e49e1814002a787f695f88952ba
    2024-09-15 15:05:00.835 40980 INFO keystone.cmd.bootstrap [None req-bf6c40d0-5cb8-4300-af05-210c506ad29f - - - - - -] Created role service
    2024-09-15 15:05:00.884 40980 INFO keystone.cmd.bootstrap [None req-bf6c40d0-5cb8-4300-af05-210c506ad29f - - - - - -] Granted role admin on project admin to user admin.
    2024-09-15 15:05:00.908 40980 INFO keystone.cmd.bootstrap [None req-bf6c40d0-5cb8-4300-af05-210c506ad29f - - - - - -] Granted role admin on the system to user admin.
    2024-09-15 15:05:00.934 40980 WARNING py.warnings [None req-bf6c40d0-5cb8-4300-af05-210c506ad29f - - - - - -] /usr/lib/python3.9/site-packages/pycadf/identifier.py:71: UserWarning: Invalid uuid: RegionOne. To ensure interoperability, identifiers should be a valid uuid.
      warnings.warn(('Invalid uuid: %s. To ensure interoperability, '
    
    2024-09-15 15:05:00.944 40980 INFO keystone.cmd.bootstrap [None req-bf6c40d0-5cb8-4300-af05-210c506ad29f - - - - - -] Created region RegionOne
    2024-09-15 15:05:01.009 40980 INFO keystone.cmd.bootstrap [None req-bf6c40d0-5cb8-4300-af05-210c506ad29f - - - - - -] Created public endpoint http://openstack-vip.net:5000/v3/
    2024-09-15 15:05:01.043 40980 INFO keystone.cmd.bootstrap [None req-bf6c40d0-5cb8-4300-af05-210c506ad29f - - - - - -] Created internal endpoint http://openstack-vip.net:5000/v3/
    2024-09-15 15:05:01.076 40980 INFO keystone.cmd.bootstrap [None req-bf6c40d0-5cb8-4300-af05-210c506ad29f - - - - - -] Created admin endpoint http://openstack-vip.net:5000/v3/
  6. 配置 Apache HTTP 服务器

    编辑 /etc/httpd/conf/httpd.conf 文件 , 并配置 ServerName 选项以引用控制节点:

    [root@node01 ~]# vi /etc/httpd/conf/httpd.conf
    ServerName openstack-vip.net:80

    以上主要修改了httpd的servername监听地址 , 其实这里不修改也行 , 不影响 ; 重要的是下面的配置 ;

    把/usr/share/keystone/wsgi-keystone.conf连接至/etc/httpd/conf.d/下

    [root@node01 ~]# ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/
    [root@node01 ~]# ll /etc/httpd/conf.d/
    total 16
    -rw-r--r-- 1 root root 2916 Aug  9 00:30 autoindex.conf
    -rw-r--r-- 1 root root  400 Aug  9 00:30 README
    -rw-r--r-- 1 root root 1252 Aug  9 00:28 userdir.conf
    -rw-r--r-- 1 root root  653 Aug  9 00:28 welcome.conf
    lrwxrwxrwx 1 root root   38 Sep 15 15:14 wsgi-keystone.conf -> /usr/share/keystone/wsgi-keystone.conf

    以上操作就是把httpd代理keystone的配置导入到httpd中 , 默认安装keystone以后就会有一个这样的配置文件 ; 我们只需要把这个配置文件软连接到httpd的配置目录下即可 ;

    启动httpd , 并设置为开机启动

    [root@node01 ~]# systemctl enable --now httpd
    Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
    [root@node01 ~]# ss -tnlp
    State              Recv-Q             Send-Q                         Local Address:Port                         Peer Address:Port             Process                                                                                                                                       
    LISTEN             0                  128                                  0.0.0.0:22                                0.0.0.0:*                 users:(("sshd",pid=957,fd=3))                                                                                                                
    LISTEN             0                  511                                        *:5000                                    *:*                 users:(("httpd",pid=41092,fd=6),("httpd",pid=41091,fd=6),("httpd",pid=41090,fd=6),("httpd",pid=41082,fd=6))                                  
    LISTEN             0                  128                                     [::]:22                                   [::]:*                 users:(("sshd",pid=957,fd=4))                                                                                                                
    LISTEN             0                  511                                        *:80                                      *:*                 users:(("httpd",pid=41092,fd=4),("httpd",pid=41091,fd=4),("httpd",pid=41090,fd=4),("httpd",pid=41082,fd=4))                                  
    [root@node01 ~]# systemctl status httpd
    ● httpd.service - The Apache HTTP Server
         Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; preset: disabled)
         Active: active (running) since Sun 2024-09-15 15:17:04 CST; 16s ago
           Docs: man:httpd.service(8)
       Main PID: 41082 (httpd)
         Status: "Total requests: 0; Idle/Busy workers 100/0;Requests/sec: 0; Bytes served/sec:   0 B/sec"
          Tasks: 197 (limit: 177683)
         Memory: 73.6M
            CPU: 504ms
         CGroup: /system.slice/httpd.service
                 ├─41082 /usr/sbin/httpd -DFOREGROUND
                 ├─41084 /usr/sbin/httpd -DFOREGROUND
                 ├─41085 "(wsgi:keystone-" -DFOREGROUND
                 ├─41086 "(wsgi:keystone-" -DFOREGROUND
                 ├─41087 "(wsgi:keystone-" -DFOREGROUND
                 ├─41088 "(wsgi:keystone-" -DFOREGROUND
                 ├─41089 "(wsgi:keystone-" -DFOREGROUND
                 ├─41090 /usr/sbin/httpd -DFOREGROUND
                 ├─41091 /usr/sbin/httpd -DFOREGROUND
                 └─41092 /usr/sbin/httpd -DFOREGROUND
    
    Sep 15 15:17:04 node01 systemd[1]: Starting The Apache HTTP Server...
    Sep 15 15:17:04 node01 httpd[41082]: Server configured, listening on: port 5000, port 80
    Sep 15 15:17:04 node01 systemd[1]: Started The Apache HTTP Server.

    如果能够看到5000端口正常监听 , 说明我们导入的配置没有问题 ;

  7. 通过设置适当的环境变量来配置管理帐户:

    export OS_USERNAME=admin
    export OS_PASSWORD=ADMIN_PASS
    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

    此处显示的这些值是从 keystone-manage bootstrap创建的默认值。

    keystone-manage bootstrap命令中的密码用于取代上面的ADMIN_PASS

    这里直接创建一个脚本文件keystone_admin.rc, 用于导入对应变量

    [root@node01 ~]# cat keystone_admin.rc 
    export OS_USERNAME=admin
    export OS_PASSWORD=e1cf389264501c270fef
    export OS_PROJECT_NAME=admin
    export OS_USER_DOMAIN_NAME=Default
    export OS_PROJECT_DOMAIN_NAME=Default
    export OS_AUTH_URL=http://openstack-vip.net:5000/v3
    export OS_IDENTITY_API_VERSION=3
    
    [root@node01 ~]# echo $OS_USERNAME
    admin
  8. 这里由于配置了高可用的域名, 需要额外在高可用节点上添加haproxy配置

    [root@ha1 ~]# cat /etc/haproxy/haproxy.cfg 
    ...
    listen openstack_keystone_port
        bind 192.168.71.250:5000
        mode tcp
        log global
        server 192.168.71.11 192.168.71.11:5000 check inter 3000 fall 3 rise 5

6.3 在控制端创建域、项目、用户和角色

6.3.1 默认配置

这一步在最新的openstack中默认已经自动配置完成

  • 在控制端创建domain域, 创建default域

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

    删除默认域的命令 , 创建好就不要删除了

    [root@node01 ~]#  openstack domain delete 47c0915c914c49bb8670703e4315a80f 
  • 创建一个admin的项目 并把域指向default

    [root@node01 ~]# openstack project create --domain default --description "Admin Project" admin
    +-------------+----------------------------------+
    | Field       | Value                            |
    +-------------+----------------------------------+
    | description | Admin Project                    |
    | domain_id   | 47c0915c914c49bb8670703e4315a80f |
    | enabled     | True                             |
    | id          | b4e56eeb160948c581e98d685133d19a |
    | is_domain   | False                            |
    | name        | admin                            |
    | parent_id   | 47c0915c914c49bb8670703e4315a80f |
    | tags        | []                               |
    +-------------+----------------------------------+
  • 创建admin用户并设置密码为admin

    [root@node01 ~]# openstack user create --domain default --password-prompt admin
    User Password:
    Repeat User Password:
    +---------------------+----------------------------------+
    | Field               | Value                            |
    +---------------------+----------------------------------+
    | domain_id           | 47c0915c914c49bb8670703e4315a80f |
    | enabled             | True                             |
    | id                  | a105f256dc9f42438212e9d96d46b60d |
    | name                | admin                            |
    | options             | {}                               |
    | password_expires_at | None                             |
    +---------------------+----------------------------------+

    查看此时创建的用户名 , 可以看到账号是admin

    [root@node01 ~]# openstack user list
    +----------------------------------+-------+
    | ID                               | Name  |
    +----------------------------------+-------+
    | a105f256dc9f42438212e9d96d46b60d  | admin |
    +----------------------------------+-------+
  • 创建admin角色

    [root@node01 ~]# openstack role create admin
    +-----------+----------------------------------+
    | Field     | Value                            |
    +-----------+----------------------------------+
    | domain_id | None                             |
    | id        | 7f1f7aa119034c2fbd15b46b90632d18 |
    | name      | admin                            |
    +-----------+----------------------------------+
  • 给admin用户授权 , 将admin用户授予admin项目的admin角色

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

6.3.2 测试

  1. 创建一个用于测试的demo项目

    [root@node01 ~]# openstack project create --domain default --description "Demo Project" demo
    +-------------+----------------------------------+
    | Field       | Value                            |
    +-------------+----------------------------------+
    | description | Demo Project                     |
    | domain_id   | default                          |
    | enabled     | True                             |
    | id          | a183bc3c4a4d4c83b78cf56b38804882 |
    | is_domain   | False                            |
    | name        | demo                             |
    | options     | {}                               |
    | parent_id   | default                          |
    | tags        | []                               |
    +-------------+----------------------------------+
  2. 创建demo用户并设置密码为demo

    [root@node01 ~]# openstack user create --domain default --password-prompt demo
    User Password:
    Repeat User Password:
    +---------------------+----------------------------------+
    | Field               | Value                            |
    +---------------------+----------------------------------+
    | domain_id           | default                          |
    | enabled             | True                             |
    | id                  | c6bab906341d42b99f0c1c714e45b0b7 |
    | name                | demo                             |
    | options             | {}                               |
    | password_expires_at | None                             |
    +---------------------+----------------------------------+
  3. 创建一个user角色

    [root@node01 ~]# openstack role create user
    +-------------+----------------------------------+
    | Field       | Value                            |
    +-------------+----------------------------------+
    | description | None                             |
    | domain_id   | None                             |
    | id          | 179722ea544c428daa72f23227955dcd |
    | name        | user                             |
    | options     | {}                               |
    +-------------+----------------------------------+
  4. 把demo用户添加到demo项目 , 然后赋予user角色权限

    [root@node01 ~]# openstack role add --project demo --user demo user
    [root@node01 ~]# 
  5. 验证:查看现有的用户、项目、角色、域是否是我们创建的

    [root@node01 ~]# openstack user list 
    +----------------------------------+-------+
    | ID                               | Name  |
    +----------------------------------+-------+
    | dbf5c34d74fc47efad862220f8f84b5f | admin |
    | c6bab906341d42b99f0c1c714e45b0b7 | demo  |
    +----------------------------------+-------+
    [root@node01 ~]# openstack project list 
    +----------------------------------+-------+
    | ID                               | Name  |
    +----------------------------------+-------+
    | 9b05bf0c98b24add999507856db2dac5 | admin |
    | a183bc3c4a4d4c83b78cf56b38804882 | demo  |
    +----------------------------------+-------+
    [root@node01 ~]# openstack role list 
    +----------------------------------+---------+
    | ID                               | Name    |
    +----------------------------------+---------+
    | 05faf76692994c71a8b5a03efe3d527a | reader  |
    | 179722ea544c428daa72f23227955dcd | user    |
    | 7f69cadf5b0e4a5ab75042ec0dbd50cd | admin   |
    | b14c0e49e1814002a787f695f88952ba | manager |
    | b2513b9860e24bcca2e40171101040af | member  |
    | c9c6bc5be83e4148a8328262d9e585d1 | service |
    +----------------------------------+---------+
    [root@node01 ~]# openstack domain list
    +---------+---------+---------+--------------------+
    | ID      | Name    | Enabled | Description        |
    +---------+---------+---------+--------------------+
    | default | Default | True    | The default domain |
    +---------+---------+---------+--------------------+
    
    #查看用户对应角色
    [root@node01 ~]# openstack role assignment list --user demo
    +----------------------------------+----------------------------------+-------+----------------------------------+--------+--------+-----------+
    | Role                             | User                             | Group | Project                          | Domain | System | Inherited |
    +----------------------------------+----------------------------------+-------+----------------------------------+--------+--------+-----------+
    | 179722ea544c428daa72f23227955dcd | c6bab906341d42b99f0c1c714e45b0b7 |       | a183bc3c4a4d4c83b78cf56b38804882 |        |        | False     |
    +----------------------------------+----------------------------------+-------+----------------------------------+--------+--------+-----------+

    这里user里面的demo,project中的demo,role中的 user 均是手动创建的。其他是openstack自动创建的。

6.4 在控制端注册服务

最新的版本已经将注册服务在安装的过程中通过keystone-manage bootstrap在之前的步骤中已经实现了。这里显示以前版本的配置过程。具体安装流程可以参考官网。

这里之所以写该章节, 主要是为了对照参考

  1. 创建一个service项目,各服务之间与keystone进行访问和认证,service用于给服务创建用户;

    [root@node01 ~]# openstack project create --domain default service
    +-------------+----------------------------------+
    | Field       | Value                            |
    +-------------+----------------------------------+
    | description |                                  |
    | domain_id   | default                          |
    | enabled     | True                             |
    | id          | aeab9b51961a4a7a9ba5e1d018f30f9d |
    | is_domain   | False                            |
    | name        | service                          |
    | options     | {}                               |
    | parent_id   | default                          |
    | tags        | []                               |
    +-------------+----------------------------------+

  2. 创建一个keystone认证服务

    [root@node01 ~]# openstack service create  --name keystone --description "OpenStack Identity" identity
    +-------------+----------------------------------+
    | Field       | Value                            |
    +-------------+----------------------------------+
    | description | OpenStack Identity               |
    | enabled     | True                             |
    | id          | a32cffed26924a87b21b4e86e00c63b4 |
    | name        | keystone                         |
    | type        | identity                         |
    +-------------+----------------------------------+
  3. 查看当前服务列表

    [root@node01 ~]# openstack service list
    +----------------------------------+----------+----------+
    | ID                               | Name     | Type     |
    +----------------------------------+----------+----------+
    | a32cffed26924a87b21b4e86e00c63b4 | keystone | identity |
    +----------------------------------+----------+----------+
  4. 创建endpoint(注册服务)

    创建公共端

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

    创建私有端

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

    创建管理端

    [root@node01 ~]# openstack endpoint create --region RegionOne identity admin http://controller:5000/v3
    +--------------+----------------------------------+
    | Field        | Value                            |
    +--------------+----------------------------------+
    | enabled      | True                             |
    | id           | 3bd05493999b462eb4b4af8d5e5c1fa9 |
    | interface    | admin                            |
    | region       | RegionOne                        |
    | region_id    | RegionOne                        |
    | service_id   | a32cffed26924a87b21b4e86e00c63b4 |
    | service_name | keystone                         |
    | service_type | identity                         |
    | url          | http://controller:5000/v3        |
    +--------------+----------------------------------+
    [root@node01 ~]#
  • 看看endpoint 列表是否都已经有我们刚才创建的三个端点?

    [root@node01 ~]# openstack endpoint list
    +----------------------------------+-----------+--------------+--------------+---------+-----------+---------------------------+
    | ID                               | Region    | Service Name | Service Type | Enabled | Interface | URL                       |
    +----------------------------------+-----------+--------------+--------------+---------+-----------+---------------------------+
    | 3bd05493999b462eb4b4af8d5e5c1fa9 | RegionOne | keystone     | identity     | True    | admin     | http://controller:5000/v3 |
    | 5293ad18db674ea1b01d8f401cb2cf14 | RegionOne | keystone     | identity     | True    | public    | http://controller:5000/v3 |
    | 6593f8d808094b01a6311828f2ef72bd | RegionOne | keystone     | identity     | True    | internal  | http://controller:5000/v3 |
    +----------------------------------+-----------+--------------+--------------+---------+-----------+---------------------------+

    实际上新版本的endpoint如下

    [root@node01 ~]# openstack endpoint list 
    +----------------------------------+-----------+--------------+--------------+---------+-----------+-----------------------------------+
    | ID                               | Region    | Service Name | Service Type | Enabled | Interface | URL                               |
    +----------------------------------+-----------+--------------+--------------+---------+-----------+-----------------------------------+
    | 2d2d670d66a043b0816bfe8e763652de | RegionOne | keystone     | identity     | True    | internal  | http://openstack-vip.net:5000/v3/ |
    | bbb2a4b96e3b4d469ec5951bf6ba1319 | RegionOne | keystone     | identity     | True    | public    | http://openstack-vip.net:5000/v3/ |
    | c407e7ff5b294f0e9550d1cdca601162 | RegionOne | keystone     | identity     | True    | admin     | http://openstack-vip.net:5000/v3/ |
    +----------------------------------+-----------+--------------+--------------+---------+-----------+-----------------------------------+

到此keystone服务就配置完了 ; 接下来测试keystone是否可以用来做认证服务

7. keystone安装结果校验

  1. 需要新打开一个shell窗口 , 在没有声明环境变量的情况下执行下面命令

    [root@node01 ~]# export OS_IDENTITY_API_VERSION=3
    [root@node01 ~]#  echo $OS_IDENTITY_API_VERSION  
    3
    [root@node01 ~]# cat keystone_admin.rc 
    export OS_USERNAME=admin
    export OS_PASSWORD=e1cf389264501c270fef
    export OS_PROJECT_NAME=admin
    export OS_USER_DOMAIN_NAME=Default
    export OS_PROJECT_DOMAIN_NAME=Default
    export OS_AUTH_URL=http://openstack-vip.net:5000/v3
    export OS_IDENTITY_API_VERSION=3
    [root@node01 ~]# openstack --os-auth-url http://openstack-vip.net:5000/v3 --os-project-domain-name default --os-user-domain-name default  --os-project-name admin  --os-username admin --os-password e1cf389264501c270fef token issue
    +------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | Field      | Value                                                                                                                                                                                   |
    +------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | expires    | 2024-09-15T15:24:02+0000                                                                                                                                                                |
    | id         | gAAAAABm5u4CJHs9SejInGmThRo5c4w2KsfQd6ZXc1puk3QkjT3p6uWaA_du9p8ROIcGkw3jLgezBpzKV4b6MKb_gtZBm3uE4hX93muQKSTrhgQor6WEMa8e58KRSjXlMbyIxO67NfgMIeV_peYKdTd4FjCixD-cOsKDM7l--2HyYc5sJBqYfvU |
    | project_id | 9b05bf0c98b24add999507856db2dac5                                                                                                                                                        |
    | user_id    | dbf5c34d74fc47efad862220f8f84b5f                                                                                                                                                        |
    +------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

    这里用户名和密码相关信息, 是之前安装步骤中已经配置好的, 这里命令返回一个表 , 记录的有过期时长 , id,和项目id和用户id;如果输入密码错误则不会返回这些内容 , 其实这些内容主要用来描述返回给用户token属性 , 我们可以理解它就是返回了这样一个token给我们 ;

  2. 使用admin用户环境变量脚本

    [root@node01 ~]# cat keystone_admin.rc 
    export OS_USERNAME=admin
    export OS_PASSWORD=e1cf389264501c270fef
    export OS_PROJECT_NAME=admin
    export OS_USER_DOMAIN_NAME=Default
    export OS_PROJECT_DOMAIN_NAME=Default
    export OS_AUTH_URL=http://openstack-vip.net:5000/v3
    export OS_IDENTITY_API_VERSION=3
    export OS_IMAGE_API_VERSION=2

    这里可以额外创建demo的环境变量脚本

    [root@node01 ~]# chmod a+x demo.sh 
    [root@node01 ~]# cat demo.sh 
    #!/bin/bash
    export OS_PROJECT_DOMAIN_NAME=Default
    export OS_USER_DOMAIN_NAME=Default
    export OS_PROJECT_NAME=demo
    export OS_USERNAME=demo
    export OS_PASSWORD=demo
    export OS_AUTH_URL=http://openstack-vip.net:5000/v3
    export OS_IDENTITY_API_VERSION=3
    export OS_IMAGE_API_VERSION=2

    有了上面两个脚本以后 , 我们就实现要使用那个用户测试 , 直接把对应的用户环境变量导出即可 ;

  3. 测试admin用户的环境变量脚本是否可用?

    [root@node01 ~]# . keystone_admin.rc 
    [root@node01 ~]# openstack token issue
    +------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | Field      | Value                                                                                                                                                                                   |
    +------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | expires    | 2024-09-15T15:32:06+0000                                                                                                                                                                |
    | id         | gAAAAABm5u_mtQ4SXhCp8vTfKlecSP3babiQgBK6OAusY3zu8Y_kZJFQaQyU5tUnqkkOnrScku58w8XU1UqWukn19KDFpKgjP2c1i1gr0j-b4b-3kfH68cLePPMAwROSqQoFE-g4JOBaxbj59GbabLh4PlMwyMSbCOO79BENe8pifXWyA59GTnI |
    | project_id | 9b05bf0c98b24add999507856db2dac5                                                                                                                                                        |
    | user_id    | dbf5c34d74fc47efad862220f8f84b5f                                                                                                                                                        |
    +------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

    重新开一个终端,导出admin用户环境变量,然后直接使用openstack token issue命令就能验证admin用户;有了这个环境变量脚本,我们不用输密码和不用写那么长的命令了;

  4. 验证demo用户的环境变量脚本

    [root@node01 ~]# . demo.sh 
    [root@node01 ~]# openstack token issue
    +------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | Field      | Value                                                                                                                                                                                   |
    +------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | expires    | 2024-09-15T15:32:59+0000                                                                                                                                                                |
    | id         | gAAAAABm5vAbxRhpadZdA1YsL6_kW4s6D2rOVQYb9M_Bfp29F5XGgEgU0JvJ0EOrsZv3mgEihvl-2TPtc_4EZ3RjMbXa3z6RnHVY-508mJx2mLsAQIb36eFArWoehQAEsphIKDz6YovHaz7tOIQn6-RqFIYVkcJ9HZVFTFPDMd8kj4ZOoQx_bLg |
    | project_id | a183bc3c4a4d4c83b78cf56b38804882                                                                                                                                                        |
    | user_id    | c6bab906341d42b99f0c1c714e45b0b7                                                                                                                                                        |
    +------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

    demo用户的环境变量脚本也都能够正常通过验证;到此keystone服务的安装配置测试就完成了;


参考链接

玩转企业云计算平台系列 ( 三 ) : Openstack 身份认证服务 Keystone (qq.com)

云计算OpenStack - Keystone - SkyBiuBiu - 博客园 (cnblogs.com)

云计算管理平台之OpenStack认证服务Keystone - Linux-1874 - 博客园 (cnblogs.com)

Openstack之二:服务认证keystone - 一叶知秋~~ - 博客园 (cnblogs.com)