openstack-keystone简记

  • 验证

    • 概念
      • 租户(tenant)
        • openstack的组织方式
        • 一个租户=一个nova的project-id
      • 用户(user)
        • 代表个体,openstack用user的形式授权
        • 一个user=一个证书(credentials)
          - 一个证书可分配给1~N个租户
          - 验证后,每个tenant会分配有一个特定令牌
          
      • 证书(credentials)
        • 唯一标识一个keystone user的密码/其他信息
      • 令牌(token)
        • 任意比特的文本
        • 两种类型
          - scoped:代表某个tenant验证过的user
          - unscoped:仅代表一个user
          
        • 有效期有限,随时可被撤回
      • 角色(role)
        • 某个tenant的权限集合
  • 服务目录

    • 服务(service)
      • nova,glance,swift等
    • 端点(endpoint)
      • 一个uri
    • 模板(template)
      • 端点的集合
  • credential的处理和存储方式

    • openstack的做法应该是
      1.给每个公司分配一个userId,对应有一个证书
      2.给每个用户建立多个项目,称为租户
      3.证书可以分配给租户,但使用时的,是通过证书生成的令牌
      4.令牌有期限,可撤换(类似oauth协议)
    • 存储证书方式:
      • keystone存储证书的方式,有多种选择, 从内置的sql 到 ldap
        • kvs
          - 内存型方式
          - 最简单的backend,只需支持主键查询
          
        • sql
          - 内置的是sqlite
          - 用SQLAlchemy持久存储
          
        • pam
          - 使用OS提供的pam机制,以完成
               - 授权
               - user-tenant的一对一关系
                    - 需root权限
          
        • ldap
          - 内置的是一个ldap的桩实现(FakeLdap)
          

backends/

 --> sql.py
           --> Identity.authenticate(self, user_id, tenant_id, password):
                     user_ref = self._get_user(user_id)
                     通过user_id获取user的信息
                --> Identity._check_password(self, password, user_ref):
                          return utils.check_password(password, user_ref.get('password'))
                          调用统一的password校验方法
                     --> utils.check_password (password, hashed): (common/utils.py)
                                password_utf8 = password转为utf编码
                                return passlib.hash.sha512_crypt.verify(password_utf8, hashed)
                                调用独立的第三方库passlib中的方法

keystone backends/

 --> 使用sql的处理方式
           --> Identity.authenticate(self, user_id, tenant_id, password):
                     通过user_id获取user的信息
                --> Identity._check_password(self, password, user_ref):
                          调用统一的password校验方法
                     --> utils.check_password (password, hashed):
                                调用独立的第三方库passlib中的方法,从中可以看出,password传入的是明文,存储的是sha512加密后的结果
                                passlib.hash.sha512_crypt.verify(password_utf8, hashed)

你可能感兴趣的:(openstack,cloud,keystone)