• OpenStack入门篇(七)之认证服务Keystone


    一、Keystone的概述

    Keystone是Openstack的组件之一,用于为Openstack家族中的其它组件成员提供统一的认证服务,包括身份验证,令牌的发放和校验,服务列表,用户权限的定义等。Openstack中任何组件均依赖与Keystone提供的服务。

    二、Keystone的功能

    用户与认证

    用户权限与用户行为追踪。

    服务目录

    为每个组件服务提供一个可用的服务目录和相应的API入口端点。

    三、Keystone基本概念

    User

    使用服务的用户,可以是人,服务或者系统,只要是使用了openstack服务的对象都可以称为用户。当User对OpenStack进行访问时,Keystone会对其身份进行验证。

    Project

    租户,可以理解为一个人、项目或者组织拥有的资源的合集。在一个租户中可以拥有很多个用户,这些用户可以根据权限的划分使用租户中的资源。

    Token

    指的是一串比特值或者字符串,用来作为访问资源的令牌。Token中含有可访问资源的范围和有效时间。

    Role

    角色,用于分配操作的权限。角色可以被指定给用户,使得该用户获得角色对应的操作权限。安全包含两部分:Authentication(认证)和 Authorization(鉴权)

    Service

    Openstack Service,即Openstack中运行的组件服务。nova,glance都是属于一个服务,需要在keystone上进行创建,指定类型。
    创建服务有一个服务,就创建一个endpoint,会根据服务类型去查找那个服务。Service 决定每个 Role 能做什么事情 ,Service 通过各自的 policy.json 文件对 Role 进行访问控制

    Endpoint

    一个可以通过网络来访问和定位某个Openstack Service的地址,通常是一个URL。例如,Nova需要访问Glance服务去获取Image时,Nova通过访问Keystone拿到Glance的Endpoint,然后通过访问该Endpoint去获取Glance服务,我们可以通过Endpoint的region属性去定义多个region。Endpoint该使用对象分为三类:

    1. Admin URL:给admin用户使用,被从常规的访问中分离。
    2. Internal URL:Openstack内部服务使用来跟别的服务通信,只能被局域网访问。
    3. Public URL:其它用户可以访问的地址,可以被全局访问。
    4. User 通过 Endpoint 访问资源和执行操作

    Credentials

    用于确认用户身份的凭证。

    Authentication

    确定用户身份的过程。

    四、Keystone形象比喻

    如果把宾馆比作为Openstack,那么宾馆的中央管理系统就是Keystone,入住宾馆的人就是User 。在宾馆中拥有很多不同的房间,房间提供了不同的服务(Service)。

    在入住宾馆前,User需要给出身份证(Credential),中央管理系统(Keystone)在确认User的身份后(Authenticaiton),会给你一个房卡(Token)和导航地图(Endpoint)。

    不同VIP(Role)级别的User,拥有不同权限的房卡(Token),如果你的VIP(Role)等级高,你可以享受到豪华的总统套房。

    User拿着房卡(Token)和地图(Endpoint),就可以进入特定的房间去享受不同的Services。每一个服务(Services)中都拥有着一些特定资源(Project),例如,按摩服务中可以使用的精油种类和数量。User可以根据自己的权限来使用这些资源。

    五、Keystone与其它服务的交互

    六、Keystone V3 API特性

    Keystone V3 做出了许多变化和改进,我们选取其中较为重要的进行阐述:
    将 Tenant 改称为 Project
    引入 Domain 的概念
    引入 Group 的概念
    将 Tenant 改为 Project 并在其上添加 Domain 的概念,这更加符合现实世界和云服务的映射。
    V3 利用 Domain 实现真正的多租户(multi-tenancy)架构,Domain 担任 Project 的高层容器。云服务的客户是 Domain 的所有者,他们可以在自己的 Domain 中创建多个 Projects、Users、Groups 和 Roles。通过引入 Domain,云服务客户可以对其拥有的多个 Project 进行统一管理,而不必再向过去那样对每一个 Project 进行单独管理。

    Group 是一组 Users 的容器,可以向 Group 中添加用户,并直接给 Group 分配角色,那么在这个 Group 中的所有用户就都拥有了 Group 所拥有的角色权限。通过引入 Group 的概念,Keystone V3 实现了对用户组的管理,达到了同时管理一组用户权限的目的。这与 V2 中直接向 User/Project 指定 Role 不同,使得对云服务进行管理更加便捷。

    七、Keystone安装配置

    (1)数据库各服务库的创建和授权
    tips:配置 OpenStack 身份认证服务前,必须创建一个数据库和管理员令牌。由于其余服务也需要用到数据库,此处将所有的服务所需要的库都进行创建并授权

    [root@linux-node1 ~]# mysql -uroot -p
    Enter password: 
    Welcome to the MariaDB monitor.  Commands end with ; or g.
    Your MariaDB connection id is 10
    Server version: 10.1.20-MariaDB MariaDB Server
    
    Copyright (c) 2000, 2016, 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.00 sec)
    
    MariaDB [(none)]> create database glance;
    Query OK, 1 row affected (0.00 sec)
    
    MariaDB [(none)]> create database nova;
    Query OK, 1 row affected (0.00 sec)
    
    MariaDB [(none)]> create database nova_api;
    Query OK, 1 row affected (0.00 sec)
    
    MariaDB [(none)]> create database neutron;
    Query OK, 1 row affected (0.00 sec)
    
    MariaDB [(none)]> create database cinder;
    Query OK, 1 row affected (0.00 sec)
    
    MariaDB [(none)]> grant all on keystone.* to 'keystone'@'localhost' identified by 'keystone';
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [(none)]> grant all on keystone.* to 'keystone'@'%' identified by 'keystone'; 
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [(none)]> grant all on glance.* to 'glance'@'localhost' identified by 'glance';
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [(none)]> grant all on glance.* to 'glance'@'%' identified by 'glance';
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [(none)]> grant all on nova.* to 'nova'@'localhost' identified by 'nova';
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [(none)]> grant all on nova.* to 'nova'@'%' identified by 'nova';
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [(none)]> grant all on nova_api.* to 'nova'@'localhost' identified by 'nova';
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [(none)]> grant all on nova_api.* to 'nova'@'%' identified by 'nova';
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [(none)]> grant all on neutron.* to 'neutron'@'localhost' identified by 'neutron';
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [(none)]> grant all on neutron.* to 'neutron'@'%' identified by 'neutron'; 
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [(none)]> grant all on cinder.* to 'cinder'@'localhost' identified by 'cinder';
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [(none)]> grant all on cinder.* to 'cinder'@'%' identified by 'cinder';
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [(none)]> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | cinder             |
    | glance             |
    | information_schema |
    | keystone           |
    | mysql              |
    | neutron            |
    | nova               |
    | nova_api           |
    | performance_schema |
    +--------------------+
    9 rows in set (0.00 sec)
    View Code

    (2)keystone服务配置:/etc/keystone/keystone.conf

    在 [database] 部分,配置数据库访问:
    [database]
    ...
    connection = mysql+pymysql://keystone:keystone@192.168.56.11/keystone
    
    在[token]部分,配置Fernet UUID令牌的提供者。
    [token] 
    ... 
    provider = fernet
    driver = memcache

    (3)初始化身份认证服务的数据库,并验证是否初始化成功:

    [root@linux-node1 ]# su -s /bin/sh -c "keystone-manage db_sync" keystone
    [root@linux-node1 ]# mysql -h 192.168.56.11 -ukeystone -pkeystone -e "use keystone;show tables;"

    (4)keystone服务配置:/etc/keystone/keystone.conf

    在 [memcache] 部分,配置token缓存到memcache上:
    servers = 192.168.56.11:11211
    
    设置memcached开机自启动,并设置监听ip地址
    [root@linux-node1 ~]# systemctl enable memcached
    [root@linux-node1 ~]# systemctl start memcached
    [root@linux-node1 ~]# vim /etc/sysconfig/memcached
    PORT="11211"
    USER="memcached"
    MAXCONN="1024"
    CACHESIZE="64"
    OPTIONS="-l 192.168.56.11,::1"
    [root@linux-node1 ~]# systemctl restart memcached
    
    tips:openstack会经常使用driver驱动,更加灵活地选用多种方式。

    (5)查看keystone服务所有的配置

    [root@linux-node1 ~]# grep '^[a-z]' /etc/keystone/keystone.conf 
    connection = mysql+pymysql://keystone:keystone@192.168.56.11/keystone
    servers = 192.168.56.11:11211
    provider = fernet
    driver = memcache

    (6)初始化Fernet key:

    [root@linux-node1 ~]# keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
    [root@linux-node1 ~]# keystone-manage credential_setup --keystone-user keystone --keystone-group keystone
    [root@linux-node1 ~]# cd /etc/keystone/
    [root@linux-node1 keystone]# ll
    总用量 140
    drwx------ 2 keystone keystone     22 12月  4 11:10 credential-keys
    -rw-r----- 1 root     keystone   2303 7月  26 12:47 default_catalog.templates
    drwx------ 2 keystone keystone     22 12月  4 11:10 fernet-keys
    -rw-r----- 1 root     keystone 113658 12月  4 11:07 keystone.conf
    -rw-r----- 1 root     keystone   2639 7月  26 12:48 keystone-paste.ini
    -rw-r----- 1 root     keystone   1046 7月  26 12:47 logging.conf
    -rw-r----- 1 keystone keystone   9742 7月  26 12:48 policy.json
    -rw-r----- 1 keystone keystone    665 7月  26 12:47 sso_callback_template.html

    (7)初始化命令bootstrap,初始化自动创建一个admin用户以及相关权限,直接在keystone上进行注册服务,创建endpoint。

    [root@linux-node1 ~]# keystone-manage bootstrap --bootstrap-password admin    
        --bootstrap-admin-url http://192.168.56.11:35357/v3/    
        --bootstrap-internal-url http://192.168.56.11:35357/v3/    
        --bootstrap-public-url http://192.168.56.11:5000/v3/   
        --bootstrap-region-id RegionOne
    
    [root@linux-node1 ~]# mysql -h 192.168.56.11 -ukeystone -pkeystone
    MariaDB [keystone]> use keystone;
    Database changed
    MariaDB [keystone]> select * from endpointG
    *************************** 1. row ***************************
                    id: 20222ecb6eeb4f378035e79c47810b08
    legacy_endpoint_id: NULL
             interface: public
            service_id: 436e446b475a46fa978349211d6c64eb
                   url: http://192.168.56.11:5000/v3/
                 extra: {}
               enabled: 1
             region_id: RegionOne
    *************************** 2. row ***************************
                    id: 6cc75ee06e5245059e106e89e1643a92
    legacy_endpoint_id: NULL
             interface: internal
            service_id: 436e446b475a46fa978349211d6c64eb
                   url: http://192.168.56.11:35357/v3/
                 extra: {}
               enabled: 1
             region_id: RegionOne
    *************************** 3. row ***************************
                    id: 7c7b33e8c2ac431aa7380ceeac80fb37
    legacy_endpoint_id: NULL
             interface: admin
            service_id: 436e446b475a46fa978349211d6c64eb
                   url: http://192.168.56.11:35357/v3/
                 extra: {}
               enabled: 1
             region_id: RegionOne
    3 rows in set (0.00 sec)

    (8)配置apache http服务器
    tips:kesytone是python写的,apache有一个wsgi模块,可以通过这个模块和python进行通信。端口为5000和35357,缺省情况下,Kestone服务仍然监听这些端口

    ①编辑/etc/httpd/conf/httpd.conf 文件,配置ServerName 选项为控制节点:

    ServerName 192.168.56.11:80

    ②创建一个链接到/usr/share/keystone/wsgi-keystone.conf文件

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

    ③设置apache开机自启动

    [root@linux-node1 ~]# systemctl enable httpd.service
    [root@linux-node1 ~]# systemctl start httpd.service

    (9)开始使用keystone就需要进行验证,有两种方式连接Keystone:第一种方式使用参数,另外一种方式就通过环境变量方式进行连接。

    [root@linux-node1 ~]# vim admin-openstack
    export OS_USERNAME=admin
    export OS_PASSWORD=admin
    export OS_PROJECT_NAME=admin
    export OS_USER_DOMAIN_NAME=default
    export OS_PROJECT_DOMAIN_NAME=default
    export OS_AUTH_URL=http://192.168.56.11:35357/v3
    export OS_IDENTITY_API_VERSION=3
    [root@linux-node1 ~]# openstack user list
    Missing value auth-url required for auth plugin password
    [root@linux-node1 ~]# source admin-openstack 
    [root@linux-node1 ~]# openstack user list
    +----------------------------------+-------+
    | ID                               | Name  |
    +----------------------------------+-------+
    | 5313b45a3c474c7ea18e7272fd037b7d | admin |
    +----------------------------------+-------+

    (10)创建域、项目、用户、角色
    为什么创建service项目?在前面已经概述到一个用户需要属于一个项目(用户组),并且要赋予一种角色(权限)进行管理服务。而其余服务需要连接keystone,需用使用用户名密码连接,那其他服务自然就需要有属于某一个项目,是什么用户,什么角色去连接Keystone。此处默认的域创建为为default,对域的概念不明白可以参考前文。
    在这里:我们分别创建了service项目,并配置了默认的域为default。也创建了glance、nova、neutron、cinder用户,并赋予admin角色,使openstack的服务组件可以与Keystone进行通信。

    [root@linux-node1 ~]# openstack project create --domain default 
    >   --description "Service Project" service
     [root@linux-node1 ~]# openstack project list

    常规(非管理)任务应该使用无特权的项目和用户。作为例子,这里采用demo项目和demo用户
    创建demo项目,demo用户密码,创建use角色并赋予demo用户user角色

    [root@linux-node1 ~]# openstack project create --domain default 
    >   --description "Demo Project" demo
    [root@linux-node1 ~]# openstack user create --domain default 
    >  --password-prompt demo
    [root@linux-node1 ~]# openstack role create user
    [root@linux-node1 ~]# openstack role add --project demo --user demo user

    创建glance、nova、neutron、cinder用户,并赋予admin角色

    [root@linux-node1 ~]# openstack user create --domain default 
    >  --password-prompt glance
    [root@linux
    -node1 ~]# openstack role add --project service --user glance admin
    [root@linux
    -node1 ~]# openstack user create --domain default > --password-prompt nova
    [root@linux
    -node1 ~]# openstack role add --project service --user nova admin [root@linux-node1 ~]# openstack user create --domain default > --password-prompt neutron
    [root@linux
    -node1 ~]# openstack role add --project service --user neutron admin [root@linux-node1 ~]# openstack user create --domain default > --password-prompt cinder
    [root@linux
    -node1 ~]# openstack role add --project service --user cinder admin [root@linux-node1 ~]# openstack user list +----------------------------------+---------+ | ID | Name | +----------------------------------+---------+ | 23aefbc43cd24bcd8e6a78d527cb1002 | nova | | 3c24e5584ce447a0b80c659d6daecd13 | demo | | 5313b45a3c474c7ea18e7272fd037b7d | admin | | 666df293c18541fcafffffac3b8587fe | glance | | cb278a7d54a4470387fe4bd88a64ee95 | neutron | | d628cec48ab8407494605aa0022dd953 | cinder | +----------------------------------+---------+ [root@linux-node1 ~]# openstack project list +----------------------------------+---------+ | ID | Name | +----------------------------------+---------+ | 02aaf7ba97114238b1d8169fedabb9be | demo | | 21a45d59913d4c05b46ad3ec92e61656 | admin | | 56e253935a6049b69140f4aebac8bb6a | service | +----------------------------------+---------+

    (11)验证操作:在安装其他服务之前确认身份认证服务操作
    在控制节点(192.168.56.11)上操作这些命令
    ①因为安全性的原因,关闭临时认证令牌机制,撤销临时环境变量OS_AUTH_URL和OS_PASSWORD

    [root@linux-node1 ~]# unset OS_AUTH_URL OS_PASSWORD

    ②作为 admin 用户,请求认证令牌:

    [root@linux-node1 ~]# openstack --os-auth-url http://192.168.56.11:35357/v3   --os-project-domain-name default --os-user-domain-name default   --os-project-name admin --os-username admin token issue

    ③作为demo 用户,请求认证令牌:

    [root@linux-node1 ~]# openstack --os-auth-url http://192.168.56.11:5000/v3   --os-project-domain-name default --os-user-domain-name default   --os-project-name demo --os-username demo token issue

    tips:能够正常获取到tonken,说明keystone服务是正常。

    (12)创建 OpenStack 客户端环境脚本
    ① 创建 admin 和 demo项目和用户创建客户端环境变量脚本

    [root@linux-node1 ~]# cat admin-openstack 
    export OS_USERNAME=admin
    export OS_PASSWORD=admin
    export OS_PROJECT_NAME=admin
    export OS_USER_DOMAIN_NAME=default
    export OS_PROJECT_DOMAIN_NAME=default
    export OS_AUTH_URL=http://192.168.56.11:35357/v3
    export OS_IDENTITY_API_VERSION=3
    
    [root@linux-node1 ~]# cat demo-openstack 
    export OS_USERNAME=demo
    export OS_PASSWORD=demo
    export OS_PROJECT_NAME=demo
    export OS_USER_DOMAIN_NAME=default
    export OS_PROJECT_DOMAIN_NAME=default
    export OS_AUTH_URL=http://192.168.56.11:5000/v3
    export OS_IDENTITY_API_VERSION=3
    export OS_IMAGE_API_VERSION=2

    ②加载admin-openrc文件来身份认证服务的环境变量位置和admin项目和用户证书:

    [root@linux-node1 ~]# source admin-openstack 

    ③ 请求认证令牌:

    [root@linux-node1 ~]# openstack token issue
    +------------+------------------------------------------------------------------------------------+
    | Field      | Value                                                                              |
    +------------+------------------------------------------------------------------------------------+
    | expires    | 2018-01-15 05:09:39+00:00                                                          |
    | id         | gAAAAABaXCmDx9x7k_ZU0gCh2qCnfEv0Z4P8MoGWEkUeC19cNKBEEVviW9DV3OM3O53gm3OzJZ_4Wf8OJx |
    |            | Q8ErmFV3qUF7GMzfVbCkwaPJAIPQWveopglMWdhKuT4IYNWBQV_frC69agmGKw1NIGSeNgQgdlGkrn7kzQ |
    |            | 2u-ThWPFQPXzfAFZq24                                                                |
    | project_id | 71c9b608e79546f4b90f710fea475de3                                                   |
    | user_id    | fa4237d31d5145f78b87a29fbcc7ec0c                                                   |
    +------------+------------------------------------------------------------------------------------+

    到此,Keystone服务就算配置完成了。
    OpenStack 排查问题的方法主要是通过日志。 
    每个 Service 都有自己的日志文件。

    Keystone 主要有两个日志: 
    keystone.log 和 keystone_access.log 
    保存在 /var/log/apache2/ 目录里。

    如果需要得到最详细的日志信息,可以在 /etc/keystone/keystone.conf 中打开 debug 选项

    八、总结Keystone常见错误

    401 #验证失败,keystone相关用户账户密码设置错误,时间不同步,或者输入的项目名称不对
    403 #可能未初始化OS_token变量,需要使用source命令使其生效,也可能是配置的配置文件未生效,需要重启相关服务
    409 #keystone创建用户,用户已存在
    500 #服务器内部错误,服务配置有问题,看日志,检查配置
    503 #keystone相关账户密码设置有问题,请将相关的glance账户删除,重新创建即可
    服务故障 #相关服务没有起来

    Keystone的配置/etc/keystone/keystone.conf总结:
    ①由于Keystone需要使用数据库,需要配置数据库的连接
    ②由于需要将token存储到memcache,减少对数据库的访问,需要配置memcached服务器地址和端口
    ③由于tonken的生成是基于某种算法,此处选用的是fernet方式,需要配置令牌提供者为fernet
    ④在选用memcache作为缓存token的方式,需要配置驱动方式(driver)

  • 相关阅读:
    ASA5505升级license
    Elasticsearch-URL查询实例解析
    awk和sed
    ftp无法上传问题
    linux使用storcli64查看硬盘信息
    Centos7中kubernetes-1.11.2基于配置亲和与反亲和
    Centos7使用kubeadm部署kubernetes-1.11.2
    内网映射3种方法
    centos6.5使用LVM
    centos7部署openstack-ocata
  • 原文地址:https://www.cnblogs.com/linuxk/p/9282996.html
Copyright © 2020-2023  润新知