• keystone命令与client接口学习


    keystone学习
    ------------------
    Keystone(OpenStack Identity Service)是OpenStack框架中,负责身份验证、服务规则和服务令牌的功能, 它实现了OpenStack的IdentityAPI。Keystone类似一个服务总线, 或者说是整个Openstack框架的注册表, 其他服务通过keystone来注册其服务的Endpoint(服务访问的URL),任何服务之间相互的调用, 需要经过Keystone的身份验证, 来获得目标服务的Endpoint来找到目标服务。

    Keystone基本概念介绍
            1. User
      User即用户,他们代表可以通过keystone进行访问的人或程序。Users通过认证信息(credentials,如密码、API Keys等)进行验证。

      2. Tenant
      Tenant即租户,它是各个服务中的一些可以访问的资源集合。例如,在Nova中一个tenant可以是一些机器,在Swift和Glance中一个tenant可以是一些镜

    像存储,在Quantum中一个tenant可以是一些网络资源。Users默认的总是绑定到某些tenant上。

      3. Role
      Role即角色,Roles代表一组用户可以访问的资源权限,例如Nova中的虚拟机、Glance中的镜像。Users可以被添加到任意一个全局的 或 租户内的角色中。

    在全局的role中,用户的role权限作用于所有的租户,即可以对所有的租户执行role规定的权限;在租户内的role中,用户仅能在当前租户内执行role规定的权限。

      4. Service
      Service即服务,如Nova、Glance、Swift。根据前三个概念(User,Tenant和Role)一个服务可以确认当前用户是否具有访问其资源的权限。但是当一个user尝试着访问其租户内的service时,他必须知道这个service是否存在以及如何访问这个service,这里通常使用一些不同的名称表示不同的服务。在上文中谈到的Role,实际上也是可以绑定到某个service的。例如,当swift需要一个管理员权限的访问进行对象创建时,对于相同的role我们并不一定也需要对nova进行管理员权限的访问。为了实现这个目标,我们应该创建两个独立的管理员role,一个绑定到swift,另一个绑定到nova,从而实现对swift进行管理员权限访问不会影响到Nova或其他服务。

      5. Endpoint
      Endpoint,翻译为“端点”,我们可以理解它是一个服务暴露出来的访问点,如果需要访问一个服务,则必须知道他的endpoint。因此,在keystone中包含一个endpoint模板(endpoint template,在安装keystone的时候我们可以在conf文件夹下看到这个文件),这个模板提供了所有存在的服务endpoints信息。一个endpoint template包含一个URLs列表,列表中的每个URL都对应一个服务实例的访问地址,并且具有public、private和admin这三种权限。public url可以被全局访问(如http://compute.example.com),private url只能被局域网访问(如http://compute.example.local),admin url被从常规的访问中分离。

    WSGI API(包头)
    当成功验证后中间件经为下行的WSGI应用发送如下包头:
    X-Identity-Status
    提供请求是否被验证的信息。
    X-Tenant
    提供了租户ID(在Keystone中以URL的形式出现)。在Keysotne转为采用ID/Name模式之前,它为租户提供了对任意遗留实现的支持。
    X-Tenant-Id
    唯一不变的租户ID。
    X-Tenant-Name
    唯一但可变的租户名字。
    X-User
    用于登录的用户名。
    X-Roles
    分配给用户的角色。



    命令流程
    --------------------
    1. 获取token(一个unscoped token,没有 和tenant绑定)  
     首先,需要确认你将访问那个tenant,必须使用keystone来获取一个unscoped token(意味着这个token没有和特定的tenant绑定),这个unscoped token能够用来深入查询keystone service,确定你能访问哪些tenants。获取一个unscoped token,使用典型的REST API,在request的body中不指定tenantName。

    2. 获取tenants  
    接下来的一步是,使用unscoped token来获取能访问的tenants,其中租期已经由你分配的角色决定了,对于每个tenant,都有一个确定的角色。所有在service endpoint上执行的操作都需要一个scoped token。获取能访问的tenants,使用 GET /tenants keystone API,其中将unscoped token写入X-Auth-Token。得到一个tenants数组,包含了能够访问的tenants。

    3. 获取scoped tokens  
    获取了能够访问的tenants之后,决定访问某个tenants,就开始需要获取一个scoped token,这个scoped token与某个特定的tenant绑定,能够提供这个tenant的metadata和在tenant中的角色。获取scoped token需要使用POST /tokens keystone API,像第一步一样,这有两种形式的API。  
    更重要的是,其中包含了一组service endpoints。这些endpoints 确定了获取的token能够访问的服务,Keystone service manage都是基于service/endpoing catalog的.通过这些endpoings,决定访问其中的service。

    4. 使用scoped tokens  
    现在已经获取了scoped tokens,并且知道了endpoint API的url,下一步就是调用这些service endpoint。在这一步,使用keystone来确证token的有效性。存在两种类型的token,一种基于UUID的,一种基于PKI(Public Key Infrastructure)。

    5. 验证role metadata  
    Endpoint service 使用token的metadata来验证用户能够访问请求的服务。这一般都涉及到Role Base Access Control(RBAC)。基于服务的policy.json文件,使用rule engine来决定用户的token包含适当的角色访问。  

    6. 请求服务  
    到此,user就能够去通过api访问有权限访问的资源。

    一个unscoped tokens例子:

    一个scoped tokens例子:
    client SDK使用
    ------------------
    1. 使用
    >>> from keystoneclient.v2_0 import client
    >>> keystone = client.Client(...)
    >>> keystone.tenants.list() # List tenants

    2. 获得权限
    >>> from keystoneclient.v2_0 import client
    >>> username='adminUser'
    >>> password='secreetword'
    >>> tenant_name='openstackDemo'
    >>> auth_url='http://192.168.206.130:5000/v2.0'
    >>> keystone = client.Client(username=username, password=password,
    ...                          tenant_name=tenant_name, auth_url=auth_url)

    3. 建立租户  
    >>> from keystoneclient.v2_0 import client
    >>> keystone = client.Client(...)
    >>> keystone.tenants.create(tenant_name="openstackDemo",
    ...                         description="Default Tenant", enabled=True)

    4. 建立用户 
    >>> from keystoneclient.v2_0 import client
    >>> keystone = client.Client(...)
    >>> tenants = keystone.tenants.list()
    >>> my_tenant = [x for x in tenants if x.name=='openstackDemo'][0]
    >>> my_user = keystone.users.create(name="adminUser",
    ...                                 password="secretword",
    ...                                 tenant_id=my_tenant.id)

    5. 建立角色和增加用户
    >>> from keystoneclient.v2_0 import client
    >>> keystone = client.Client(...)
    >>> role = keystone.roles.create('admin')
    >>> my_tenant = ...
    >>> my_user = ...
    >>> keystone.roles.add_user_role(my_user, role, my_tenant)

    6. 建立服务和endpoints
    >>> from keystoneclient.v2_0 import client
    >>> keystone = client.Client(...)
    >>> service = keystone.services.create(name="nova", service_type="compute",
    ...                                    description="Nova Compute Service")
    >>> keystone.endpoints.create(
    ...     region="RegionOne", service_id=service.id,
    ...     publicurl="http://192.168.206.130:8774/v2/%(tenant_id)s",
    ...     adminurl="http://192.168.206.130:8774/v2/%(tenant_id)s",


    参考
    ----------------
    2. openstack keystone流程分析:http://www.cnblogs.com/liuan/p/3194499.html 





  • 相关阅读:
    Failed to fetch URl https://dl-ssl.google.com/android/repository/addo Android SDK更新以及ADT更新出现问题的解决办法
    空白文章
    Win7下搭建安卓android开发环境
    《转》武​汉​的​I​T​公​司
    《转》四本与携程相关的书
    《转》奇迹在坚持中
    《C#高级编程》学习笔记----c#内存管理--栈VS堆
    jQuery源码分析-each函数
    栈和队列(3)----算法
    栈和队列(2)----排序
  • 原文地址:https://www.cnblogs.com/hustlijian/p/3603992.html
Copyright © 2020-2023  润新知