1 概述
Keystone(OpenStackIdentity Service)是OpenStack框架中,负责身份验证、服务规则和服务令牌的功能,它实现了OpenStack的Identity API。同时作为一个通用的云OS验证系统可以和已有的后端用户目录服务整合,例如:LDAP。
Keystone可以分解为两个核心功能,单点登录和服务发现。Keystone类似一个服务总线,或者说是整个Openstack框架的注册表,其他服务通过Keystone来注册其服务的Endpoint(服务访问的URL),任何服务之间相互的调用,都需要经过Keystone的身份验证,以获得目标服务的Endpoint来找到目标服务。
2 概念和命令
2.1 Catalog
Service Catalog(服务目录)是Keystone为OpenStack提供的一个REST API端点列表,并以此作为决策参考。
- keystone catalog # 可以显示所有已有的service
- keystone catalog --service # 显示某个service信息
2.2 Endpoint
Endpoint,直译为“端点”,它是一个服务暴露出来的访问地址,具有region属性。如果需要访问一个服务,必须知道它的Endpoint。因此,在Keystone中包含一个Endpoint模板(EndpointTemplate),这个模板提供了所有存在的服务Endpoints信息。一个EndpointTemplate包含一个URLs列表,列表中的每个URL都对应一个服务实例的访问地址,并且具有public、private和admin这三种权限:publicurl可以被全局访问,private url只能被局域网访问,admin url被从常规的访问中分离。
- keystone endpoint-create # Create a new endpointassociated with a service,输入keystone help endpoint-create可以查看更详细的操作指南
-
- --region # region表示不同的范围,类似c++中命名空间,把服务“隔离”。
- --service , --service-id , --service_id # Name or ID of service associated with Endpoint
- --publicurl # Public URL endpoint
- --adminurl # Admin URL endpoint
- --internalurl # Internal URL endpoint
- keystone endpoint-delete # Delete a service endpoint
- keystone endpoint-get # Find endpoint filtered by aspecific attribute or service type,输入keystone helpendpoint-get可以查看更详细的操作指南
-
- --service # Service type toselect
- --endpoint-type # Endpointtype to select
- --attr # Service attributeto match for selection
- --value # Value of attribute to match
- keystone endpoint-list # List configured serviceendpoints
2.3 Role
Role即角色,Roles代表一组用户可以访问哪些资源的权限,例如Nova中的虚拟机、Glance中的镜像等。用户可以被添加到任意一个全局的或租户内的角色中。在全局的Role中,用户的Role权限作用于所有的租户,即可以对所有的租户执行Role规定的权限;在租户内的Role中,用户仅能在当前租户内执行Role规定的权限。Role和policy配合使用。
- keystone role-create # Create new role
- keystone role-delete # Delete role
- keystone role-get # Display role details
- keystone role-list # List all roles
2.4 Service
Service即服务,如Nova、Glance、Swift等。一个服务可以确认当前用户是否具有访问其资源的权限。但是当一个用户尝试着访问其租户内的Service时,他必须知道这个Service是否存在以及如何访问这个Service,这里通常使用一些不同的名称表示不同的服务。在上文中谈到的Role,实际上也是可以绑定到某个service的。例如,当Swift需要一个管理员权限的访问进行对象创建时,对于相同的role我们并不一定也需要对Nova进行管理员权限的访问。为了实现这个目标,我们应该创建两个独立的管理员Role,一个绑定到Swift,另一个绑定到Nova,从而互不影响。
- keystone service-create # Add service to ServiceCatalog,输入keystone help service-create可以查看更详细的操作指南
-
- --name # Name of new service (must beunique)
- --type # Service type (one of:identity, compute, network, image, or object-store)
- --description # Descriptionof service
- keystone service-delete # Delete service fromService Catalog
- keystone service-get # Display service from ServiceCatalog
- keystone service-list # List all services in ServiceCatalog
2.5 Tenant
Tenant即租户,它是各个服务中的一些可以访问的资源的集合。例如,在Nova中一个Tenant可以是一些机器,在Swift和Glance中一个Tenant可以是一些镜像存储,在Quantum中一个tenant可以是一些网络资源。用户默认的总是绑定到某些Tenant上。
- keystone tenant-create # Create new tenant,输入keystone helptenant-create可以查看更详细的操作指南
- --name # New tenant name (mustbe unique)
- --description # Descriptionof new tenant (default is none)
- --enabled # Initial tenantenabled status (default true)
- keystone tenant-delete # Delete tenant
- keystone tenant-get # Display tenant details
- keystone tenant-list # List all tenants
- keystone tenant-update # Update tenant name,description, enabled status
2.6 User
User即用户,他们代表可以通过Keystone进行访问的人或程序。用户通过认证信息(credentials,如密码、API Keys等)进行验证。
从用户的角度来看,它归属于一个或多个Project(即Tenant),并且在每个项目中充当一个角色。所以我们需要创建User、Tenant、Role,并将它们关联起来。
- l keystone user-create # Create new user,输入keystone helpuser-create可以查看更详细的操作指南
- --name # New user name (must beunique)
- --tenant , --tenant-id # New user default tenant,创建用户时可以不指定tenant,后续通过user-role-add关联到某个tenant
- --pass # New user password
- --email # New user email address
- --enabled # Initial user enabledstatus (default true)
- keystone user-delete # Delete user
- keystone user-get # Display user details
- keystone user-list # List users,输入keystone helpuser-list可以查看更详细的操作指南
- --tenant, --tenant-id # 列出某个租户下的所有用户
- keystone user-password-update # Update user password
- keystone user-role-add # Add role to user,输入keystone helpuser-role-add可以查看更详细的操作指南
-
- --user , --user-id ,--user_id # Name or ID of user
- --role , --role-id ,--role_id # Name or ID of role
- --tenant , --tenant-id #Name or ID of tenant
- keystone user-role-list # 查看某个租户下的某个用户属于哪个角色,输入keystone help user-role-list可以查看更详细的操作指南
-
- --user , --user-id # Listroles granted to a user
- --tenant , --tenant-id # List roles granted on a tenant
- keystone user-role-remove # Remove role from user,输入keystone helpuser-role-remove可以查看更详细的操作指南
-
- --user , --user-id ,--user_id # Name or ID of user
- --role , --role-id ,--role_id # Name or ID of role
- --tenant , --tenant-id # Name or ID of tenant
- keystone user-update # Update user's name, email,and enabled status
2.7 其它概念
Authentication:鉴权,即对用户身份鉴别的一个过程。
Token:令牌,是一个任意比特的文本。对用户鉴权完毕之后,Keystone会为用户颁发一个令牌,这样用户在请求其他服务的时候,只需要亮出自己的令牌即可,而不需要发送自己的密钥。令牌的有效期是有限的,可以随时被撤回。
Credential:用来证明用户身份的证据。为了给用户提供一个令牌,需要用证书来唯一标识一个Keystone用户的密码或其它信息。
Keystone由一组内部服务组成,这些服务包含:
- Identity:该服务主要提供对身份信息的验证包含用户、租户和角色,以及相关联的元数据。
- Token:该服务验证并且管理所有的令牌信息。
- Catalog:该服务提供对所有服务接入点的注册管理。
- Policy:该服务提供了一个基于角色的授权管理系统及规则管理接口。
2.8 认证流程
Keystone的认证流程,如下图所示:
3 配置文件
3.1 Keystone配置文件
Keystone的配置文件目录为/etc/keystone/,包含有如下默认配置文件:
- keystone.conf:Keystone的核心配置文件。
- logging.conf:Keystone的日志配置文件。
- policy.json:Keystone的policy配置文件;例如,"admin_required":"role:admin or is_admin:1"表示Role为admin或者is_admin为True才被视为管理员角色。
- default_catalog.templates:Keystone的catalog后端配置为template模式时的catalog模板。
3.2 Swift配置文件
对于Swift来说,/etc/swift/proxy-server.conf这个配置文件的主要配置项如下:
- [filter:keystoneauth]部分中的operator_roles这一项表示被允许访问的Role,所有未在此被列出的Role都将无法成功访问Swift。
4 参考资料
1) 《OpenStack Keystone服务剖析》,http://blog.csdn.net/u011196209/article/details/9285977
2) 《OpenStack Identity API v3》,https://github.com/openstack/identity-api/blob/master/openstack-identity-api/v3/src/markdown/identity-api-v3.md