![55cb0e8e52c511589dd6b2869a71587d.png](https://img-blog.csdnimg.cn/img_convert/55cb0e8e52c511589dd6b2869a71587d.png)
如果我们已经搭建了一套Swift环境,接下来的第一件事就是构建自己的认证和授权系统。Swift通过中间件支持自定义的认证和授权。请参考《openstack swift》的第八章,了解如何编写Swift中间件;
认证和授权一般分为两步:
认证:与认证服务器通信,完成认证;同时获取关于用户的信息;
授权:通过配置文件写授权策略,中间件根据授权策略和用户信息完成授权;
Swift 认证和授权框架
![1f98c0ebfca692e87d059874245aef49.png](https://img-blog.csdnimg.cn/img_convert/1f98c0ebfca692e87d059874245aef49.png)
上图是Swift认证的整个流程:
- Swift服务提供商在认证服务器上为用户创建用户名和密码;
- Swift服务提供商以某种方式告知用户他的用户名、密码、和认证服务器地址;
- 用户向认证服务器发送自己用户名和密码,认证服务器返回给用户SotrageURL和Token;
- 用户向proxy server发送HTTP Restful API请求;
- proxy server利用认证中间件插件向认证服务器验证用户的合法性;
- 如果认证通过,利用memcache将用户信息进行缓存;
- 中间件根据授权策略和用户信息完成授权。
提示
AuthURL与StorageURL不同,AuthURL是认证服务器的地址,StorageURL一般是Proxy Server的地址;
Swift作为Openstack家族的一员,一般会选择keystone作为认证服务;
Swift也为Keystone服务开发了对应的认证插件,由authtoken和keystoneauth组成;
authtoken负责与keystone服务交互,获取认证信息;
- keystoneauth根据认证返回的信息,对用户进行授权;
- 认证服务器只是对用户的Token进行认证,并返回认证信息,授权行为则完全交给认证服务器对应的中间件来完成。
Keystone服务
因为keystone与Swift的关系紧密,我们先大致了解以下keystone。站在用户的角度来看,keystone包括:Domain、project、user、service、endpoint、group、token、role和endpoint。keystone就是提供了对Domain、project、user、service、endpoint、group、token、role的增删改查。region只是用来区分一个服务下的多个endpoint。
上面这就个概念之间的关系,如下:
![d0fa71723c03d51d067edfd56cc0dfaa.png](https://img-blog.csdnimg.cn/img_convert/d0fa71723c03d51d067edfd56cc0dfaa.png)
提示
以上概念相互独立;
role也是一个相互独立的概念,用户和组都可以被赋予一个或多个角色。
如果我们希望使用keystone作为认证服务器:
- 需要在keystone服务上创建service、region、endpoint、role。Swift支持跨region部署,所以可以创建多个region和endpoint。
- 当创建用户时,需要创建user、group、project。Swift上一个用户对应一个组,对应一个独立的project。
- 为用户和组分配角色。Swift中包括全局管理员和普通用户,全局管理员可以操作所有用户的数据,普通用户只能操作自己的数据。
更多keystone操作,参见这里
认证中间件配置
现在,让我们来看一下keystone认证中间件的配置。
[filter:authtoken]
paste.filter_factory = keystonemiddleware.auth_token:filter_factory
auth_uri = http://192.168.100.20:5000
auth_url = http://192.168.100.20:35357
auth_plugin = password
username = xxx
password = yyy
project_name = admin
project_domain_name = default
user_domain_name = default
# delay_auth_decision defaults to False, but leaving it as false will prevent other auth systems, staticweb, tempurl, formpost, and ACLs from working. This value must be explicitly set to True.
delay_auth_decision = True
cache = swift.cache
authtoken设置的Swift的管理员的账户信息,它拥有在keystone下管理用户的权限。
[filter:keystoneauth]
use = egg:swift#keystoneauth
reseller_prefix = AUTH
operator_roles = admin,swiftoperator,admin-readonly
reseller_admin_role = admin
keystoneauth指明:拥有admin角色的用户或组,在Swift中是全局管理员。拥有admin,swiftoperator,admin-readonly角色的用户和组,在Swift中是普通用户。
提示
一个user,对应一个project
Account = AUTH_$(project)
keystone返回的role只是一个标记。该标记如何被解释由中间件自己决定;
ACL 是keystoneauth权限的补充,ACL是由认证中间件实现的。
更多信息请参见:这里和这里
swift auth middleware
![84d5c836c1bc0670f00255dd56af993f.png](https://img-blog.csdnimg.cn/img_convert/84d5c836c1bc0670f00255dd56af993f.png)
ubuntu安装keystone
项目地址:https://github.com/swiftstack/keystone_install
安装步骤
- 安装vim和curl
- 拷贝keystone到opt目录下面(如果keystone源代码下载过慢的话,可以将代码事先放置在/opt下,注意修改安装脚本)
- 安装特定版本的oslo.config: apt-get update; apt-get -y install git python-pip; pip install 'oslo.config==1.7.0'
- keystone_install项目
redhat-7上安装keystone
安装向导:http://confluence.chinac.com/pages/viewpage.action?pageId=5381923
注意:在/etc/keystone/keystone.conf文件中provider = fernet不需更改,这样安装会更快一点