[关闭]
@qiezhian 2014-12-01T02:55:07.000000Z 字数 7307 阅读 1467

身份管理(2)

云计算


缓存层

Identity支持在可配置子系统(如令牌,分配assignment)之上加一层缓存层。Identity服务使用dogpile.cache库以允许灵活的缓存后端。大多数缓存配置项都需要在keystone.conf配置文件中的[cache]节中设置。然而,在每个有能力使用缓存的节(section)都有一个缓存布尔值来切换缓存模式(是否启用缓存),见下面代码:

  1. [cache]
  2. enabled=true
  3. [assignment]
  4. caching=false
  5. [token]
  6. 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即可禁用之。
想获得更多关于不同后端的信息(以及配置选项),参见:

示例:配置Memcached后端

下面这个例子展示如何配置Memcached(是一个高性能的分布式内存对象缓存系统)后端:

  1. [cache]
  2. enabled = true
  3. backend = dogpile.cache.memcached
  4. backend_argument = url:127.0.0.1:11211

您需要指定URL到参数backend_argument,来获得memcached实例。

用户CRUD

Identity服务向用户提供一个可添加到public_api管道的CRUD滤波器。该CRUD滤波器使用户能够通过一个HTTP PATCH来改变他们自己的密码。为了启用这样一个扩展,您应该定义一个user_crud_extension滤波器,将其添加在keystone.conf文件中public_api WSGI 管道线中的*_body中间件之后、public_service之前,如下:

  1. [filter:user_crud_extension]
  2. paste.filter_factory = keystone.contrib.user_crud:CrudExtension.factory
  3. [pipeline:public_api]
  4. pipeline = stats_monitoring url_normalize token_auth admin_token_auth xml_body json_body debug ec2_extension user_crud_extension public_service

然后每个用户可以用一个HTTP PATCH来修改他们的密码;

  1. $ 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文件中移除中间件参数:

  1. [filter:authtoken]
  2. paste.filter_factory =
  3. keystoneclient.middleware.auth_token:filter_factory

nova.conf文件中设置这些值:

  1. [DEFAULT]
  2. ...
  3. auth_strategy=keystone
  4. [keystone_authtoken]
  5. auth_uri = http://controller:5000/v2.0
  6. identity_uri = http://controller:35357
  7. admin_user = admin
  8. admin_password = SuperSekretPassword
  9. admin_tenant_name = service

Note:paste config中的中间件参数优先级高。您必须先移除之,才能在keystone_authtoken]节中配置他们的值。
Note:注释掉auth_host,auth_port以及auth_protocol选项是因为identity_url选项代替了它们。

监测

Identity提供基本的监测统计的请求与回应。
通过定义stats_monitoring滤波器,来启用数据采集,并可将其置于任何需要的WSGI管道线的开头:

  1. [filter:stats_monitoring]
  2. paste.filter_factory = keystone.contrib.stats:StatsMiddleware.factory
  3. [pipeline:public_api]
  4. pipeline = stats_monitoring [...] public_service

通过定义stats_reporting滤波器,来启用收集数据报告,并可将其置于您admin_apiWSGI管道线尾部附近(推荐放在所有*_body形式的中间件之后,*_extension形式滤波器之前):

  1. [filter:stats_reporting]
  2. paste.filter_factory = keystone.contrib.stats:StatsExtension.factory
  3. [pipeline:admin_api]
  4. pipeline = [...] json_body stats_reporting ec2_extension [...] admin_service

使用以下命令向admin API请求统计:

  1. $ curl -H 'X-Auth-Token: ADMIN' http://localhost:35357/v2.0/OS-STATS/stats

重置收集到的数据:

  1. $ curl -H 'X-Auth-Token: ADMIN' -X DELETE http://localhost:35357/v2.0/OS-STATS/stats

启动Identity服务

运行下面的命令来启动Identity服务:

  1. $ keystone-all

这个命令开启两个如前所述通过keystone.conf文件配置的wsgi服务器实例。其中一个是admin(管理 API )另一个是main(主要/公共 API )。两个均运行在单进程状态。

用法示例

keystone客户端接收如keystone command argument形式的命令,后面接一些提供额外信息(选项)的关键字参数。例如,命令user-listtenant-create可以像下面所示调用:

  1. # Using token auth env variables
  2. export OS_SERVICE_ENDPOINT=http://127.0.0.1:5000/v2.0/
  3. export OS_SERVICE_TOKEN=secrete_token
  4. keystone user-list
  5. keystone tenant-create --name demo
  6. # Using token auth flags
  7. keystone --os-token secrete --os-endpoint http://127.0.0.1:5000/v2.0/ user-list
  8. keystone --os-token secrete --os-endpoint http://127.0.0.1:5000/v2.0/ tenant-create --name=demo
  9. # Using user + password + tenant_name env variables
  10. export OS_USERNAME=admin
  11. export OS_PASSWORD=secrete
  12. export OS_TENANT_NAME=admin
  13. keystone user-list
  14. keystone tenant-create --name demo
  15. # Using user + password + tenant_name flags
  16. keystone --username admin --password secrete --tenant_name admin user-list
  17. keystone --username admin --password secrete --tenant_name admin tenant-create --name demo

使用用户名与密码的认证中间件

您也可以通过使用admin_useradmin_password选项来配置Identity认证中间件。当使用admin_useradmin_password选项时,admin_token参数是可选的。如果admin_token参数并指定,只有当指定的令牌有效时才会使用。
对于拥有单独粘贴-部署.ini文件的服务,您可以在主配置文件中(如nova.conf)的[keystone_authtoken]节对认证中间件进行配置。在Compute服务中,您可以从api-paste.ini文件中移除中间件参数:

  1. [filter:authtoken]
  2. paste.filter_factory =
  3. keystoneclient.middleware.auth_token:filter_factory

并在nova.conf文件中设置:

  1. [DEFAULT]
  2. ...
  3. auth_strategy=keystone
  4. [keystone_authtoken]
  5. auth_uri = http://controller:5000/v2.0
  6. identity_uri = http://controller:35357
  7. admin_user = admin
  8. admin_password = SuperSekretPassword
  9. admin_tenant_name = service

Note:进行上述操作需要一个管理员租户/角色。管理员用户有权在管理员租户中访问管理员角色。
Note:注释掉auth_host,auth_port以及auth_protocol选项是因为identity_url选项代替了它们。

使用基于角色的访问控制的Identity API 保护

基于角色的访问控制RBAC(role-based access control)。
如OpenStack中其他组件,Identity通过定义基于RBAC方法的策略规则对其APIs提供保护。Identity在主配置文件keystone.conf中保存了JSON文件的引用。通常该文件名称policy.json,它定义了角色在某服务对特定操作集的访问权限。
每个Identity API v3 调用在策略文件(policy file)中都有一行来决定了访问应用的治理水平。

  1. API_NAME: RULE_STATEMENT or MATCH_STATEMENT

其中:RULE_STATEMENT包含RULE_STATEMENT或者MATCH_STATEMENT
MATCH_STATEMENT是一个必须在API 调用者提供的令牌和API 调用的参数或目标实体之间达成匹配的标识符集合。例如:

  1. "identity:create_user": [["role:admin", "domain_id:%(user.domain_id)s"]]

要创建一个用户,您必须在令牌中拥有admin角色,并且在令牌中的domain_id(也就意味着这是一个域范围的令牌)必须与您想要创建的用户目标匹配。也就是说,您必须在创建用户的域中拥有admin角色,且使用的令牌的作用范围为整个域。
匹配声明的每个组件使用如下格式:

  1. ATTRIB_FROM_TOKEN:CONSTANT or ATTRIB_RELATED_TO_API_CALL
  1. "identity:delete_user": [["role:admin", "domain_id:%(target.user.domain_id)s"]]

会确保Identity只删除与令牌在同一域的用户对象。
每一个目标对象都有一个idname,可通过target.OBJECT.id``target.OBJECT.name获得。Identity从数据库获取其他属性,不同对象类型有不同属性。Identity服务过滤掉某些数据库域,如用户密码。
对象属性列表:

  1. role:
  2. target.role.id
  3. target.role.name
  4. user:
  5. target.user.default_project_id
  6. target.user.description
  7. target.user.domain_id
  8. target.user.enabled
  9. target.user.id
  10. target.user.name
  11. group:
  12. target.group.description
  13. target.group.domain_id
  14. target.group.id
  15. target.group.name
  16. domain:
  17. target.domain.enabled
  18. target.domain.id
  19. target.domain.name
  20. project:
  21. target.project.description
  22. target.project.domain_id
  23. target.project.enabled
  24. target.project.id
  25. target.project.name

默认的policy.json文件

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注