Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >RGW 服务端加密爬坑记

RGW 服务端加密爬坑记

作者头像
用户1260683
发布于 2018-07-31 03:49:29
发布于 2018-07-31 03:49:29
2.6K00
代码可运行
举报
运行总次数:0
代码可运行

RGW 服务端加密爬坑记

参考了官方文档,决定采用 Customer-Provided Keys(Amazon SSE-C)方式进行加密

官网地址: http://docs.ceph.com/docs/master/radosgw/encryption/

使用boto3,测试用例如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import boto3
import os

BUCKET = 'test-bucket'
KEY = os.urandom(32)
s3 = boto3.client('s3',
                  endpoint_url='http://xx.xx.xx.xx',
                  aws_access_key_id='xxxx',
                  aws_secret_access_key='xxxx')

print("Uploading S3 object with SSE-C")

s3.put_object(Bucket=BUCKET,
              Key='encrypt-key',
              Body=b'foobar',
              SSECustomerKey=KEY,
              SSECustomerAlgorithm='AES256')
print "Done"

print("Getting S3 object...")

response = s3.get_object(Bucket=BUCKET,
                         Key='encrypt-key',
                         SSECustomerKey=KEY,
                         SSECustomerAlgorithm='AES256')
print("Done, response body:")
print(response['Body'].read())

第一轮尝试

发现报错提示如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
botocore.exceptions.ClientError: An error occurred (InvalidRequest) when calling the PutObject operation: Unknown

InvalidRequest 也就是说提交的参数不对,于是抓包对比,截图如下

Response 的内容如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="UTF-8"?><Error><Code>InvalidRequest</Code><BucketName>test-bucket</BucketName><RequestId>tx00000000000000000000c-005b3ae2a0-62db-default</RequestId><HostId>62db-default-default</HostId></Error>

同时参考官网的文档https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html,发现请求Request Header内容已经符合了AWS Using SSE-C的标准,所以很费解!

第二轮尝试

由于使用的是12.2.4做测试,有朋友用12.2.5同样的测试用例通过,怀疑可能是RGW的bug,于是就着手升级测试环境到12.2.5,但是升级完成以后仍然无法报400错误。

第三轮尝试

考虑到朋友那边可能boto3的版本和我不一样,于是又调整了boto3的版本,最终还是400报错。

第四轮尝试

于是在朋友建议下打开debug_rgw=20,发现日志有异常

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
2018-07-03 10:51:09.975043 7efc1642a700  2 req 2:0.001484:s3:PUT /test-bucket/encrypt-key:put_obj:recalculating target
2018-07-03 10:51:09.975047 7efc1642a700  2 req 2:0.001488:s3:PUT /test-bucket/encrypt-key:put_obj:reading permissions
2018-07-03 10:51:09.975049 7efc1642a700  2 req 2:0.001490:s3:PUT /test-bucket/encrypt-key:put_obj:init op
2018-07-03 10:51:09.975050 7efc1642a700  2 req 2:0.001492:s3:PUT /test-bucket/encrypt-key:put_obj:verifying op mask
2018-07-03 10:51:09.975052 7efc1642a700 20 required_mask= 2 user.op_mask=7
2018-07-03 10:51:09.975053 7efc1642a700  2 req 2:0.001495:s3:PUT /test-bucket/encrypt-key:put_obj:verifying op permissions
2018-07-03 10:51:09.975056 7efc1642a700 20 -- Getting permissions begin with perm_mask=50
2018-07-03 10:51:09.975057 7efc1642a700  5 Searching permissions for identity=rgw::auth::SysReqApplier -> rgw::auth::LocalApplier(acct_user=s3test, acct_name=s3test, subuser=, perm_mask=15, is_admin=0) mask=50
2018-07-03 10:51:09.975063 7efc1642a700  5 Searching permissions for uid=s3test
2018-07-03 10:51:09.975063 7efc1642a700  5 Found permission: 15
2018-07-03 10:51:09.975064 7efc1642a700  5 Searching permissions for group=1 mask=50
2018-07-03 10:51:09.975065 7efc1642a700  5 Permissions for group not found
2018-07-03 10:51:09.975066 7efc1642a700  5 Searching permissions for group=2 mask=50
2018-07-03 10:51:09.975066 7efc1642a700  5 Permissions for group not found
2018-07-03 10:51:09.975069 7efc1642a700  5 -- Getting permissions done for identity=rgw::auth::SysReqApplier -> rgw::auth::LocalApplier(acct_user=s3test, acct_name=s3test, subuser=, perm_mask=15, is_admin=0), owner=s3test, perm=2
2018-07-03 10:51:09.975071 7efc1642a700 10  identity=rgw::auth::SysReqApplier -> rgw::auth::LocalApplier(acct_user=s3test, acct_name=s3test, subuser=, perm_mask=15, is_admin=0) requested perm (type)=2, policy perm=2, user_perm_mask=2, acl perm=2
2018-07-03 10:51:09.975074 7efc1642a700  2 req 2:0.001514:s3:PUT /test-bucket/encrypt-key:put_obj:verifying op params
2018-07-03 10:51:09.975076 7efc1642a700  2 req 2:0.001518:s3:PUT /test-bucket/encrypt-key:put_obj:pre-executing
2018-07-03 10:51:09.975093 7efc1642a700  2 req 2:0.001534:s3:PUT /test-bucket/encrypt-key:put_obj:executing
2018-07-03 10:51:09.975112 7efc1642a700 15 supplied_md5_b64=bIEkMCj45FX6YX3V8CMs4Q==
2018-07-03 10:51:09.975117 7efc1642a700 15 ceph_armor ret=16
2018-07-03 10:51:09.975122 7efc1642a700 15 supplied_md5=6c81243028f8e455fa617dd5f0232ce1
2018-07-03 10:51:09.975176 7efc1642a700  5 ERROR: Insecure request, rgw_crypt_require_ssl is set
2018-07-03 10:51:09.975197 7efc1642a700  2 req 2:0.001638:s3:PUT /test-bucket/encrypt-key:put_obj:completing
2018-07-03 10:51:09.975247 7efc1642a700  2 req 2:0.001688:s3:PUT /test-bucket/encrypt-key:put_obj:op status=-2021
2018-07-03 10:51:09.975252 7efc1642a700  2 req 2:0.001693:s3:PUT /test-bucket/encrypt-key:put_obj:http status=400
2018-07-03 10:51:09.975275 7efc1642a700  1 ====== req done req=0x7efc16424110 op status=-2021 http_status=400 ======
2018-07-03 10:51:09.975286 7efc1642a700 20 process_request() returned -2021
2018-07-03 10:51:10.045566 7efc1642a700  1 civetweb: 0x7efc49de4000: 10.13.70.5 - - [03/Jul/2018:10:51:09 +0800] "PUT /test-bucket/encrypt-key HTTP/1.1" 400 0 - Boto3/1.7.24 Python/2.7.10 Darwin/17.6.0 Botocore/1.10.24

其中的ERROR: Insecure request, rgw_crypt_require_ssl is set 引起我的注意,于是检查线上配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@demo]#ceph daemon /var/run/ceph/ceph-client.rgw.demo.asok config show|grep ssl
    "kinetic_use_ssl": "false",
    "rgw_crypt_require_ssl": "true", 
    "rgw_keystone_verify_ssl": "true",
    "rgw_verify_ssl": "true",

发现rgw_crypt_require_ssl为true,于是改到false重启,终于成功。

总结

rgw_crypt_require_ssl=true 是RGW的默认配置,默认配置下只有开启HTTPS才能使用Server-side Encryption,这也是为了安全起见,但是如果在HTTP下面使用Server-side Encryption,则会出现本文中的400错误,而按照400错误给出的提示,错误的原因应该在客户端提交的参数不对,这样就极大的误导了我们,所以才有了上面一轮又一轮的故事。而且最坑爹的是,朋友使用的是vstart脚本启动的测试,vstart环境默认在ceph.conf里面就加上了rgw_crypt_require_ssl=false,看样子社区开发者是知道这个问题,才在测试环境下关闭这个特性,在没有文档说明和仅靠400报错提示的情况下,很多人都容易发生像我这样的爬坑故事。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-07-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Ceph对象存储方案 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Ceph RGW整体结构,最全干货在这!
小新 职场新人,存储小白 立志成为职场老鸟,存储专家; 影视迷,东野迷。   友情提醒:以下内容有点干,请自备快乐水~ 一、前言 Ceph中的对象存储网关RadosGW和Ceph RBD以及CephFS一样,构建在librados之上,主要提供的命令工具有如下: radosgw : 用来启动radosgw服务,并且提供restful的访问方式,也是下文讨论的对象 radosgw-admin : 用来提供admin的管理服务,如创建user等 另还有radosgw-es、radosgw-token和ra
腾讯云TStack
2020/05/20
9.6K0
源码阅读再来一发:解读RGW中request的处理流程
请求处理流程图 以civetweb为例 1. rgw_main.cc为整个radosgw服务的入口,main()函数中根据在ceph.conf的rgw frontends参数设置来选择不同的前端
用户1260683
2018/01/31
3.1K0
源码阅读再来一发:解读RGW中request的处理流程
初试 Ceph 存储之块设备、文件系统、对象存储
哎_小羊
2018/01/02
6.7K0
初试 Ceph 存储之块设备、文件系统、对象存储
Radosgw 架构
Ceph对象网关是一个构建在librados之上的对象存储接口,它为应用程序访问Ceph 存储集群提供了一个RESTful风格的网关。
用户4361118
2018/12/28
2.9K0
Radosgw 架构
Ceph理解
- 图虽然很复杂,但如果理解了几个基本操作的含义就很好读下来了,这里是三个操作的伪代码,take和emit很好理解,select主要是遍历当前bucket,如果出现重复、失败或者超载就跳过,其中稍微复杂的“first n”部分是一旦遇到失败,第一种情况是直接使用多备份,第二种情况是使用erasing code基本可以忽略。看着下面的图就更好理解具体的算法了
ZHaos
2019/02/27
2.4K0
Ceph对象存储安装部署及验证
今天来玩下Ceph的对象存储,在开始之前呢,先扯会闲篇,我觉得生活中处处是非结构化数据,最简单的举例,下面两个行业,一个是直播,一个是摄影。
DevinGeng
2019/04/09
2.3K0
Ceph对象存储安装部署及验证
ceph-对象存储
作为文件系统的磁盘,操作系统不能直接访问对象存储。相反,它只能通过应用程序级别的API访问。ceph是一种分布式对象存储系统,通过ceph对象网关提供对象存储接口,也称为RADOS网关(RGW)接口,它构建在ceph RADOS层之上。RGW使用librgw(RADOS Gateway library)和librados,允许应用程序与ceph对象存储建立连接。RGW为应用程序提供了一个RESTful S3/swift兼容的接口,用于在ceph集群中以对象的形式存储数据。ceph还支持多租户对象存储,可以通过RESTful API访问。此外,RGW还支持ceph管理API,可以使用本机API调用来管理ceph存储集群。
yuezhimi
2020/09/30
4.1K0
RGW Bucket Shard设计与优化-上
1 bucket index背景简介 bucket index是整个RGW里面一个非常关键的数据结构,用于存储bucket的索引数据,默认情况下单个bucket的index全部存储在一个shard文件(shard数量为0,主要以OMAP-keys方式存储在leveldb中),随着单个bucket内的Object数量增加,整个shard文件的体积也在不断增长,当shard文件体积过大就会引发各种问题,常见的问题有: 对index pool进行scrub或deep-scrub的时候,如果shard对应的Obj
用户1260683
2018/01/31
5.3K0
Large omap objects 排错实战
线上multisite环境出现HEALTH_WARN 32 large omap objects,已经bucket auto reshard=false,所以排除是bucket index 所在的shard omap过大引发的问题,官方的给出的告警信息无法定位到具体的object,于是有了下面的排错过程
用户1260683
2018/12/26
5.8K0
RGW Bucket Shard优化
bucket index是整个RGW里面一个非常关键的数据结构,用于存储bucket的索引数据,默认情况下单个bucket的index全部存储在一个shard文件(shard数量为0,主要以OMAP-keys方式存储在leveldb中),随着单个bucket内的Object数量增加,整个shard文件的体积也在不断增长,当shard文件体积过大就会引发各种问题。
Lucien168
2020/07/20
3.3K0
RGW Bucket Shard优化
ceph 清理和手动部署N版
df | grep ceph | awk '{print $NF}' | xargs -n1 umount
用户3701490
2021/10/21
1.9K0
基于RGW的多媒体处理框架
基于RGW的多媒体处理框架 背景 业务需要在原有RGW的服务基础上加上对多媒体类资源的处理,比如图片resize、视频转码等。参考过多个厂家的设计,发现对方的多媒体类处理都是在URL里面加上query
用户1260683
2019/11/06
1.1K0
ceph分布式存储-对象存储(RGW)搭建
PG数量的预估 集群中单个池的PG数计算公式如下:PG 总数 = (OSD 数 * 100) / 最大副本数 / 池数 (结果必须舍入到最接近2的N次幂的值)
Lucien168
2020/07/20
5.1K1
[614]python库boto3
在云计算的时代,自动化和编程接口对于快速开发和部署应用至关重要。Amazon Web Services (AWS) 作为全球最大的云服务提供商,提供了一个强大的库——boto3,它是AWS的Python SDK,允许Python开发者直接通过Python代码管理和使用AWS服务。
周小董
2025/05/02
2010
radowsgw 配置 s3cmd
http://www.lai18.com/content/6968965.html
py3study
2020/01/07
6240
index pool的 large omap 处理
向单个bucket压测2000W个object,默认设置shard数为16,压测到1800W出现large omap,介绍一下错误定位和如何处理。
用户1260683
2019/03/08
4.6K0
006.Ceph对象存储基础使用
Ceph 对象网关是一个构建在 librados 之上的对象存储接口,它为应用程序访问Ceph 存储集群提供了一个 RESTful 风格的网关 。
木二
2019/07/01
2.3K0
ceph对象存储折腾记 原
###前言 一直想弄对象存储,以前弄过一次,不是很理解region是个什么东西,后来时间和工作上的原因没有再折腾,这两天闲了下来,再次折腾了一次。我是参考的ceph的中文翻译文挡进行的部署和测试。传送门,文档里面介绍的和ceph本身的版本存在脱节的现象,可能初次接触的人会因为服务启动的问题摸不着头脑。 ###关于部署 安装ceph必要的软件包,配置好公共密钥和ceph mon的配置,这里我不再谈了。 对象存储额外需要安装的包是:ceph-radosgw和ceph-common 安装完毕你的系统上应该至少存在三个命令:rados 、 radosgw 、 radosgw-admin 其中整个对象网关服务就是由radosgw来启动的,radosgw-admin负责管理对象资源(用户,权限,bucket),rados基本算一个比较简单的s3客户端(?我这里可能理解不是很精确) ####配置 ceph.conf
domain0
2018/08/02
6660
ceph相关命令汇总
WORM将在08,09,10(月)01,02,03,04,05,06,07,08,09,10(日)周一,周二00:00:00-11:30:39禁用
summerking
2022/09/16
1K0
Kubernetes 集群基于 Rook 的 Ceph 存储之块设备、文件系统、对象存储
要使用基于 Rook 的 Ceph 存储中的块设备、文件系统以及对象存储,必须保证已通过 Rook 完成 Ceph 存储集群的搭建,并且保证 Ceph 存储集群处于 active + clean 状态。这里搭建过程可以参考上一篇 Kubernetes 集群基于 Rook 搭建 Ceph 分布式存储系统 文章,讲解的很详细。Kubernetes 集群搭建亦可参照上一篇文章,版本为 1.12.1,这里均忽略搭建过程,下边通过示例分别演示下如何使用这块设备、文件系统、对象存储方案。
哎_小羊
2019/05/25
4.9K1
相关推荐
Ceph RGW整体结构,最全干货在这!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验