Swift支持Amazon S3的机制及优化

    默认的Keystone安装后并不支持S3,需要修改Keystone的PasteDeploy配置文件,在ec2_extension之后加入s3_extension中间件。首先还需要定义该中间件:
1).在/etc/keystone/keystone.conf文件中增加如下配置:
[filter:s3_extension]
paste.filter_factory = keystone.contrib.s3:S3Extension.factory


2).修改public_api和admin_api的pipline配置,增加s3_extension:

[pipeline:public_api]
pipeline = token_auth admin_token_auth xml_body json_body debug ec2_extension s3_extension public_service
[pipeline:admin_api]
pipeline = token_auth admin_token_auth xml_body json_body debug ec2_extension s3_extension crud_extension admin_service


3).原生Swift则需要安装Swift3插件

修改Swift的proxy-server的配置文件:/etc/swift/proxy-server.conf,新增两个Middleware:

[filter:swift3]
use = egg:swift3#swift3


[filter:s3token]
paste.filter_factory = keystone.middleware.s3_token:filter_factory
auth_port = 35357
auth_host = 127.0.0.1
auth_protocol = http


在pipline中添加这两个Middleware:

[pipeline:main]

pipeline = catch_errors healthcheck cache swift3 s3token authtoken keystone proxy-server


     注意,Middleware的相对位置,swift3在s3token之前,s3token在authtoken之前。

    因为S3的接口和Swift的原生接口以及传送信息稍有差别。所以,Swift3 Middleware实现请求逻辑的转换(将S3的请求转化成Swift的请求(格式转化))。

    Swift S3 Client(S3的接口)向Server发送请求时只包含了Access Key和Secret ID,以及Bucket/Object等经过SHA256哈希计算得到的字符串,Swift为了兼容S3,需要在Bucket前拼接tenant或者Account形成Swift支持的url。s3_token每一次都会根据Access Key、Secret ID和Head中的token(X-Auth-Token'或'X-Storage-Token')信息向Keystone发送一次请求得到得到Secret ID和tenant。首先用HEAD中解析出来的Bucket/Object等信息,以及取回来的Secret ID作一次同样的SHA256哈希计算进行比对,若不一致,则不通过返回错误。

    若一致,则通过,继续后续的流程。tenant用来拼接成Swift认证的请求格式(导致一个机器向KeyStone的请求连接数就有几十万条)。KeyStone返回用户的tenant和token等信息,该token仍然可以再使用authtoken认证,但是这样一个请求就会经过两次认证,与KeyStone有两次的交互过程,可能作了两次数据库查询,latency会很大。后面再做一次authtoken的认证是多余的,可以将其去掉。


    基于此分析思路,可以在以下过程做优化:

1.修改s3_token不需要每次都向KeyStone鉴权并拿取tenant和token等信息,可将每个Access Key(明文传输)对应的tenant放入Cache。如果tenant不存在,再向Keystone申请。之后再拼接Swift标准的url;

    但是这样又会出现Access Key被人截取的问题,所以中间需要再加一层用于验证IP等信息。

2.WhiteList:获取Client HEAD中的IP('x-cluster-client-ip'或者'x-forwarded-for'),验证这个IP是否在白名单中,若是则验证通过,直接进入proxy,若不是则进行再正常的KeyStone鉴权流程。对应的pipeline如下:

Pipeline:catch_errors proxy-logging cache Swift3 s3_transformer white_list authtoken keystone slo proxy-server


Amazon S3及Swift的鉴权机制见下文!



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值