2021SC@SDUSC
KeyStone 简要分析
一,KeyStone是什么
keyStone是openstack中提供identity,token,catalog和policy服务的组件,实现了openstack的身份认证API。
身份认证服务包含了两个基本服务:
- 用户管理:记录用户和用户所被允许执行的工作。
- 服务日志:提供一个关于什么服务是被允许的和它们的AP入口位置的日志。
二.KeyStone 架构
KeyStone根据传统,承担了一组内部服务,向外暴露一个或多个服务入口节点。
- 身份认证:身份认证服务为用户,租客和角色(for USER,Tenant and Role)提供了认证评估验证和和数据以及相关元数据;
- Token:在一个user或者tenant在验证之后,发给其一个Token,Token服务可以验证并管理这些Token(类似cookie)
- Catalog:记录所有endpoint(入口)在需要服务时查询catalog即可
- Policy:提供基于规范的认证引擎
每个服务可以根据当前环境进行设置来适应当前需求。可以在keystone.conf里设置后端。
- KVS Backend:一个简单的后端接口,需要更深入的设置
- SQL Backend:一个基于SQLAchemy(python操作SQL的工具包)完成的后端,用于储存数据。
- PAM Backend:使用了当前系统的PAM服务用于认证,提供user和tenant一对一关联。(extra)
- LDAP Backend:把user和tenant储存在不同的子树中
- template Backend:泛式设置keystone
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L05KD1rr-1634377476209)(https://image.slidesharecdn.com/openstackkeystoneidentityservice-121017010633-phpapp01/95/openstack-keystone-identity-service-6-638.jpg?cb=1350436060)]
工作流
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0e9bzASZ-1634377476211)(https://image.slidesharecdn.com/openstackkeystoneidentityservice-121017010633-phpapp01/95/openstack-keystone-identity-service-7-638.jpg?cb=1350436060)]
三,keystone用户管理
1. User:代表一个个体用户,与用户名,密码和email相关联。一个user与一个特定的domain相关,所以username不需要全局唯一,只需要域内唯一。(许多user可以组成一个group,group被一个domain拥有,group名也是域唯一)
2. tenant:一个项目,组织等。 只有tenant才能与openstack服务提出request
3. role:代表一类在指定tenant下的role(可执行的动作)
- domain:项目,用户和组织的高层次的容器。参数:域名(全局唯一),角色名,用户名,项目名,组织名(域内唯一)
不同domain内的用户可以访问不同域的服务
四.应用架构
KeyStone中使用REST API的服务通过HTTP交互
KeyStone中与flask-RESTful相关的方法在keystone.server.flask.common
KeyStone的API资源继承自keystone.server.flask.common.ResourceBase并暴露HTTP方法(GET,PUT,POST,PATCH和DELETE)
class UserResource(ks_flask.ResourceBase):
collection_key = 'users'
member_key = 'user'
get_member_from_driver = PROVIDERS.deferred_provider_lookup(
api='identity_api', method='get_user')
def get(self, user_id=None):
"""Get a user resource or list users.
GET/HEAD /v3/users
GET/HEAD /v3/users/{user_id}
"""
...
def post(self):
"""Create a user.
POST /v3/users
"""
...
class UserChangePasswordResource(ks_flask.ResourceBase):
@ks_flask.unenforced_api
def post(self, user_id):
...
API路由
class UserAPI(ks_flask.APIBase):
_name = 'users'
_import_name = __name__
resources = [UserResource]
resource_mapping = [
ks_flask.construct_resource_map(
resource=UserChangePasswordResource,
url='/users/<string:user_id>/password',
resource_kwargs={},
rel='user_change_password',
path_vars={'user_id': json_home.Parameters.USER_ID}
),
...
Service和Endpoint的关系
- openstack中,每一个service都三种endpoint:Admin,internal和public(创建完service后需要为其创建API EndPoint. )
- Admin是用作管理用途的,如它能够修改user/tenant(project)。
- public 是让客户调用的,比如可以部署在外网上让客户可以管理自己的云。
- internal是openstack内部调用的。
- 三种endpoints 在网络上开放的权限一般也不同。Admin通常只能对内网开放,public通常可以对外网开放,internal通常只能对安装有openstack对服务的机器开放。
每个你部署的openstack服务都需要绑定endpoint(存储在keystone中)来提供服一个服务的入口,因而我们第一需要部署的组件就是keystone。
五.小结
nstack对服务的机器开放。
每个你部署的openstack服务都需要绑定endpoint(存储在keystone中)来提供服一个服务的入口,因而我们第一需要部署的组件就是keystone。
五.小结
KeyStone是为用户创建令牌凭证,提供服务入口,为其他openstack服务提供凭证验证服务的组件,是构建openstack服务的第一个组件,并可以为用户授权和定义行为,可以在KeyStone中窥得其他服务及其endpoint。