Bucket ACL(存取控制清單)是OSS提供的Bucket層級存取權限控制機制。通過Bucket ACL可直接設定Bucket的公開或私人存取權限,Object上傳時若未指定ACL,將自動繼承Bucket ACL設定。
工作原理
Bucket ACL通過預定義許可權值控制Bucket的存取範圍。OSS支援以下三種許可權:
許可權值 | 說明 |
private(預設值) | 私人。只有Bucket擁有者或被授權使用者可以對該Bucket內的檔案進行讀寫操作,其他人無法訪問。 |
public-read | 公用讀取。只有Bucket擁有者或被授權使用者可以寫入,任何人(包括匿名訪問者)都可以讀取。 |
public-read-write | 公用讀寫。任何人(包括匿名訪問者)都可以對該Bucket內檔案進行讀寫操作。 |
public-read-write:互連網上任何使用者都可以對該Bucket內的檔案進行訪問和寫入。這可能造成資料外泄、費用激增,甚至被惡意寫入違法資訊。除特殊情境外,不建議配置此許可權。
public-read:互連網上任何使用者都可以訪問該Bucket內檔案,可能造成資料外泄和費用激增,請謹慎操作。
設定Bucket ACL
建立Bucket時預設開啟阻止公用訪問,Bucket ACL只能設定為private。如需設定為public-read或public-read-write,請先關閉阻止公用訪問。
控制台
前往Bucket列表,單擊目標Bucket名稱。
在左側導覽列,選擇。
單擊设置,根據需求修改Bucket ACL。
單擊保存,完成設定。
命令列工具ossutil
使用命令列工具ossutil 2.0的put-bucket-acl命令配置Bucket ACL。
ossutil api put-bucket-acl --bucket example-bucket --acl privateSDK
以下僅列舉常見SDK修改Bucket ACL的程式碼範例,其他SDK的程式碼範例請參見SDK參考。
// 本樣本展示如何設定儲存空間的存取權限(ACL)
// 使用前請配置環境變數 OSS_ACCESS_KEY_ID 和 OSS_ACCESS_KEY_SECRET
import com.aliyun.sdk.service.oss2.OSSClient;
import com.aliyun.sdk.service.oss2.credentials.CredentialsProvider;
import com.aliyun.sdk.service.oss2.credentials.StaticCredentialsProvider;
import com.aliyun.sdk.service.oss2.models.*;
public class SetBucketAcl {
public static void main(String[] args) {
String bucketName = "example-bucket";
String accessKeyId = System.getenv("OSS_ACCESS_KEY_ID");
String accessKeySecret = System.getenv("OSS_ACCESS_KEY_SECRET");
CredentialsProvider provider = new StaticCredentialsProvider(accessKeyId, accessKeySecret);
try (OSSClient client = OSSClient.newBuilder()
.credentialsProvider(provider)
.region("<region-id>")
.build()) {
// 設定儲存空間 ACL 為私人
// 可選值: "private", "public-read", "public-read-write"
PutBucketAclRequest putRequest = PutBucketAclRequest.newBuilder()
.bucket(bucketName)
.acl("private")
.build();
PutBucketAclResult putResult = client.putBucketAcl(putRequest);
System.out.println("設定 Bucket ACL 成功,RequestId: " + putResult.requestId());
// 擷取儲存空間 ACL
GetBucketAclRequest getRequest = GetBucketAclRequest.newBuilder()
.bucket(bucketName)
.build();
GetBucketAclResult getResult = client.getBucketAcl(getRequest);
System.out.println("當前 Bucket ACL: " + getResult.accessControlPolicy().accessControlList().grant());
} catch (Exception e) {
System.err.println("操作失敗: " + e.getMessage());
}
}
}
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 本樣本展示如何設定儲存空間的存取權限(ACL)
# 使用前請配置環境變數 OSS_ACCESS_KEY_ID 和 OSS_ACCESS_KEY_SECRET
import alibabacloud_oss_v2 as oss
def main() -> None:
bucket_name = "example-bucket"
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
cfg.region = "<region-id>"
client = oss.Client(cfg)
# 設定儲存空間 ACL 為私人
# 可選值: "private", "public-read", "public-read-write"
put_result = client.put_bucket_acl(oss.PutBucketAclRequest(
bucket=bucket_name,
acl="private"
))
print(f"設定 Bucket ACL 成功,RequestId: {put_result.request_id}")
# 擷取儲存空間 ACL
get_result = client.get_bucket_acl(oss.GetBucketAclRequest(
bucket=bucket_name
))
print(f"當前 Bucket ACL: {get_result.acl}")
if __name__ == "__main__":
main()
// 本樣本展示如何設定儲存空間的存取權限(ACL)
// 使用前請配置環境變數 OSS_ACCESS_KEY_ID 和 OSS_ACCESS_KEY_SECRET
package main
import (
"context"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
func main() {
bucketName := "example-bucket"
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion("<region-id>")
client := oss.NewClient(cfg)
// 設定儲存空間 ACL 為私人
// 可選值: oss.BucketACLPrivate, oss.BucketACLPublicRead, oss.BucketACLPublicReadWrite
putResult, err := client.PutBucketAcl(context.TODO(), &oss.PutBucketAclRequest{
Bucket: oss.Ptr(bucketName),
Acl: oss.BucketACLPrivate,
})
if err != nil {
log.Fatalf("設定 Bucket ACL 失敗: %v", err)
}
log.Printf("設定 Bucket ACL 成功,RequestId: %s", putResult.Headers.Get("X-Oss-Request-Id"))
// 擷取儲存空間 ACL
getResult, err := client.GetBucketAcl(context.TODO(), &oss.GetBucketAclRequest{
Bucket: oss.Ptr(bucketName),
})
if err != nil {
log.Fatalf("擷取 Bucket ACL 失敗: %v", err)
}
log.Printf("當前 Bucket ACL: %s", *getResult.ACL)
}
<?php
// 本樣本展示如何設定儲存空間的存取權限(ACL)
// 使用前請配置環境變數 OSS_ACCESS_KEY_ID 和 OSS_ACCESS_KEY_SECRET
require_once __DIR__ . '/vendor/autoload.php';
use AlibabaCloud\Oss\V2 as Oss;
$bucketName = 'example-bucket';
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();
$cfg = Oss\Config::loadDefault();
$cfg->setCredentialsProvider($credentialsProvider);
$cfg->setRegion('<region-id>');
$client = new Oss\Client($cfg);
try {
// 設定儲存空間 ACL 為私人
// 可選值: BucketACLType::PRIVATE, BucketACLType::PUBLIC_READ, BucketACLType::PUBLIC_READ_WRITE
$putResult = $client->putBucketAcl(new Oss\Models\PutBucketAclRequest(
bucket: $bucketName,
acl: Oss\Models\BucketACLType::PRIVATE
));
printf("設定 Bucket ACL 成功,RequestId: %s\n", $putResult->requestId);
// 擷取儲存空間 ACL
$getResult = $client->getBucketAcl(new Oss\Models\GetBucketAclRequest(
bucket: $bucketName
));
printf("當前 Bucket ACL: %s\n", $getResult->accessControlList->grant);
} catch (Exception $e) {
printf("操作失敗: %s\n", $e->getMessage());
}
// 本樣本展示如何設定儲存空間的存取權限(ACL)
// 使用前請配置環境變數 OSS_ACCESS_KEY_ID 和 OSS_ACCESS_KEY_SECRET
using OSS = AlibabaCloud.OSS.V2;
var bucketName = "example-bucket";
var region = "<region-id>";
var cfg = OSS.Configuration.LoadDefault();
cfg.CredentialsProvider = new OSS.Credentials.EnvironmentVariableCredentialsProvider();
cfg.Region = region;
using var client = new OSS.Client(cfg);
try
{
// 設定儲存空間 ACL 為私人
// 可選值: "private", "public-read", "public-read-write"
var putResult = await client.PutBucketAclAsync(new OSS.Models.PutBucketAclRequest()
{
Bucket = bucketName,
Acl = "private"
});
Console.WriteLine($"設定 Bucket ACL 成功,RequestId: {putResult.RequestId}");
// 擷取儲存空間 ACL
var getResult = await client.GetBucketAclAsync(new OSS.Models.GetBucketAclRequest()
{
Bucket = bucketName
});
Console.WriteLine($"當前 Bucket ACL: {getResult.AccessControlPolicy?.AccessControlList?.Grant}");
}
catch (Exception ex)
{
Console.WriteLine($"操作失敗: {ex.Message}");
}
// 本樣本展示如何設定儲存空間的存取權限(ACL)
// 使用前請配置環境變數 OSS_ACCESS_KEY_ID 和 OSS_ACCESS_KEY_SECRET
const OSS = require('ali-oss');
async function main() {
const bucketName = 'example-bucket';
const client = new OSS({
region: 'oss-<region-id>',
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
authorizationV4: true,
});
try {
// 設定儲存空間 ACL 為私人
// 可選值: 'private', 'public-read', 'public-read-write'
await client.putBucketACL(bucketName, 'private');
console.log('設定 Bucket ACL 成功');
// 擷取儲存空間 ACL
const result = await client.getBucketACL(bucketName);
console.log(`當前 Bucket ACL: ${result.acl}`);
} catch (err) {
console.error('操作失敗:', err.message);
}
}
main();
查詢Bucket ACL變更記錄
當發現Bucket訪問異常、資料意外公開、收到安全警示或進行定期審計時,可通過Action Trail追蹤Bucket ACL的修改記錄,包括修改人員和修改時間。
前往Action Trail控制台,在左側功能表列選擇。
在頁面上方選擇要查詢的Bucket所在地區,設定服務名稱為
Object Storage Service(Oss)、事件名稱為PutBucketAcl,系統將自動查詢合格Bucket ACL變更記錄。在頁面右側關閉歸納列表選項,單擊變更記錄操作列的查看詳情,然後單擊配置時間軸,查看Bucket ACL變更前後的記錄值。
常見問題
CDN回源OSS時,OSS的Bucket ACL是否必須為公用讀取或者公用讀寫?
無需設定為公用讀取許可權。Bucket ACL為私人時,可開啟CDN回源私人Bucket功能。詳情請參見設定回源私人Bucket。
相關文檔
對於程式自訂要求較高的情境,可直接發起REST API請求。需要注意的是,直接發起REST API請求需要手動編寫代碼計算簽名。API詳情請參見PutBucketAcl。
如需長期授予其他使用者細粒度許可權,例如對Bucket下指定首碼的檔案進行唯讀或唯寫操作,可使用Bucket Policy或者RAM Policy。
如需臨時授予其他使用者細粒度許可權,例如列舉某個Bucket下所有檔案的許可權,應使用STS臨時授權的方式。更多資訊,請參見使用STS臨時訪問憑證訪問OSS。