OpenStack的其他服务在使用keystone作为统一的身份认证服务器时,需要部署keystone中间件即keystonemiddleware,中间件的作用主要是拦截用户发往各个服务的请求,对其中用户的令牌(token)进行验证后拒绝用户的请求或将该请求传递给下一个中间件。
OpenStack中有一些服务具有自己的认证方式,因此想要使用统一的身份认证方式就必须正确配置keystone中间件。
本文就介绍如何配置和使用keystonemiddleware。
1. 首先我们要在各个服务的paste.ini文件中,设置如下的两个filter(通常是自带的):
[filter:authtoken]
paste.filter_factory = keystonemiddleware.auth_token:filter_factory
[filter:keystonecontext]
paste.filter_factory = nova.api.auth:NovaKeystoneContext.factory
2. 接着我们要将第一步中定义的authtoken keystonecontext中间件放置在目标pipeline的适当位置,这样我们就完成了对paste.ini文件的修改。事实上,第三步中写入到.conf文件中的配置信息[keystone_authtoken]中的内容也可以紧接着[filter:authtoken]字段补充,但是这样会使得paste.ini文件变得臃肿,所以我们将具体驱动的细节配置统一放入.conf文件,使得paste.ini文件简洁清晰。
但是对于对象存储服务swift而言,该服务没有自己的paste.ini配置文件,不过这不重要,因为我们可以将filter的声明和具体配置都写入swift的.conf配置文件中。
3. 在各个服务的.conf文件中设置:
[DEFAULT]
...
auth_strategy=keystone
...
[keystone_authtoken]
auth_port = 35357
auth_host = 127.0.0.1
admin_user = admin
admin_password = keystone123
注意这些设置内容可以在这两个配置文件中的任何一个设置,但是paste.ini文件中的配置信息具有优先权,一旦设置,将会取代.conf中的配置信息发挥作用。
下面我们列出所有keystonemiddleware可选的配置项
1. auth_admin_prefix: 路径前添加的前缀
2. auth_host:(必须)提供keystone服务的API终端URL
3. auth_port: (可选, 默认35357)用来验证令牌的端口
4. auth_protocol: (可选, 默认https)用来验证令牌的协议类型
5. auth_uri: (可选, 默认auth_protocol://auth_host:auth_port)认证令牌的完整URL
6. auth_version: 要使用的管理API 版本
7. delay_auth_decision: (可选, 默认off). 如果是on, 中间将将不会拒绝无效的认证请求,而是将决策的权利委托给下游的WSGI组件
8. http_connect_timeout: (可选) 向keystone服务器请求多久就算超时
9. http_request_max_retries: (默认3) 向keystone服务器请求的次数
10. http_handler: (可选) Allows to pass in the name of a fake http_handler callback function used instead of httplib.HTTPConnection orhttplib.HTTPSConnection. Useful for unit testing where network is not available.
11. admin_token: 必须指定该项或下面的全部三个选项,该选项的值应与keystone配置时设置的管理员令牌相同.
12. admin_user, admin_password, admin_tenant_name: 如果没有提供管理员令牌,那么这三个配置项就应该是已经在keystone中配置好的服务账户
13. certfile: (必须)如果keystone服务器要求客户端提供cert,那么该项必须提供
14. keyfile: (必须) 如果keystone服务器要求客户端提供cert,那么必须提供该项,如果certfile包含私钥,那么该项的值可以与certfile相同.
15. cafile: (可选, 默认使用系统的CA ) 用来验证https连接的CA 文件路径.
16. insecure: (可选, 默认False) 不要验证https连接.
17. signing_dir: (可选) 储存与PKI令牌相关文件的目录
18. memcached_servers: (可选)如果定义, 指定用于缓存的 memcache server(s)
19. token_cache_time: (默认300秒) 为了避免过度请求和验证,中间件会使用内存缓存机制来缓存每一个keystone服务器返回的令牌。该项仅在定义了memcache_servers 后才生效,设为-1将会完全关闭缓存
20. cache: (可选) Env key for the swift cache
21. memcache_security_strategy: (可选) 如果定义, 指示令牌数据是否需要认证或认证加密。可接受的值包括MAC和ENCRYPT 。MAC选项将会在缓存中采用HMAC算法认证令牌,ENCRYPT选项将会在缓存中加密和认证。任何不是这两个值或空值中的一个,那么中间件将会在初始化阶段报错。
22. memcache_secret_key: (定义memcache_security_strategy后必需)该选项用来导出密钥;
23. memcache_pool_dead_retry: (可选), 重试以前memcache服务器被认为“已死”的秒数;
24. memcache_pool_maxsize: (可选), 每个memcache服务器最大开放连接数;
25. memcache_pool_socket_timeout: (可选), 套接字连接memcache服务器的超时秒数;
26. memcache_pool_unused_timeout: (可选), 不用的memcached连接多久会被关闭;
27. memcache_pool_conn_get_timeout: (可选), 一个操作从连接池中获得一个memcache客户端连接所等待的时间;
28. memcache_use_advanced_pool: (可选), 采用高级(eventlet安全的)memcache客户池,当前该高级连接池仅适用于python 2.x.
29. include_service_catalog: (可选, 默认True) 指示是否设置X-Service-Catalog 字段. 如果为False, 中间件在验证令牌的过程中将不会获取服务目录,同时也不会设置X-Service-Catalog 字段。
30. enforce_token_bind: (默认 permissive) 用来控制令牌绑定的使用和类型。设置为disabled 将不会检查令牌绑定,permissive 将会验证系统已知的绑定类型,忽略那些系统中没有定义的绑定类型;strict验证系统已知的绑定类型,拒绝系统未知类型的令牌绑定;required允许任何类型的令牌绑定。最后,绑定的方法必须出现在令牌中。
31. check_revocations_for_cached: (默认False), 如果为true,则会检查缓存令牌的撤销列表,要求在keystone服务器上配置PKI令牌;
32. hash_algorithms: (默认md5), 用来哈希PKI令牌的算法,可以使一个或多个,只要是python标准的hashlib.new()支持的算法即可。按照该项给出的顺序进行哈希尝试,因此将最为偏好的算法设置在该项的第一个。当从一个较不安全的算法向一个较安全的算法过渡时,该项通常设置为多个值,一旦所有旧令牌都过期,该项应该被设置成单一的值从而提升性能。