@qiezhian
2014-12-01T02:55:07.000000Z
字数 7307
阅读 1467
云计算
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.memory
dogpile.cache.backends.memcached
dogpile.cache.backends.redis
dogpile.cache.backends.file
keystone.common.cache.backends.mongo
Memcached
后端下面这个例子展示如何配置Memcached
(是一个高性能的分布式内存对象缓存系统)后端:
[cache]
enabled = true
backend = dogpile.cache.memcached
backend_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.0
identity_uri = http://controller:35357
admin_user = admin
admin_password = SuperSekretPassword
admin_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 variables
export OS_SERVICE_ENDPOINT=http://127.0.0.1:5000/v2.0/
export OS_SERVICE_TOKEN=secrete_token
keystone user-list
keystone tenant-create --name demo
# Using token auth flags
keystone --os-token secrete --os-endpoint http://127.0.0.1:5000/v2.0/ user-list
keystone --os-token secrete --os-endpoint http://127.0.0.1:5000/v2.0/ tenant-create --name=demo
# Using user + password + tenant_name env variables
export OS_USERNAME=admin
export OS_PASSWORD=secrete
export OS_TENANT_NAME=admin
keystone user-list
keystone tenant-create --name demo
# Using user + password + tenant_name flags
keystone --username admin --password secrete --tenant_name admin user-list
keystone --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.0
identity_uri = http://controller:35357
admin_user = admin
admin_password = SuperSekretPassword
admin_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.id
target.role.name
user:
target.user.default_project_id
target.user.description
target.user.domain_id
target.user.enabled
target.user.id
target.user.name
group:
target.group.description
target.group.domain_id
target.group.id
target.group.name
domain:
target.domain.enabled
target.domain.id
target.domain.name
project:
target.project.description
target.project.domain_id
target.project.enabled
target.project.id
target.project.name
默认的policy.json
文件