Tomstrong 2017-11-29
本文将介绍 OpenStack Identity,它提供了对其他所有 OpenStack 项目进行身份验证的一种常见方法。
每项多用户服务都需要一些机制来管理哪些人可以访问应用程序,以及每个人可以执行哪些操作。私有云也不例外,而且 OpenStack 已经将这些功能简化为一个单独的称为 Keystone 的项目。
Keystone 是 OpenStack Identity 的项目名称,该服务通过 OpenStack 应用程序编程接口 (API) 提供令牌、策略和目录功能。与其他 OpenStack 项目一样,Keystone 表示一个抽象层。它并不实际实现任何用户管理功能;而是会提供插件接口,以便组织可以利用其当前的身份验证服务,或者从市场上的各种身份管理系统中进行选择。
Keystone 集成了用于身份验证、策略管理和目录服务的 OpenStack 功能,这些服务包括注册所有租户和用户,对用户进行身份验证并授予身份验证令牌,创建横跨所有用户和服务的策略,以及管理服务端点目录。身份管理系统的核心对象是用户 — 使用 OpenStack 服务的个人、系统或服务的数字表示。用户通常被分配给称作租户的容器,该容器会将各种资源和身份项目隔离开来。租户可以表示一个客户、帐户或者任何组织单位。
身份验证是确定用户是谁的过程。Keystone 确认所有传入的功能调用都源于声明发出请求的用户。该过程通过测试凭证形式的声明来执行这一验证。凭证数据的显著特性就是它应该只供拥有数据的用户访问。该数据中可以只包含用户知道的数据(用户名称和密码或密钥),用户通过物理方式处理的一些信息(硬件令牌),或者是用户的一些 ”实际信息”(视网膜或指纹等生物特征信息)。
在 OpenStack Identity 确认完用户的身份之后,它会给用户提供一个证实该身份并且可以用于后续资源请求的令牌。每个令牌都包含一个作用范围,列出了对其适用的资源。令牌只在有限的时间内有效,如果需要删除特定用户的访问权限,也可以删除该令牌。
安全策略是借助一个基于规则的授权引擎来实施的。用户经过身份验证后,下一步就是确定身份验证的级别。Keystone 利用角色的概念封装了一组权利和特权。身份服务发出的令牌包含一组身份验证的用户可以假设的角色。然后,由资源服务将用户角色组与所请求的资源操作组相匹配,并做出允许或拒绝访问的决定。
Keystone 的一个附加服务是用于端点发现的服务目录。该目录提供一个可用服务清单及其 API 端点。一个端点就是一个可供网络访问的地址(例如 URL),用户可在其中使用一项服务。所有 OpenStack 服务,包括 OpenStack Compute (Nova) 和 OpenStack Object Storage (Swift),都提供了 Keystone 的端点,用户可通过这些端点请求资源和执行操作。
架构
从架构方面讲,Keystone 非常简单。它处理所有 API 请求,提供 Identity、Token、Catalog 和 Policy 服务。可以通过 API 网络将 Keystone 作为一组已暴露的前端服务进行组织:
Identity 服务验证了身份验证凭证,并提供了所有相关的元数据。 在验证了用户的凭证后,Token 服务将会验证并管理用于验证请求身份的令牌。 Catalog 服务提供了可用于端点发现的服务注册表。 Policy 服务暴露了一个基于规则的身份验证引擎。
每个 Keystone 功能都支持用于集成到异构环境并展示不同功能的后端插件。更常见的一些后端包括:
Key Value Store:一个接口,支持主键 查找,例如内存中的字典。 Memcached:分布式内存缓冲系统。 Structured Query Language (SQL):使用 SQLAlchemy(一个 Python SQL 工具包和 Object Relational Mapper)来永久存储数据。 Pluggable Authentication Module (PAM):使用本地系统的 PAM 服务进行身份验证。 Lightweight Directory Access Protocol (LDAP):通过 LDAP 连接到一个后端字典,例如 Active Directory®,以便验证用户身份并 获取角色信息。
设置
在不同的分发和 OpenStack 版本之间,实际的安装说明也大不相同。通常,这些安装说明可在分发过程中提供。但是,必须完成相同的基础任务。本节将介绍其中涉及的一些概念。
系统要求
OpenStack 依赖于一种 64 位 x86 架构;另外,它是为商用硬件而设计的,所以具有极低的系统要求。它可以在配有包含 8GB RAM 的单个系统上运行整套 OpenStack 项目。对于稍微大一些的安装,可能会将 Keystone 服务与其他项目(例如 Nova 控制器)共同放置在一个位置。但是,为了获得高度可扩展实现,最好使用专用系统进行身份管理。对于单一系统,四核 CPU、32GB RAM 和两个 Gbit 网络适配器是一个不错的起点。
安装
安装指令取决于发行版本,更具体来讲,取决于您选择的包管理实用程序。在许多情况下,必须声明存储库。所以,举例而言,如果您使用的是 Zypper,那么您要用 zypper ar 向 libzypp 公开:
# zypper ar -f http://download.opensuse.org/repositories/Cloud:/OpenStack:/Grizzly/SLE_11_SP3/Cloud:OpenStack:Grizzly.repo
然后,安装所需的 Keystone 数据包,而且数据包管理实用程序应该自动安装所有依赖关系。完整的安装过程取决于您想要得到的配置和所用的 OpenStack 的准确版本。请务必查看安装指南中的权威说明。出于演示之目的,下面提供了 Debian(例如 Ubuntu)、Red Hat (Red Hat Enterprise Linux®, CentOS, Fedora) 和 openSUSE 的一些主要命令:
Debian。在基于 Debian 的系统(例如 Ubuntu)上安装 Keystone,使用以下命令: sudo apt-get install keystonesudo apt-get install python-keystonesudo apt-get install python-keystoneclient Red Hat。在 Red Hat 系统上,使用的命令是: sudo yum install openstack-keystonesudo yum install python-keystonesudo yum install python-keystoneclient openSUSE。使用以下命令: sudo zypper install openstack-keystonesudo zypper install python-keystoneclient
配置
主要 Keystone 配置文件是 keystone.conf,该文件位于 /etc/keystone/ 中。该文件将会识别 [auth] 一节中指定的所有身份验证插件:
methods。列出所有身份验证插件名称。 <plugin name>。指定每种身份验证方法的类。
例如:
[auth]methods = password,token,oauth1password = keystone.auth.plugins.password.Passwordtoken = keystone.auth.plugins.token.Tokenoauth1 = keystone.auth.plugins.oauth1.OAuth
对于插件注册其自己的配置选项来说,目前还没有一种标准机制,但常见的做法是将其自己的部分放入配置文件中。
证书
许多组织正逐渐转向公钥基础架构 (Public Key Infrastructure),因为这是一项高度可扩展的、基于标准的技术。该项技术的一个优势是它允许委托信任(delegated trust),这对身份联合至关重要,但同时也意味着有必要通过一个防篡改的链接向公认的可信认证机构 (CA) 展示真实性。
实际上,这意味必须使用 CA 认证的 X.509 证书来签署公钥。对于完全的内部实现,可能会使用 keystone-manage 来生成一个自签署的证书,但在联合环境中,可能会需要来自外部 CA 的证书。
安装外部 CA 发出的证书涉及到以下操作:
从外部 CA 请求一个签名证书 将证书和私钥转换为 Privacy Enhanced Email (PEM) 格式 通过将 .pem 文件复制到证书目录来安装外部签名证书
使用场景
身份管理是一项支持功能,其有形目的(tangible purpose)要少于大多数其他 OpenStack 项目。应该将该功能视作一个推动因素,它可以简化服务发现,并提供执行安全策略的统一方法。
或许,虚拟化其使用的最简单的方法是将其划分为两部分。Keystone 中的管理功能定义了用户和项目,并分配了适当的授权。在配置好环境之后,项目和应用程序就可以与 Keystone 结合使用,以便执行查询和验证访问控制。
管理
首先来看第一部分,这部分最容易执行,因为该部分映射到了 Horizon 仪表板。管理员可以创建项目和用户。可以给用户分配角色并将其聚集成组来简化管理。
第一步通常是创建一个项目。以管理员身份登录到 OpenStack Dashboard。在导航面板中的 Identify Panel 下,单击 Projects > Create Project。
图 1. 创建新项目
此时,除了名称和描述之外,不需要任何信息。您至少需要一个用户。在 Identity Panel 下,单击 Users > Create User。
图 2. 创建用户
编辑项目。在 Identity Panel 下,单击 Projects > Edit Project。
图 3. 编辑项目
在 Edit Project 窗口中的 Project Members 选项卡下,可以编辑项目成员和更改其角色。
图 4. 编辑项目成员和更改其角色
还可以使用 Quota 选项卡指定项目的限制条件。这在多租户环境中尤其有用,可确保一个项目不会使用过多的资源,也不会遗漏在同一基础架构上运行的其他关键服务。
图 5. 指定项目的限制条件
身份验证
该场景的第二部分是在执行操作时对服务进行身份验证。例如,请考虑一个使用 OpenStack Swift 来实现对象存储的应用程序。无论是否作为 OpenStack 计算实例的一部分运行,都必须能够进行身份验证,这意味着需要访问有效的凭证。
应用程序首先需要连接到身份验证服务并提供其凭证,然后它会接收到一个身份验证令牌,可将该令牌传递给 OpenStack Object Storage,以实现所有容器和对象操作。在有些情况下,可能会使用所有连接参数预先配置应用程序。也可以从 Keystone 中获得这些参数。例如,可以查询 Keystone,发现哪些项目是可以访问的,并请求该项目所需的服务 URL。
结束语
只要坚持使用 Horizon 用户界面,用户管理并不太难。该界面隐藏了内部流程,以及与其他用户存储库(例如 Active Directory,或任何 LDAP 目录)的一些必要集成。