2021SC@SDUSC

KeyStone 简要分析

一,KeyStone是什么
keyStone是openstack中提供identity,token,catalog和policy服务的组件,实现了openstack的身份认证API。

身份认证服务包含了两个基本服务:

  • 用户管理:记录用户和用户所被允许执行的工作。
  • 服务日志:提供一个关于什么服务是被允许的和它们的AP入口位置的日志。
二.KeyStone 架构

KeyStone根据传统,承担了一组内部服务,向外暴露一个或多个服务入口节点。

  1. 身份认证:身份认证服务为用户,租客和角色(for USER,Tenant and Role)提供了认证评估验证和和数据以及相关元数据;
  2. Token:在一个user或者tenant在验证之后,发给其一个Token,Token服务可以验证并管理这些Token(类似cookie)
  3. Catalog:记录所有endpoint(入口)在需要服务时查询catalog即可
  4. Policy:提供基于规范的认证引擎

每个服务可以根据当前环境进行设置来适应当前需求。可以在keystone.conf里设置后端。

  1. KVS Backend:一个简单的后端接口,需要更深入的设置
  2. SQL Backend:一个基于SQLAchemy(python操作SQL的工具包)完成的后端,用于储存数据。
  3. PAM Backend:使用了当前系统的PAM服务用于认证,提供user和tenant一对一关联。(extra)
  4. LDAP Backend:把user和tenant储存在不同的子树中
  5. template Backend:泛式设置keystone

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L05KD1rr-1634377476209)(https://image.slidesharecdn.com/openstackkeystoneidentityservice-121017010633-phpapp01/95/openstack-keystone-identity-service-6-638.jpg?cb=1350436060)]

工作流

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0e9bzASZ-1634377476211)(https://image.slidesharecdn.com/openstackkeystoneidentityservice-121017010633-phpapp01/95/openstack-keystone-identity-service-7-638.jpg?cb=1350436060)]

三,keystone用户管理
1. User:代表一个个体用户,与用户名,密码和email相关联。一个user与一个特定的domain相关,所以username不需要全局唯一,只需要域内唯一。(许多user可以组成一个group,group被一个domain拥有,group名也是域唯一)
2. tenant:一个项目,组织等。 只有tenant才能与openstack服务提出request
3. role:代表一类在指定tenant下的role(可执行的动作)
  1. domain:项目,用户和组织的高层次的容器。参数:域名(全局唯一),角色名,用户名,项目名,组织名(域内唯一)
    不同domain内的用户可以访问不同域的服务
四.应用架构

KeyStone中使用REST API的服务通过HTTP交互

KeyStone中与flask-RESTful相关的方法在keystone.server.flask.common

KeyStone的API资源继承自keystone.server.flask.common.ResourceBase并暴露HTTP方法(GET,PUT,POST,PATCH和DELETE)

class UserResource(ks_flask.ResourceBase):
    collection_key = 'users'
    member_key = 'user'
    get_member_from_driver = PROVIDERS.deferred_provider_lookup(
        api='identity_api', method='get_user')

    def get(self, user_id=None):
        """Get a user resource or list users.
        GET/HEAD /v3/users
        GET/HEAD /v3/users/{user_id}
        """
        ...

    def post(self):
        """Create a user.
        POST /v3/users
        """
        ...

class UserChangePasswordResource(ks_flask.ResourceBase):
    @ks_flask.unenforced_api
     def post(self, user_id):
         ...

API路由

class UserAPI(ks_flask.APIBase):
    _name = 'users'
    _import_name = __name__
    resources = [UserResource]
    resource_mapping = [
        ks_flask.construct_resource_map(
            resource=UserChangePasswordResource,
            url='/users/<string:user_id>/password',
            resource_kwargs={},
            rel='user_change_password',
            path_vars={'user_id': json_home.Parameters.USER_ID}
        ),
     ...
Service和Endpoint的关系
  1. openstack中,每一个service都三种endpoint:Admin,internal和public(创建完service后需要为其创建API EndPoint. )
  2. Admin是用作管理用途的,如它能够修改user/tenant(project)。
  3. public 是让客户调用的,比如可以部署在外网上让客户可以管理自己的云。
  4. internal是openstack内部调用的。
  5. 三种endpoints 在网络上开放的权限一般也不同。Admin通常只能对内网开放,public通常可以对外网开放,internal通常只能对安装有openstack对服务的机器开放。

每个你部署的openstack服务都需要绑定endpoint(存储在keystone中)来提供服一个服务的入口,因而我们第一需要部署的组件就是keystone。

五.小结

nstack对服务的机器开放。

每个你部署的openstack服务都需要绑定endpoint(存储在keystone中)来提供服一个服务的入口,因而我们第一需要部署的组件就是keystone。

五.小结

KeyStone是为用户创建令牌凭证,提供服务入口,为其他openstack服务提供凭证验证服务的组件,是构建openstack服务的第一个组件,并可以为用户授权和定义行为,可以在KeyStone中窥得其他服务及其endpoint。