@qiezhian
2014-12-01T02:55:07.000000Z
字数 7307
阅读 1548
云计算
Identity支持在可配置子系统(如令牌,分配assignment)之上加一层缓存层。Identity服务使用dogpile.cache库以允许灵活的缓存后端。大多数缓存配置项都需要在keystone.conf配置文件中的[cache]节中设置。然而,在每个有能力使用缓存的节(section)都有一个缓存布尔值来切换缓存模式(是否启用缓存),见下面代码:
[cache]enabled=true[assignment]caching=false[token]caching=true
Note:发行版Juno中,子系统缓存设置项是默认开启的,但是全局切换键却是关闭的。也就是说,除非缓存节[cache]这个全局切换键开启(设置为True),否则缓存是不可用的。
令牌系统有一个单独的cache_time配置项,该选项可被设置为高于或低于默认全局量expiration_time,以允许来自OpenStack的其它子系统的不同的缓存行为。该项需要在配置文件的[token]节设置。
令牌撤销列表缓存时间是由[token]节中配置项revocation_cache_time来决定的。一旦有令牌被撤销,令牌撤销列表就会刷新。相比指定令牌检索或者令牌验证调用,这通常会产生更多请求。
下面列出的是一系列会被缓存时间影响的操作:获取一个新令牌、撤销令牌、验证令牌、检查V2令牌以及检查V3令牌。
删除令牌的API 调用会废除被删除令牌的缓存,并且会废除被撤销令牌的列表缓存。The delete token API calls invalidate the cache for the tokens being acted upon, as well as invalidating the cache for the revoked token list and the validate/check token calls.
令牌缓存可通过revocation_list单独配置。解禁从令牌驱动到令牌管理者的到期检查。这能确保被缓存令牌到期后会给出TokenNotFound标识。
为了缓存一致性,所有令牌ID都被变换到在提供者和令牌驱动水平上的短令牌哈希形式。有些方法能够访问全ID(PKI令牌),而其他则不能。没有令牌ID归一化,会产生缓存失效不一致。
分配系统有一个独立配置项cache_time,该选项可被设置为高于或低于默认全局量expiration_time,以允许来自OpenStack的其它子系统的不同的缓存行为。该项需要在配置文件的[assignment]节设置。
目前,分配系统对于项目、域以及角色特殊要求(主要是CRUD操作)配有缓存。OpenStack 暂时不支持grant缓存。list方法也没有缓存。
下面列出会受分配系统影响的操作:分配域API、分配项目API以及分配角色API。
对于域、项目、角色的创建、更新以及删除操作(CRUD)会对上述列出的被缓存方法执行合适的无效化。
**Note:如果一个只读分配系统后端正在运行,缓存并不会马上将变化反应到后端。在超过设置的cache_time或者全局的expiration_time时间后,变化才会反应到后端。如果这种延迟是种困扰,那么建议禁用分配系统的缓存。在[assignment]节将caching设置为False即可禁用之。
想获得更多关于不同后端的信息(以及配置选项),参见:
dogpile.cache.backends.memorydogpile.cache.backends.memcached dogpile.cache.backends.redisdogpile.cache.backends.filekeystone.common.cache.backends.mongoMemcached后端下面这个例子展示如何配置Memcached(是一个高性能的分布式内存对象缓存系统)后端:
[cache]enabled = truebackend = dogpile.cache.memcachedbackend_argument = url:127.0.0.1:11211
您需要指定URL到参数backend_argument,来获得memcached实例。
Identity服务向用户提供一个可添加到public_api管道的CRUD滤波器。该CRUD滤波器使用户能够通过一个HTTP PATCH来改变他们自己的密码。为了启用这样一个扩展,您应该定义一个user_crud_extension滤波器,将其添加在keystone.conf文件中public_api WSGI 管道线中的*_body中间件之后、public_service之前,如下:
[filter:user_crud_extension]paste.filter_factory = keystone.contrib.user_crud:CrudExtension.factory[pipeline:public_api]pipeline = stats_monitoring url_normalize token_auth admin_token_auth xml_body json_body debug ec2_extension user_crud_extension public_service
然后每个用户可以用一个HTTP PATCH来修改他们的密码;
$ curl -X PATCH http://localhost:5000/v2.0/OS-KSCRUD/users/USERID -H "Content-type: application/json" -H "X_Auth_Token: AUTHTOKENID" -d '{"user": {"password": "ABCD", "original_password": "DCBA"}}'
除了改变了密码之外,用户当前的所有令牌都会被删除(如果后端是KVS或者SQL)。
Note:仅仅在测试时对令牌使用KVS后端。
对于Identity服务其他部分,您可以从外部配置日志系统(logging)。在keystone.conf文件中[DEFAULT]节的log_config里,对日志系统进行配置。要通过syslog进行记录,需要使use_syslog=true。
在目录etc/logging.conf.sample下,有一个示例日志文件。和OpenStack其他部件一样,Identity使用Python日志模块,它拥有丰富的配置可以让您定义输出水平及格式。
Identity服务分散配置在 例如,每个服务器应用都有它自己的配置文件。 etc/keystone.conf配置文件中。
对于拥有单独paste-deploy.ini文件的服务,您可以在主配置文件(如nova.conf)中[keystone_authtoken]节中配置auth_token中间件。例如在Compute服务中,您可以在api-paste.ini文件中移除中间件参数:
[filter:authtoken]paste.filter_factory =keystoneclient.middleware.auth_token:filter_factory
在nova.conf文件中设置这些值:
[DEFAULT]...auth_strategy=keystone[keystone_authtoken]auth_uri = http://controller:5000/v2.0identity_uri = http://controller:35357admin_user = adminadmin_password = SuperSekretPasswordadmin_tenant_name = service
Note:paste config中的中间件参数优先级高。您必须先移除之,才能在keystone_authtoken]节中配置他们的值。
Note:注释掉auth_host,auth_port以及auth_protocol选项是因为identity_url选项代替了它们。
Identity提供基本的监测统计的请求与回应。
通过定义stats_monitoring滤波器,来启用数据采集,并可将其置于任何需要的WSGI管道线的开头:
[filter:stats_monitoring]paste.filter_factory = keystone.contrib.stats:StatsMiddleware.factory[pipeline:public_api]pipeline = stats_monitoring [...] public_service
通过定义stats_reporting滤波器,来启用收集数据报告,并可将其置于您admin_api 的WSGI管道线尾部附近(推荐放在所有*_body形式的中间件之后,*_extension形式滤波器之前):
[filter:stats_reporting]paste.filter_factory = keystone.contrib.stats:StatsExtension.factory[pipeline:admin_api]pipeline = [...] json_body stats_reporting ec2_extension [...] admin_service
使用以下命令向admin API请求统计:
$ curl -H 'X-Auth-Token: ADMIN' http://localhost:35357/v2.0/OS-STATS/stats
重置收集到的数据:
$ curl -H 'X-Auth-Token: ADMIN' -X DELETE http://localhost:35357/v2.0/OS-STATS/stats
运行下面的命令来启动Identity服务:
$ keystone-all
这个命令开启两个如前所述通过keystone.conf文件配置的wsgi服务器实例。其中一个是admin(管理 API )另一个是main(主要/公共 API )。两个均运行在单进程状态。
keystone客户端接收如keystone command argument形式的命令,后面接一些提供额外信息(选项)的关键字参数。例如,命令user-list和tenant-create可以像下面所示调用:
# Using token auth env variablesexport OS_SERVICE_ENDPOINT=http://127.0.0.1:5000/v2.0/export OS_SERVICE_TOKEN=secrete_tokenkeystone user-listkeystone tenant-create --name demo# Using token auth flagskeystone --os-token secrete --os-endpoint http://127.0.0.1:5000/v2.0/ user-listkeystone --os-token secrete --os-endpoint http://127.0.0.1:5000/v2.0/ tenant-create --name=demo# Using user + password + tenant_name env variablesexport OS_USERNAME=adminexport OS_PASSWORD=secreteexport OS_TENANT_NAME=adminkeystone user-listkeystone tenant-create --name demo# Using user + password + tenant_name flagskeystone --username admin --password secrete --tenant_name admin user-listkeystone --username admin --password secrete --tenant_name admin tenant-create --name demo
您也可以通过使用admin_user和admin_password选项来配置Identity认证中间件。当使用admin_user和admin_password选项时,admin_token参数是可选的。如果admin_token参数并指定,只有当指定的令牌有效时才会使用。
对于拥有单独粘贴-部署.ini文件的服务,您可以在主配置文件中(如nova.conf)的[keystone_authtoken]节对认证中间件进行配置。在Compute服务中,您可以从api-paste.ini文件中移除中间件参数:
[filter:authtoken]paste.filter_factory =keystoneclient.middleware.auth_token:filter_factory
并在nova.conf文件中设置:
[DEFAULT]...auth_strategy=keystone[keystone_authtoken]auth_uri = http://controller:5000/v2.0identity_uri = http://controller:35357admin_user = adminadmin_password = SuperSekretPasswordadmin_tenant_name = service
Note:进行上述操作需要一个管理员租户/角色。管理员用户有权在管理员租户中访问管理员角色。
Note:注释掉auth_host,auth_port以及auth_protocol选项是因为identity_url选项代替了它们。
基于角色的访问控制RBAC(role-based access control)。
如OpenStack中其他组件,Identity通过定义基于RBAC方法的策略规则对其APIs提供保护。Identity在主配置文件keystone.conf中保存了JSON文件的引用。通常该文件名称policy.json,它定义了角色在某服务对特定操作集的访问权限。
每个Identity API v3 调用在策略文件(policy file)中都有一行来决定了访问应用的治理水平。
API_NAME: RULE_STATEMENT or MATCH_STATEMENT
其中:RULE_STATEMENT包含RULE_STATEMENT或者MATCH_STATEMENT。
MATCH_STATEMENT是一个必须在API 调用者提供的令牌和API 调用的参数或目标实体之间达成匹配的标识符集合。例如:
"identity:create_user": [["role:admin", "domain_id:%(user.domain_id)s"]]
要创建一个用户,您必须在令牌中拥有admin角色,并且在令牌中的domain_id(也就意味着这是一个域范围的令牌)必须与您想要创建的用户目标匹配。也就是说,您必须在创建用户的域中拥有admin角色,且使用的令牌的作用范围为整个域。
匹配声明的每个组件使用如下格式:
ATTRIB_FROM_TOKEN:CONSTANT or ATTRIB_RELATED_TO_API_CALL
user_id、domain_id、project_id依赖使用范围,您拥有的角色列表需要在该范围内。object.attributes语法来引用目标属性(例如user.domain_id)。API 的目标对象也可通过target.object.attribute语法来获取。例如:
"identity:delete_user": [["role:admin", "domain_id:%(target.user.domain_id)s"]]
会确保Identity只删除与令牌在同一域的用户对象。
每一个目标对象都有一个id和name,可通过target.OBJECT.id``target.OBJECT.name获得。Identity从数据库获取其他属性,不同对象类型有不同属性。Identity服务过滤掉某些数据库域,如用户密码。
对象属性列表:
role:target.role.idtarget.role.nameuser:target.user.default_project_idtarget.user.descriptiontarget.user.domain_idtarget.user.enabledtarget.user.idtarget.user.namegroup:target.group.descriptiontarget.group.domain_idtarget.group.idtarget.group.namedomain:target.domain.enabledtarget.domain.idtarget.domain.nameproject:target.project.descriptiontarget.project.domain_idtarget.project.enabledtarget.project.idtarget.project.name
默认的policy.json文件