记录ceph对象存储的一个bug

我们的对象存储是基于ceph的对象存储搭建的,测试环境是N版本的,生产环境是M版本的。业务使用的是doesObjectExist这个API,核心Java代码如下

        boolean exists = s3Client.doesObjectExist(bucketName, object+"ss");
        if (exists) {
            System.out.println("Object \"" + bucketName + "/" + object + "\" exists!");
        }
        else {
            System.out.println("Object \"" + bucketName + "/" + object + "\" does not exist!");
        }

doesObjectExist本质上是通过HTTP HEAD请求,检查存储是否存在。这个API在测试环境运行ok,但生产环境却是403异常,通过抓包测试可以发现,当使用普通用户返回403,但如果是用admin则是404.如下
在这里插入图片描述
一开始我们以为是授权问题,因为S3标准是这样的写的
在这里插入图片描述
简单来说就是如果有ListBucket权限就返回404,没有就返回403。但我们反复检查策略,即便是放开所有权限都不行

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowAll",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::<bucket>/*",
                "arn:aws:s3:::<bucket>" 
            ]
        }
    ]
}

并且测试环境和生产环境使用相同的策略。那么只可能是生产环境这个版本的有bug。
最终我们找到bug
就是在policy校验的地方有问题,原来的代码只有admin才能校验通过。
在这里插入图片描述
解决办法就是升级ceph,还好只是小版本的更新!

发布了215 篇原创文章 · 获赞 103 · 访问量 461万+

猜你喜欢

转载自blog.csdn.net/u010278923/article/details/105308438
今日推荐