記錄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,還好只是小版本的更新!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章