设为首页收藏本站language 语言切换
查看: 1077|回复: 0
收起左侧

[分享] KeyStone 简要分析

[复制链接]
 成长值: 65045
发表于 2023-7-26 10:44:51 | 显示全部楼层 |阅读模式
KeyStone 简要分析一,KeyStone是什么keyStone是openstack中提供identity,token,catalog和policy服务的组件,实现了openstack的身份认证API。
  • 1

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

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

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

  • 身份认证:身份认证服务为用户,租客和角色(for USER,Tenant and Role)提供了认证评估验证和和数据以及相关元数据;

  • Token:在一个user或者tenant在验证之后,发给其一个Token,Token服务可以验证并管理这些Token(类似cookie)

  • Catalog:记录所有endpoint(入口)在需要服务时查询catalog即可

  • Policy:提供基于规范的认证引擎


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

  • KVS Backend:一个简单的后端接口,需要更深入的设置
  • SQL Backend:一个基于SQLAchemy(python操作SQL的工具包)完成的后端,用于储存数据。
  • PAM Backend:使用了当前系统的PAM服务用于认证,提供user和tenant一对一关联。(extra)
  • LDAP Backend:把user和tenant储存在不同的子树中
  • template Backend:泛式设置keystone
三,keystone用户管理
1. User:代表一个个体用户,与用户名,密码和email相关联。一个user与一个特定的domain相关,所以username不需要全局唯一,只需要域内唯一。(许多user可以组成一个group,group被一个domain拥有,group名也是域唯一)
2. tenant:一个项目,组织等。 只有tenant才能与openstack服务提出request
3. role:代表一类在指定tenant下的role(可执行的动作)
  • 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的关系
  • openstack中,每一个service都三种endpoint:Admin,internal和public(创建完service后需要为其创建API EndPoint. )
  • Admin是用作管理用途的,如它能够修改user/tenant(project)。
  • public 是让客户调用的,比如可以部署在外网上让客户可以管理自己的云。
  • internal是openstack内部调用的。
  • 三种endpoints 在网络上开放的权限一般也不同。Admin通常只能对内网开放,public通常可以对外网开放,internal通常只能对安装有openstack对服务的机器开放。

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

五.小结

nstack对服务的机器开放。

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

五.小结

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



您需要登录后才可以回帖 登录 | 论坛注册

本版积分规则

QQ|Archiver|手机版|小黑屋|sitemap|鸿鹄论坛 ( 京ICP备14027439号 )  

GMT+8, 2025-5-23 02:38 , Processed in 0.071155 second(s), 22 queries , Redis On.  

  Powered by Discuz!

  © 2001-2025 HH010.COM

快速回复 返回顶部 返回列表