子賬戶及STS臨時賬戶呼叫OSS的常見問題及排查

何昔發表於2018-02-01

STS臨時賬戶呼叫常見的錯誤碼及原因參考:STS常見問題及排查

1)子賬戶要如何授權只讀bucket的許可權

為此子使用者附加系統授權策略”AliyunOSSReadOnlyAccess”,該許可權擁有全部bucket的只讀許可權;
3

2)子賬戶只讀單個bucket的policy如何編寫

如果您需要授權一個子使用者(例如,代表您的某個應用程式)通過 OSS SDK 或 OSS CMD 列出並讀取一個 Bucket 中的資源,那麼您需要建立一條自定義授權策略來完成。

  假設您的 Bucket 名稱為 “myphotos”,那麼建立的授權策略樣例如下:

{
    "Version": "1",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "oss:ListObjects",
            "Resource": "acs:oss:*:*:myphotos"
        },
        {
            "Effect": "Allow",
            "Action": "oss:Get*",
            "Resource": [
                "acs:oss:*:*:myphotos",
                "acs:oss:*:*:myphotos/*"
            ]
        }
    ]
}

  如果您希望被授權的子使用者能夠通過 OSS 控制檯/客戶端進行操作,那麼授權策略中還需要新增 GetBucketAcl 以及 GetObjectAcl 許可權(控制檯為了操作體驗的優化需要額外呼叫 OSS 的部分 API)。目前控制檯的policy定義只能實現能看到所有的bucket但是隻對授權的bucket有許可權,允許子使用者通過 OSS 控制檯操作的授權策略樣例如下:

{
    "Version": "1",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "oss:ListBuckets",
            "Resource": "acs:oss:*:*:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "oss:ListObjects",
                "oss:GetBucketAcl"
            ],
            "Resource": "acs:oss:*:*:myphotos"
        },
        {
            "Effect": "Allow",
            "Action": [
                "oss:Get*"
            ],
            "Resource": [
                "acs:oss:*:*:myphotos",
                "acs:oss:*:*:myphotos/*"
            ]
        }
    ]
}

3)子賬戶擁有單個bucket的全部許可權,policy如何編寫

如果您需要授權一個子使用者(例如,代表您的某個應用程式)通過 OSS SDK 或 OSS CMD 管理Bucket 中的資源,那麼您需要建立一條自定義授權策略來完成。

{
    "Version": "1",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "oss:*",
            "Resource": [
                "acs:oss:*:*:myphotos",
                "acs:oss:*:*:myphotos/*"
            ]
        }
    ]
}

如果您希望被授權的子使用者能夠通過 OSS 控制檯/客戶端進行操作,那麼得為policy授權listbucket許可權;策略如下

{
    "Version": "1",
"Statement": [
    {
            "Effect": "Allow",
            "Action": "oss:ListBuckets",
            "Resource": "acs:oss:*:*:*"
    },
        {
            "Effect": "Allow",
            "Action": "oss:*",
            "Resource": [
                "acs:oss:*:*:myphotos",
                "acs:oss:*:*:myphotos/*"
            ]
        }
    ]
}

4)子賬戶擁有單個bucket下某個目錄的許可權,策略如何編寫

如果是sdk /API 呼叫,那麼授權如下:

{
        "Version": "1",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "oss:*"
                ],
                "Resource": [
                    "acs:oss:*:*:gsdata-img1/gsdata/*"
                ]
            },
            {
                "Effect": "Allow",
                "Action": [
                    "oss:ListObjects"
                ],
                "Resource": [
                    "acs:oss:*:*:gsdata-img1"
                ],
                "Condition": {
                    "StringLike": {
                        "oss:Prefix": [
                            "gsdata/*"
                        ]
                    }
                }
            }
        ]
}

如果想實現控制檯/客戶端工具呼叫,只能看到bucket某個目錄下的資源,並且只有對應目錄的許可權,其他目錄沒許可權,也不能看到其他目錄,目前實現不了,只能實現能看到其父目錄下的所有資源及目錄,但其他沒許可權的目錄不能進入,資源也不能獲取,策略如下:

{
        "Version": "1",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "oss:ListBuckets",
                    "oss:GetBucketAcl"
                ],
                "Resource": [
                    "acs:oss:*:*:*"
                ]
            },
            {
                "Effect": "Allow",
                "Action": [
                    "oss:*"
                ],
                "Resource": [
                    "acs:oss:*:*:gsdata-img1/gsdata/*"
                ]
            },
            {
                "Effect": "Allow",
                "Action": [
                    "oss:ListObjects"
                ],
                "Resource": [
                    "acs:oss:*:*:gsdata-img1"
                ],
                "Condition": {
                    "StringLike": {
                        "oss:Delimiter": "/",
                        "oss:Prefix": [
                            "",
                            “gsdata/*”
                        ]
                    }
                }
            },
            {
                "Effect": "Allow",
                "Action": [
                    "oss:ListObjects"
                ],
                "Resource": [
                    "acs:oss:*:*:gsdata-img1"
                ],
                "Condition": {
                    "StringLike": {
                        "oss:Prefix": [
                            "gsdata/*"
                        ]
                    }
                }
            }
        ]
}

5)子賬戶及STS賬戶的業務場景是什麼

1.子賬戶及STS臨時賬戶的業務場景 的介紹

6)STS臨時賬戶生成後,如何呼叫操作OSS的資源

通過SDK傳入STS臨時賬戶的ak,sk,token 來進行初始化client,進行相關介面的呼叫
JAVA sdk 初始化:授權訪問
PYTHON SDK初始化:授權訪問
Android SDK初始化:初始化
IOS SDK初始化:初始化
.NET SDK初始化:授權訪問
PHP SDK初始化:授權訪問
JS WEB SDK初始化:使用STS
C SDK初始化:授權訪問

7)STS請求獲取報錯NoPermission

I) 就報錯而言是沒許可權
II)為子賬戶授權AliyunSTSAssumeRoleAccess 許可權
4

為角色授權oss的全部許可權,再生成臨時賬戶看看是否正常
III)還是異常,工單反饋下子賬戶的accesskeyid 及對應的報錯資訊,密碼不用反饋

8)STS呼叫OSS報錯InvalidAccessKeyId

STS呼叫報錯如下:

<Error>
<Code>InvalidAccessKeyId</Code>                                                                    <Message>The OSS Access Key Id you provided does not exist in our records.</Message>                                                                   <RequestId>5A2F6CE3295E55B2D7360E0F</RequestId>                                                                   <HostId>*******.oss-cn-beijing.aliyuncs.com</HostId>                                                                     <OSSAccessKeyId>STS.lTAI53kJu28QUJJt</OSSAccessKeyId>
</Error>

I ) 排查初始化client是否有傳入STS的accesskey ID 密碼及token,參考《6)STS臨時賬戶生成後,如何呼叫操作OSS的資源》進行初始化client
II ) 排查STS臨時賬戶是否過期,STS臨時賬戶存在過期時間,最長3600秒過期,嘗試重新生成STS臨時賬戶進行操作object看看是否正常

9)STS臨時賬戶呼叫報錯AccessDenied

報錯資訊如下:

<Error>                                                                    <Code>AccessDenied</Code>                                                                   <Message>You have no right to access this object because of bucket acl.</Message>                                                                  <RequestId>5A2F894D99C1BD4157DB52E1</RequestId>                                                                  <HostId>record-image-server.oss-cn-beijing.aliyuncs.com</HostId>
</Error>

I) 該報錯為臨時賬戶沒有對應操作的許可權
II) 排查建立STS臨時賬戶的子賬戶是否有授權AliyunSTSAssumeRoleAccess 許可權或者扮演對應角色的許可權,為子賬戶授權AliyunSTSAssumeRoleAccess 許可權測試
III) 排查建立STS臨時賬戶的角色,是否有授權對應bucket對應介面的許可權,為角色授權AliyunOSSFullAccess許可權測試
IV 排查建立STS臨時賬戶時傳入的policy是否有對應bucket對應介面的許可權,設定policy為OSSFULL許可權看看是否正常;

{
  "Statement": [
    {
      "Action": "oss:*",
      "Effect": "Allow",
      "Resource": "*"
    }
  ],
  "Version": "1"
}

10)STS臨時賬戶呼叫OSS報錯Access denied by authorizer`s policy

I):AssumeRole的子使用者沒有許可權,請給子使用者授予AliyunSTSAssumeRoleAccess系統授權策略。請在 訪問控制 > 使用者管理 > 授權 > 可選授權策略名稱 中給子使用者授權 AliyunSTSAssumeRoleAccess。
II):申請角色扮演的子使用者的雲賬號ID與角色的“受信雲賬號ID”不符,請角色建立者確認並修改。子使用者的雲賬號ID,即建立子使用者的主使用者的ID;角色的雲賬號ID,即建立角色的主使用者的雲賬號ID。請在如下位置確認修改: 訪問控制 > 角色管理 > 管理 > 角色詳細 > 編輯基本資訊 中確認修改。
III):角色的型別錯誤,如果角色的型別分為“使用者角色”和“服務角色”,服務角色不能使用AssumeRole扮演臨時使用者。


相關文章