system: [SYSTEM]

user: 2. 相关工作总结 2.1. OpenStack架构 OpenStack由美国国家航天航空局(NASA)和Rackspace合作开发，Apache许可证开源，是一个旨在提供基础设施即服务的虚拟化管理平台，能够提供可靠的云部署方案 [ 2 ]。OpenStack覆盖了网络、虚拟化、操作系统、服务器等各个方面。OpenStack包含多个组件，各个组件之间既可以相互配合工作也可以独立部署完成各自的功能，在Essex版本之前，OpenStack的各个子项目如Nova、Swift均使用各自独立的认证系统，从Essex版本之后开始全面支持Keystone提供统一的身份认证服务 [ 3 ]。主要模块及功能如下。 2.1.1. 计算(Compute)：Nova 控制器，用于为单个用户或使用群组管理虚拟机实例的整个生命周期，根据用户需求来提供虚拟服务。负责虚拟机创建、开机、关机、挂起、暂停、调整、迁移、重启、销毁等操作，配置CPU、内存等信息规格。 2.1.2. 对象存储(Object Storage)：Swift 用于在大规模可扩展系统中通过内置冗余及高容错机制实现对象存储的系统，允许进行存储或者检索文件。可为Glance提供镜像存储，为Cinder提供卷备份服务。 2.1.3. 镜像服务(Image Service)：Glance 虚拟机镜像查找及检索系统，支持多种虚拟机镜像格式(AKI、AMI、ARI、ISO、QCOW2、Raw、VDI、VHD、VMDK)，有创建上传镜像、删除镜像、编辑镜像基本信息的功能。 2.1.4. 身份服务(Identity Service)：Keystone 为OpenStack其他服务提供身份验证、服务规则和服务令牌的功能，管理Domains、Projects、Users、Groups、Roles。 2.1.5. 网络&地址管理(Network)：Neutron 提供云计算的网络虚拟化技术，为OpenStack其他服务提供网络连接服务。为用户提供接口，可以定义Network、Subnet、Router，配置DHCP、DNS、负载均衡、L3服务，网络支持GRE、VLAN。插件架构支持许多主流的网络厂家和技术，如OpenvSwitch。 2.1.6. 块存储(Block Storage)：Cinder 为运行实例提供稳定的数据块存储服务，它的插件驱动架构有利于块设备的创建和管理，如创建卷、删除卷，在实例上挂载和卸载卷。 2.1.7. UI界面(Dashboard)：Horizon OpenStack中各种服务的Web管理门户，用于简化用户对服务的操作，例如：启动实例、分配IP地址、配置访问控制等。 2.2. OpenStack的认证机制 Keystone中的User指代任何使用OpenStack的实体，可以是真正的用户，其他系统或者服务。当用户请求访问OpenStack时，Keystone会对其进行验证。主要有admin、demo两种用户。admin为OpenStack平台的超级管理员，负责OpenStack服务的管理和访问权限。demo为常规用户。除了admin和demo OpenStack也为nova，cinder，glance，nutron等服务也创建了相应的用户，admin可以对这些用户进行统一的管理。 Keystone中的Credentials是User用来证明自己身份的信息，可以是：用户名/密码、Token、API Key等其他高级方式。 Keystone中的令牌(Token)是一个字符串，每个令牌都拥有一个具体的权限范围，令牌可以确定用户能访问的资源。如果用户每次都采用用户名/密码访问OpenStack API，容易泄露用户信息，带来安全隐患，所以OpenStack要求用户访问其API前，必须先获取Token，然后Token作为用户凭据再进行访问。用户向Keystone发送验证请求，并提交证书，Keystone验证证书响应请求为用户颁发一个身份认证令牌Token。 Keystone中的Project用于将OpenStack的资源(计算、存储和网络)进行分组和隔离。根据OpenStack服务对象不同，Project可以是一个租户、部门或者项目云。在Openstack中资源的所有权属于Project而不是用户，每个用户必须挂在Project里才能访问该Project的资源。一个用户可以属于多个Project。 keystone中的Endpoint是一个网络上可以访问的地址，通常是一个URL。各个服务通过Endpoint暴露自己的API。Keystone负责管理和维护每个服务的Endpoint。 keystone中的Role表示用户角色，代表特定的租户中的用户操作权限。 Keystone用于为OpenStack中的其它组件成员提供统一的认证服务，包括身份验证、令牌的发放和校验、服务列表、用户权限的定义等等。OpenStack中所有的服务之间的授权和认证都需要经过Keystone。因此Keystone是云平台中第一个立即需要安装的服务。作为OpenStack的基础支持服务，Keystone主要用于管理用户及其权限、维护OpenStack services的endpoint (服务地址)、Authentication (认证)和Authorization (鉴权)。 OpenStack的请求服务流程如图1所示： 图1. Keystone的认证及请求服务流程 用户通过Horizon可视化界面提供Credentials给Keystone，其中Credentials为用户用来证明自己身份的信息，可以是用户名/密码、Token、API Key或者其他高级方式。Keystone验证通过后返还给用户令牌(Token)，用户使用分配的Token进行对其他服务的访问，提供Token和访问请求到目标地址，其他服务请求Keystone验证Token并返回结果来判断用户是否有该权限，从而选择是否给用户提供服务。 2.3. Keystone现有的认证方式及缺陷 2.3.1. UUID认证方式 用户在登陆时通过HorizonWEB前端的管理界面服务输入自己的用户名/密码或者用户名密码环境变量。Keystone验证用户名密码，并且生成Token。 客户端存储UUID token然后发送具体的执行请求给服务节点，服务节点发送Token给keystone请求keystone辅助验证，Keystone从http请求中获取Token，并检查Token有效性并返回结果给服务节点。若token有效则处理结果并返回客户端结果，若Token失败则拒绝客户但请求，并返回401。 UUID token简单易用，且长度仅为32Byte，此外，Token的生命周期很短，默认是24 h，这意味着用户在Token过期后需要重新进行身份认证 [ 4 ]。同时这种认证方式也容易给Keystone带来性能问题，因为UUID token不携带其它信息，OpenStack API收到该Token后，既不能判断该Token是否有效，更无法得知该Token携带的用户信息。每当OpenStack API收到用户请求，都需要向Keystone验证该Token是否有效。随着集群规模的扩大，Keystone需处理大量验证Token的请求，在高并发下容易出现性能问题。UUID认证方式如图2所示： 图2. UUID认证方式 2.3.2. PKI认证 Keystone相当于一个权威的认证中心，他用自己和的私钥对用户的Token进行签名。OpenStack服务中的每一个API节点都有一份Keystone签发的证书，失效列表和根证书。API不用在直接去Keystone认证Token是否合法，只需要根据Keystone的证书和失效列表就可以确定Token是否合法。但是这里还是会有每次都需要请求Keystone去获取失效列表的操作，不可避免。与UUID相比，PKI token携带更多用户信息的同时还附上了数字签名，以支持本地认证。但是因为PKI token携带了更多的信息，这些信息就包括service catalog，随着OpenStack的Region数增多，service catalog携带的endpoint数量越多，很容易超出HTTP协议允许的最大HTTP请求头大小(默认为8 KB)，导致HTTP请求失败。PKI认证方式如图3所示： 图3. PKI认证方式 2.3.3. PKIZ认证 PLIZ与PKI基本一致，但是PKIZ在PKI的基础上做了压缩处理，但是压缩的效果极其有限，一般情况下，压缩后的大小为PKI token的90%左右，所以PKIZ也不能友好的解决Token太大问题。 2.3.4. Fernet认证 Fernet是专为API token设计的一种轻量级安全消息格式，它采用cryptography对称加密库加密Token，具体由AES-CBC加密和散列函数SHA256签名，Token只能通过对称密钥读取和更改，不需要持久化Token，且fernet token只加密必要的信息，长度一般不超过255字节，避免了PKI token过大的问题。同时fernet token不需要存储于数据库，减少了磁盘的IO，解决了Keystone数据库由于存储了大量的Token导致性能变差，需要经常清理Token的问题。但为了提高安全性，需要采用需要定时更换对称密钥。Fernet认证方式如图4所示： 图4. Fernet认证方式 Token类型的选择涉及多个因素，包括Keystone服务器的负载、安全因素、维护成本以及Token本身的成熟度。从安全的角度上看，UUID方式中每个请求都带着一个Token，Token不管到哪个服务，该服务都会先去验证Token的合法性，然后再去执行用户请求的操作 [ 5 ]，但无需维护密钥，PKI token需要妥善保管Keystone服务器上的私钥，Fernet token需要周期性的更换密钥，均有不同的优势和不足，因此从安全、维护成本和成熟度上看，UUID token > PKI token/PKIZ token > Fernet token，所以综合比较Keystone选择的默认认证方式为UUID。因为原有的认证方式均无法同时兼顾效率和安全性，这里我们利用组合公钥(CPK)技术提出一种全新的基于用户标识的身份认证协议，来改善认证系统。