全部產品
Search
文件中心

Object Storage Service:Bucket ACL

更新時間:Jan 30, 2026

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,請先關閉阻止公用訪問。

控制台

  1. 前往Bucket列表,單擊目標Bucket名稱。

  2. 在左側導覽列,選擇許可權控制 > 讀寫權限

  3. 單擊设置,根據需求修改Bucket ACL。

  4. 單擊保存,完成設定。

命令列工具ossutil

使用命令列工具ossutil 2.0put-bucket-acl命令配置Bucket ACL。

ossutil api put-bucket-acl --bucket example-bucket --acl private

SDK

以下僅列舉常見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的修改記錄,包括修改人員和修改時間。

  1. 前往Action Trail控制台,在左側功能表列選擇事件 > 事件查詢

  2. 在頁面上方選擇要查詢的Bucket所在地區,設定服務名稱Object Storage Service(Oss)事件名稱PutBucketAcl,系統將自動查詢合格Bucket ACL變更記錄。

  3. 在頁面右側關閉歸納列表選項,單擊變更記錄操作列的查看詳情,然後單擊配置時間軸,查看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