云边日落 问君能有几多愁,恰似一江春水向东流。 (五代·李煜·虞美人)
博主 云边日落
渝ICP备2021002886号-1渝公网安备50022502000591号博主 9月23日 在线自豪地使用 Typecho 建站搭配使用 🌻Sunny 主题当前在线 4 人
歌曲封面 未知作品
  • 歌曲封面“魔女の宅急便”~ルージュの伝言松任谷由実

渝ICP备2021002886号-1

渝公网安备50022502000591号

网站已运行 4 年 107 天 16 小时 45 分

Powered by Typecho & Sunny

5 online · 42 ms

Title

openstack——Keystone

酒笙

·

·

100次阅读
OpenStack
Article
⚠️ 本文最后更新于2021年07月11日,已经过了1183天没有更新,若内容或图片失效,请留言反馈

{lamp/}

{card-describe title="OpenStack———keystone"}

Keystone——身份服务

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

Keystone提供路径指引服务前提

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

主要功能

身份认证(Authentication) :令牌的发放和校验
用户授权(Authorization):授予用户在一个服务中所拥有权限
用户管理(Account) :管理用户账户
服务目录(Service Catalog):提供可用服务的API端点

主要管理对象

User、Credentials、Authentication、Token、Project、Service、Endpoint、Role
User:指使用Openstack service的用户。
Project(Tenant):可以理解为一个人、或服务所拥有的资源集合。
Role:用于划分权限。通过给User指定Role,使User获得Role对应操作权限
Authentication:确定用户身份的过程。
Token:是一个字符串表示,作为访问资源的令牌。Token包含了在指定范围和有效时间内,可以被访问的资源。
Credentials:用于确认用户身份的凭证。用户的用户名和密码,或者是用户名和API密钥,或者身份管理服务提供的认证令牌。
Service: Openstack service,即Openstack中运行的组件服务。如swift、glance、neutron、cinder等。
Endpoint:一个可以通过网络来访问和定位某个Openstack service的地址,通常是一个URL。

Keystone认证流程图

Test
{/card-describe}

{lamp/}

初始化数据库

♾️ autohotkey 代码:
#登录数据库,密码为000000
mysql -u root -p000000

创建Keystone数据库

♾️ python 代码:
CREATE DATABASE keystone;

授予对Keystone数据库的适当访问权限

♾️ python 代码:
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY '000000';
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY '000000';
#之后exit退出数据库

具体执行结果图

♾️ python 代码:
[root@ct ~]# mysql -u root -p
Enter password: #输入数据库密码000000
MariaDB [(none)]> create database keystone;
Query OK, 1 row affected (0.003 sec)
MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY '000000';
Query OK, 0 rows affected (0.013 sec)
MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY '000000';
Query OK, 0 rows affected (0.000 sec)
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.004 sec)
MariaDB [(none)]> exit
Bye

部署ketstone以及相关组件

安装软件包

♾️ python 代码:
yum install openstack-keystone httpd mod_wsgi -y

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

♾️ python 代码:
vim /etc/keystone/keystone.conf

在[database]中,配置数据库访问:

♾️ python 代码:
connection=mysql+pymysql://keystone:000000@controller/keystone

在该[token]中,配置Fernet令牌提供者:

♾️ python 代码:
provider = fernet

填充身份服务数据库

♾️ python 代码:
su -s /bin/sh -c "keystone-manage db_sync" keystone

查看keystone再数据库中是否有了数据

♾️ python 代码:
mysql -u root -p000000 -e"use keystone;show tables;"

输入如下:

♾️ python 代码:
+------------------------------------+
| Tables_in_keystone                 |
+------------------------------------+
| access_rule                        |
| access_token                       |
| application_credential             |
| application_credential_access_rule |
| application_credential_role        |
| assignment                         |
| config_register                    |
| consumer                           |
| credential                         |
| endpoint                           |
| endpoint_group                     |
| federated_user                     |
| federation_protocol                |
| group                              |
| id_mapping                         |
| identity_provider                  |
| idp_remote_ids                     |
| implied_role                       |
| limit                              |
| local_user                         |
| mapping                            |
| migrate_version                    |
| 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                 |
+------------------------------------+

初始化Fernet密钥存储库

♾️ python 代码:
keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
keystone-manage credential_setup --keystone-user keystone --keystone-group keystone
#此命令没有输出

配置bootstrap身份认证服务

♾️ python 代码:
keystone-manage bootstrap --bootstrap-password 000000 \
  --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
  • 此步骤是初始化openstack,会把openstack的admin用户的信息写入到mysql的user表中,以及url等其他信息写入到mysql的相关表中;
  • admin-url是管理网(如公有云内部openstack管理网络),用于管理虚拟机的扩容或删除;如果共有网络和管理网是一个网络,则当业务量大时,会造成无法通过openstack的控制端扩容虚拟机,所以需要一个管理网;
  • internal-url是内部网络,进行数据传输,如虚拟机访问存储和数据库、zookeeper等中间件,这个网络是不能被外网访问的,只能用于企业内部访问
  • public-url是共有网络,可以给用户访问的(如公有云) ,但是此环境没有这些网络,则公用同一个网络
  • 5000端口是keystone提供认证的端口
  • 需要在haproxy服务器上添加一条listen
  • 各种网络的url需要指定controler节点的域名,一般是haproxy的vip的域名(高可用模式)

    配置Apache HTTP服务器

    编辑/etc/httpd/conf/httpd.conf文件并配置

    ♾️ python 代码:
    vi /etc/httpd/conf/httpd.conf

    添加或者修改如下:

    ♾️ python 代码:
    ServerName controller

    一键修改方式如下:

    ♾️ python 代码:
    echo "ServerName controller" >> /etc/httpd/conf/httpd.conf

    创建配置文件
    安装完mod_wsgi包后,会生成 wsgi-keystone.conf 这个文件,文件中配置了虚拟主机及监听了5000端口,mod_wsgi就是python的网关

    ♾️ python 代码:
    ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/

    开启服务

    ♾️ python 代码:
    #配置开机自启
    systemctl enable httpd.service
    systemctl start httpd.service

    查看状态

    ♾️ python 代码:
    systemctl status httpd

    结果如下就代表启动成功

    ♾️ python 代码:
    [root@controller ~]# systemctl status httpd
    ● httpd.service - The Apache HTTP Server
     Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
     Active: active (running) since 六 2021-06-26 14:36:21 CST; 42min ago
       Docs: man:httpd(8)
             man:apachectl(8)
    Process: 41854 ExecStop=/bin/kill -WINCH ${MAINPID} (code=exited, status=0/SUCCESS)
     Main PID: 41866 (httpd)
     Status: "Total requests: 111; Current requests/sec: 0; Current traffic:   0 B/sec"
      Tasks: 42
     CGroup: /system.slice/httpd.service
             ├─41866 /usr/sbin/httpd -DFOREGROUND
             ├─41867 /usr/sbin/httpd -DFOREGROUND
             ├─41868 /usr/sbin/httpd -DFOREGROUND
             ├─41869 /usr/sbin/httpd -DFOREGROUND
             ├─41870 (wsgi:keystone- -DFOREGROUND
             ├─41871 (wsgi:keystone- -DFOREGROUND
             ├─41872 (wsgi:keystone- -DFOREGROUND
             ├─41873 (wsgi:keystone- -DFOREGROUND
             ├─41874 (wsgi:keystone- -DFOREGROUND
             ├─41875 /usr/sbin/httpd -DFOREGROUND
             ├─41876 /usr/sbin/httpd -DFOREGROUND
             ├─41877 /usr/sbin/httpd -DFOREGROUND
             ├─41878 /usr/sbin/httpd -DFOREGROUND
             ├─41879 /usr/sbin/httpd -DFOREGROUND
             ├─41917 /usr/sbin/httpd -DFOREGROUND
             ├─41940 /usr/sbin/httpd -DFOREGROUND
             ├─41977 /usr/sbin/httpd -DFOREGROUND
             └─42004 /usr/sbin/httpd -DFOREGROUND
    
    6月 26 14:36:21 controller systemd[1]: Stopped The Apache HTTP Server.
    6月 26 14:36:21 controller systemd[1]: Starting The Apache HTTP Server...
    6月 26 14:36:21 controller systemd[1]: Started The Apache HTTP Server.

    配置管理员账户的环境变量

  • 这些环境变量用于创建角色和项目使用,但是创建角色和项目需要有认证信息,所以通过环境变量声明用户名和密码等认证信息,欺骗openstack已经登录且通过认证,这样就可以创建项目和角色;也就是把admin用户的验证信息通过声明环境变量的方式传递给openstack进行验证,实现针对openstack的非交互式操作

    ♾️ python 代码:
    export OS_USERNAME=admin
    export OS_PASSWORD=000000
    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
    #这样配置之后,重启服务器虎会失效

    写入~/.bashrc文件下

    ♾️ python 代码:
    cat >> ~/.bashrc << EOF
    export OS_USERNAME=admin    //控制台登陆用户名
    export OS_PASSWORD=000000     //控制台登陆密码
    export OS_PROJECT_NAME=admin
    export OS_USER_DOMAIN_NAME=Default
    export OS_PROJECT_DOMAIN_NAME=Default
    export OS_AUTH_URL=http://ct:5000/v3
    export OS_IDENTITY_API_VERSION=3
    export OS_IMAGE_API_VERSION=2
    EOF
    source ~/.bashrc

    配置了环境变量就可以进行一些openstack操作

    ♾️ python 代码:
    [root@controller ~]# openstack user list
    +----------------------------------+-----------+
    | ID                               | Name      |
    +----------------------------------+-----------+
    | 93450284697642e781348aa5f20ff00b | admin     |
    | ef8b6d926c4a430eb0cceb5a39328bda | myuser    |
    | 80d23ee16f4b40b7acc5ea9d0257c5ba | glance    |
    | 1c1fa588362a4b5a96d7b90a5cb128ec | placement |
    | 8daac410d454453a850ab4371e7356c0 | nova      |
    +----------------------------------+-----------+
    

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

  • 创建一个项目(project),创建在指定的domain(域)中,指定描述信息,project名称为service(可使用openstack domain list 查询)

    ♾️ python 代码:
    #创建新域
    openstack domain create --description "An Example Domain" example

    结果如下

    ♾️ python 代码:
    +-------------+----------------------------------+
    | Field       | Value                            |
    +-------------+----------------------------------+
    | description | Service Project                  |
    | domain_id   | default                          |
    | enabled     | True                             |
    | id          | 70a6fc6eb82f48dfa3d66d5389dcea3e |
    | is_domain   | False                            |
    | name        | service                          |
    | options     | {}                               |
    | parent_id   | default                          |
    | tags        | []                               |
    +-------------+----------------------------------+
    

    创建角色(可使用openstack role list查看)

    ♾️ python 代码:
    openstack project create --domain default --description "Service Project" service

    结果如下

    ♾️ python 代码:
    +-------------+----------------------------------+
    | Field       | Value                            |
    +-------------+----------------------------------+
    | description | Service Project                  |
    | domain_id   | default                          |
    | enabled     | True                             |
    | id          | 70a6fc6eb82f48dfa3d66d5389dcea3e |
    | is_domain   | False                            |
    | name        | service                          |
    | options     | {}                               |
    | parent_id   | default                          |
    | tags        | []                               |
    +-------------+----------------------------------+

    创建普通用户的项目和用户

    ♾️ python 代码:
    openstack project create --domain default --description "Demo Project" myproject

    结果如下

    ♾️ python 代码:
    +-------------+----------------------------------+
    | Field       | Value                            |
    +-------------+----------------------------------+
    | description | Demo Project                     |
    | domain_id   | default                          |
    | enabled     | True                             |
    | id          | 329rhdd32y2f48dfa3d66d5389dcea3e |
    | is_domain   | False                            |
    | name        | myproject                        |
    | options     | {}                               |
    | parent_id   | default                          |
    | tags        | []                               |
    +-------------+----------------------------------+

    再次输入指令

    ♾️ python 代码:
    openstack user create --domain default --password-prompt myuser

    结果如下

    ♾️ python 代码:
    #会输入密码,不要输错了
    +-------------+------------------------------------------+
    | Field               | Value                            |
    +-------------+------------------------------------------+
    | domain_id           | default                          |
    | enabled             | True                             |
    | id                  | d0e42f995f29415c87705af0e7754ddc |
    | name                | user                             |
    | options             | {}                               |
    | password_expires_at | None                             |
    +-------------+------------------------------------------+

    创建myrole角色

    ♾️ python 代码:
    openstack role create myrole

    结果如下

    ♾️ python 代码:
    +-------------+----------------------------------+
    | Field       | Value                            |
    +-------------+----------------------------------+
    | description | None                             |
    | domain_id   | None                             |
    | id          | d0e42f995f29415c87705af0e7754ddc |
    | name        | user                             |
    | options     | {}                               |
    +-------------+----------------------------------+

    将myrole角色添加到myproject项目和myuser用户

    ♾️ python 代码:
    openstack role add --project myproject --user myuser myrole
    验证认证服务

    查看是否可以不指定密码就可以获取到token信息

    ♾️ python 代码:
    openstack token issue
    ♾️ python 代码:
    +------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | Field      | Value                                                                                                                                                                                   |
    +------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | expires    | 2021-02-18T09:27:10+0000                                                                                                                                                                |
    | id         | gAAAAABgLiTedvBu5lIbeJPJ-gUoWoIJx_NpRWcaTFjWf-oN_x5q6AhkYN0WUBvlLKR8nO9RJRJmczdvOlD9h7Kl-Cp-d3Fvd3knzrhY8nEKKW2TA16JTd6KmN9UeczQtQL9nLJn5wnum8AQ6OLp_mfYukFMC7tlBKDfYa8Eugxoj164BwTfeTg |
    | project_id | 667d2c1d9fca46a690b830e6864580c9                                                                                                                                                        |
    | user_id    | 09a752a6b18d48f2ae1f472599e94c5a                                                                                                                                                        |
    +------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

    到这里,keystone部署完毕

    总结

    到这里,我们就已经完成了对keystone的部署,那么接下来就是镜像服务Glance,那么今天的学习就到这里啦,明天再见了。
    最后我们来听歌放松一下吧

{music id="433059656" color="#b922b4" /}

现在已有 0 条评论,0 人点赞
Author:酒笙
作者
openstack——Keystone
当前文章累计共 15124 字,阅读大概需要 4 分钟。
python文件读取与写入
2022年8月19日 · 0评论
阿里云——ECS
2021年7月2日 · 0评论
浅谈列表
2021年4月6日 · 0评论
Comment:共0条
发表
搜 索 消 息 足 迹
你还不曾留言过..
你还不曾留下足迹..
博主 不再显示
博主