image.png
    Keystone架构:
    为OpenStack提供鉴权服务,当用户请求资源时,需要经过keystone进行权限鉴定,进而看用户是否有足够的资源来调度OpenStack。
    Keystone为其他OpenStack服务提供认证和授权服务,为所有的OpenStack服务提供一个端点目录。每个组件都需要使用统一认证和授权。 keystone 是OpenStack的组件之一,包括身份验证(用户名、密码)、令牌(Token)的发放和校验、访问控制、服务目录(对外提供服务,通过认证后返回相应的Endport)、用户权限的定义等等。云环境中所有的服务之间的授权和认证都需要经过 keystone。
    image.png
    ① Keystone API,接收外部请求,外部请求内部组件时,先向Keystone做身份认证;组件间访问时,收到请求向Keystone做鉴权
    ② Keystone Middleware,缓存Token令牌,减轻Keystone服务的压力
    ③ Keystone Services不同的services提供不同的认证或鉴权服务
    ④ Keystone Backends,实现Keystone服务
    ⑤ Keystone Plugins,提供密码,Token令牌
    Keystone的管理主要是针对Identity,Resource,Assignment,Token,Catalog,Service,同时Openstack各种资源和服务的访问策略由Policy决定。
    当多DC统一管理时,共用一个Keystone,手工指向一个DC的Keystonbbe
    Keystone对象:
    image.png
    Service: OpenStack 的 Service 包括 Compute (Nova)、Block Storage (Cinder)、Object Storage (Swift)、Image Service (Glance) 、Networking Service (Neutron) 等。每个 Service 都会提供若干个 Endpoint,User 通过 Endpoint 访问资源和执行操作。
    Identity:提供身份凭据验证以及用户和用户组的数据,用户必须属于一个域,用户不唯一,域唯一;用户组同样如此,全部由Identity管理,允许增删改查
    Resource:提供有关项目project和域domain的数据,项目本身必须属于一个域,项目名不唯一,域唯一,和用户组一样,如不添加进入域则进入默认域。
    Assignment:角色role和角色分配role assignment的数据,role规定用户可以授权的级别。
    Token:提供用户访问服务的凭证,用户账户信息,相当于用户的元数据。
    Catalog:查询端点注册表,便于外部访问Openstack服务,存放着级联场景下的endpoint
    Policy:访问策略类似于linux中的权限管理,不同角色的用户或用户将会拥有不同的操作权限,用户提交用户名、密码后,Keystone验证后生成Token,操作OpenStack服务的请求必须携带Token,通过端点URL访问服务。
    User:任何可以使用Opnestack的实体,可以是真正的用户,User访问Openstack时,Keystone会对其进行验证。
    Project:Project 用于将 OpenStack 的资源(计算、存储和网络)进行分组和隔离。
    Endpoint:Endpoint 是一个网络上可访问的地址,通常是一个 URL。Service 通过 Endpoint 暴露自己的 API。 Keystone 负责管理和维护每个 Service 的 Endpoint。
    Role:安全包含两部分:Authentication(认证)和 Authorization(鉴权)

    • Authentication 解决的是“你是谁?”的问题
    • Authorization 解决的是“你能干什么?”的问题

    Keystone**对象模型:
    Service:许多内部服务(Identity、Resource、Assignment、Token、Catalog)以组合方式使用,与其他外部服务进行交互融合,比如镜像、存储。
    Identity:提供身份凭据验证以及用户和用户组的数据,用户必须属于一个域,用户不唯一,域唯一;用户组同样如此,全部由Identity管理,允许增删改查
    Resource:提供有关项目project和域domain的数据,项目本身必须属于一个域,项目名不唯一,域唯一,和用户组一样,如不添加进入域则进入默认域。
    Assignment:角色role和角色分配role assignment的数据,role规定用户可以授权的级别。
    Token:提供用户访问服务的凭证,用户账户信息,相当于用户的元数据。
    Catalog:查询端点注册表,便于外部访问Openstack服务
    Policy:访问策略类似于linux中的权限管理,不同角色的用户或用户将会拥有不同的操作权限,用户提交用户名、密码后,Keystone验证后生成Token,操作OpenStack服务的请求必须携带Token,通过端点URL访问服务。
    Keystone最重要的工作是认证,Keystone支持多种认证方式。
    image.png
    基于令牌认证:**生产环境中常用的是基于令牌的认证方式,目前OpenStack新发布版本默认采用Fernet令牌。

    • UUID通用唯一标识码,长度固定位32字节的随机字符串,但是以UUID形式返回token,每次都需要到keystone认证,造成性能瓶颈;
    • PKI—基础公钥服务,PKI的本质就是基于数字签名,Keystone私钥对令牌进行数字签名,各个 OpenStack服务的API server用公钥在本地验证该令牌。
    • PKIZ—基于前者进行压缩,但是压缩的效果不好;
    • Fernet对称加密,基于前二者令牌会保存在Keystone的数据库中,导致数据库需要人工定期清理,并且会导致性能下降,由此产生了Fernet令牌,无需存在数据库中,只需定期更换密钥。目前Openstack默认选择Fernet令牌。

    基于外部认证:使用第三方认证系统
    基于本地认证:默认认证方式,即用户和密码认证
    Openstack认证流程:
    image.png

    用户提交用户名和口令,申请Token给Keystone,发送创建虚拟机请求,Head中携带Token给Nova-api,Nova-api检验Token是否有效给Keystone,Token通过接口透传到Nova-compute进行网口相关操作,这时Head中还携带Token发送给Neutron-server,最后再由Neutron-server发送给Keystone完成创建虚机认证流程。
    鉴权:组件api收到请求后,拿Token向Keystone鉴权,Keystone根据Token进行鉴权