keystone是OpenStack的身份服务,暂且可以理解为一个'与权限有关'的组件。

二 为何要有keystone

Keystone项目的主要目的是为访问openstack的各个组件(nova,cinder,glance...)提供一个统一的验证方式,具体的:

openstack是由众多组件构成的一套系统,该系统的功能是对外提供服务,因而我们可以将其定义为一个‘庞大的软件’,没有软件不考虑安全因素,Keystone对于通常的应用场景所不同的是他要解决分布式环境下的统一认证。

三 keystone的功能

openstack是一个SOA架构,理论上各子项目独立提供相关服务,互不依赖,且是分布式的。如nova提供计算服务,glance提供镜像服务等。

实际上所有的组件都依赖keystone(单点的),它集成了三个功能:

(1)管理身份验证(managing authentication):验证用户身份

  (2) 授权(authorization):基于角色role的权限管理

(3)服务目录(catalog of services):提服务目录(ServiceCatalog:包括service和endpoint)服务,类似于UDDI服务的概念,用户(无论是Dashboard, APIClient)都需要访问Keystone获取服务列表,以及每个服务的地址(Openstack中称为Endpoint)

四 keystone概念详解

第一部分

User:使用Openstack组件的客户端可以是人、服务、系统,任何的客户端来访问openstack组件,都需要有一个用户名。

Credentials:是用于确认用户身份的凭证,说白了就是‘信物’,具体可以是:

  1. 用户名和密码
  2. 用户名和API key
  3. 一个 Keystone 分配的身份token

Authentication

  1. 是验证用户身份的过程。Keystone 服务通过检查用户的 Credential 来确定用户的身份。
  2. 最开始,使用用户名/密码或者用户名/API key作为credential。当用户的credential被验证后,Kestone 会给用户分配一个 authentication token 供该用户后续的请求使用。 
  3. Keystone中通过Policy(访问规则)来做到基于用户角色(Role)的访问控制。

Token

  1. 是一个数字字符串,访问资源时需要"亮出"你的令牌。在keystone中主要是引入令牌机制来保护用户对于资源的访问,同时引入PKI(公钥基础实施)对令牌加以保护。
  2. Token包含了在指定范围和有效时间内可以被访问的资源。EG. 在Nova中一个tenant可以是一些虚拟机,在Swift和Glance中一个tenant可以是一些镜像存储,在Network中一个tenant可以是一些网络资源。

Role

  1. 本质就是一堆ACL的集合,用于划分权限
  2. 可以通过给User指定Role,使User获得Role对应的操作权限。
  3. Keystone返回给User的Token包含了Role列表,被访问的Services会判断访问它的User和User提供的Token中所包含的Role,及每个role访问资源或者进行操作的权限。
  4. 系统默认使用管理Role admin和成员Role user(过去的普通用户角色是:_member_) 。
  5. user验证时必须带有Project(Tenant)

Policy

  1. 对于Keystone service来说,Policy就是一个JSON文件,默认是/etc/keystone/policy.json。通过配置这个文件,Keystone实现了对User基于Role的权限管理。
  2. OpenStack对User的验证除了OpenStack的身份验证以外,还需要鉴别User对某个Service是否有访问权限。Policy机制就是用来控制User对Project(Tenant)中资源的操作权限。

Project(Tenant)

  1. 是一个人、或服务所拥有的资源集合。不同的Project之间资源是隔离的,资源可以设置配额。
  2. 在一个Project(Tenant)中可以包含多个User,每一个User都会根据权限的划分来使用Project(Tenant)中的资源。比如通过Nova创建虚拟机时要指定到某个Project中,在Cinder创建卷也要指定到某个Project中。
  3. User访问Project的资源前,必须要与该Project关联,并且指定User在Project下的Role,一个assignment(关联)即:Project-User-Role

Service:即Openstack中运行的各个组件服务。

Endpoint

  1. 是一个可以通过网络来访问和定位某个Openstack service的地址,通常是一个URL
  2. 不同的region有不同的endpoint(我们可以通过endpoint的region属性去定义多个region)。
  3. 当Nova需要访问Glance服务去获取image 时,Nova通过访问Keystone拿到Glance的endpoint,然后通过访问该endpoint去获取Glance服务。
  4. Endpoint 分为三类:
    • admin url –> 给admin用户使用,Port:35357
    • internal url –> OpenStack内部服务使用来跟别的服务通信,Port:5000
    • public url –> 互联网用户可以访问的地址,Port:5000

Catalog
用户和服务可以使用使用keystone管理的catalog,定位到其他的服务,catalog一个openstack部署的相关服务的集合,每个服务都有一个或者多个endpoint(即可以访问的url地址),即catalog=services+endpoint。每个endpoint可以分为三种类型:

admin,internal,public,在生产环境中,不同endpoint类型位于不同的网络来为不同的用户使用(提高安全性),比如:

public API:对整个互联网可见,这样客户就可以方便的管理自己的云了。

admin API:应该严格限定只有管理云基础设施的组织内的运营商,才能使用该API

internel API:应该被限定只有那些安装有OpenStack服务的主机,才能使用该API

Service与Endpoint关系介绍:

  1. 在openstack中,每一个service都有三种endpoint. Admin, public, internal(创建完service后需要为其创建API EndPoint. )
  2. Admin是用作管理用途的,如它能够修改user/tenant(project)。
  3. public 是让客户调用的,比如可以部署在外网上让客户可以管理自己的云。
  4. internal是openstack内部调用的。
  5. 三种endpoints 在网络上开放的权限一般也不同。Admin通常只能对内网开放,public通常可以对外网开放,internal通常只能对安装有openstack对服务的机器开放。
我们使用keystone为服务5d533c68-d234-11e6-a0d7-0088653ea1ec定制endpoint:

$ keystone endpoint-create \
--region RegionOne \
--service-id=5d533c68-d234-11e6-a0d7-0088653ea1ec \
--publicurl='https://public-ip:8776/v1/%(tenant_id)s' \
--internalurl='https://management-ip:8776/v1/%(tenant_id)s' \
--adminurl='https://management-ip:8776/v1/%(tenant_id)s'
然后你可以配置 OpenStack service 使用另一个 service 的 endpoint 的 internalurl 去访问另一个资源。
endpoint举例

相关文章:

  • 2021-09-20
  • 2022-12-23
  • 2021-07-26
  • 2021-10-26
  • 2022-01-08
  • 2022-02-11
  • 2022-01-20
  • 2022-12-23
猜你喜欢
  • 2021-12-29
  • 2022-12-23
  • 2021-08-07
  • 2021-10-26
  • 2021-08-08
  • 2022-12-23
  • 2021-05-23
相关资源
相似解决方案