バケットアクセス制御リスト(ACL)は、Object Storage Service (OSS) におけるバケットレベルのアクセス制御メカニズムであり、バケットに対して公開または非公開のアクセス権限を設定できます。オブジェクトをアップロードする際に ACL を明示的に指定しない場合、そのオブジェクトは自動的にバケットの ACL 設定を継承します。
仕組み
バケット ACL は、事前に定義された権限を使用してバケットへのアクセスを制御します。OSS では、以下の 3 種類の権限がサポートされています。
権限値 | 説明 |
private(デフォルト) | 非公開。バケットオーナーまたは権限付与されたユーザーのみが、バケット内のオブジェクトを読み取りおよび書き込みできます。他のユーザーはオブジェクトにアクセスできません。 |
public-read | 公開読み取り。バケットオーナーまたは権限付与されたユーザーのみがオブジェクトを書き込めます。匿名ユーザーを含むすべてのユーザーがオブジェクトを読み取れます。 |
public-read-write | 公開読み書き。匿名ユーザーを含むすべてのユーザーが、バケット内のオブジェクトを読み取りおよび書き込みできます。 |
public-read-write:インターネット上の誰でもこのバケット内のオブジェクトにアクセスおよび書き込みが可能です。これにより、データ漏洩や課金の急増、違法情報の悪意ある書き込みが発生する可能性があります。特殊なシナリオを除き、この権限を設定しないでください。
public-read:インターネット上の誰でもこのバケット内のオブジェクトにアクセス可能です。これにより、データ漏洩や課金の急増が発生する可能性があります。十分に注意してください。
バケット ACL の設定
バケットを作成する際、パブリックアクセスのブロックがデフォルトで有効になります。そのため、バケット ACL は非公開にしか設定できません。ACL を公開読み取りまたは公開読み書きに設定するには、まず「パブリックアクセスのブロック」を無効にする必要があります。
コンソール
バケットページに移動し、対象のバケット名をクリックします。
左側のナビゲーションウィンドウで、 を選択します。
セットアップ をクリックし、必要に応じてバケット ACL を変更します。
設定 をクリックして設定を保存します。
ossutil
ossutil V2.0 の put-bucket-acl コマンドを使用して、バケット ACL を設定できます。
ossutil api put-bucket-acl --bucket example-bucket --acl privateSDKs
以下は、一般的な SDK を使用してバケット 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("Set Bucket ACL successfully. RequestId: " + putResult.requestId());
// バケット ACL を取得します。
GetBucketAclRequest getRequest = GetBucketAclRequest.newBuilder()
.bucket(bucketName)
.build();
GetBucketAclResult getResult = client.getBucketAcl(getRequest);
System.out.println("Current Bucket ACL: " + getResult.accessControlPolicy().accessControlList().grant());
} catch (Exception e) {
System.err.println("Operation failed: " + 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"Set Bucket ACL successfully. RequestId: {put_result.request_id}")
# バケット ACL を取得します。
get_result = client.get_bucket_acl(oss.GetBucketAclRequest(
bucket=bucket_name
))
print(f"Current 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("Failed to set Bucket ACL: %v", err)
}
log.Printf("Set Bucket ACL successfully. 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("Failed to get Bucket ACL: %v", err)
}
log.Printf("Current 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("Set Bucket ACL successfully. RequestId: %s\n", $putResult->requestId);
// バケット ACL を取得します。
$getResult = $client->getBucketAcl(new Oss\Models\GetBucketAclRequest(
bucket: $bucketName
));
printf("Current Bucket ACL: %s\n", $getResult->accessControlList->grant);
} catch (Exception $e) {
printf("Operation failed: %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($"Set Bucket ACL successfully. RequestId: {putResult.RequestId}");
// バケット ACL を取得します。
var getResult = await client.GetBucketAclAsync(new OSS.Models.GetBucketAclRequest()
{
Bucket = bucketName
});
Console.WriteLine($"Current Bucket ACL: {getResult.AccessControlPolicy?.AccessControlList?.Grant}");
}
catch (Exception ex)
{
Console.WriteLine($"Operation failed: {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('Set Bucket ACL successfully.');
// バケット ACL を取得します。
const result = await client.getBucketACL(bucketName);
console.log(`Current Bucket ACL: ${result.acl}`);
} catch (err) {
console.error('Operation failed:', err.message);
}
}
main();
バケット ACL 変更履歴の照会
バケットへの異常なアクセスや誤ったデータ公開を検知した場合、セキュリティアラートを受け取った場合、または定期的な監査が必要な場合は、ActionTrail を使用してバケット ACL の変更を追跡できます。ActionTrail は、誰がいつ変更を行ったかを記録します。
ActionTrail コンソールに移動します。左側のナビゲーションウィンドウで、 を選択します。
ページ上部で、バケットが配置されているリージョンを選択します。Service Name を
Object Storage Service (OSS)に、Event Name をPutBucketAclに設定します。システムは自動的に一致するバケット ACL 変更レコードを照会・表示します。ページ右側で、Grouped List オプションを無効にします。変更レコードの操作列で [View Details] をクリックし、続いて [Configuration Timeline] をクリックして、バケット ACL 変更前後の値を確認します。
よくある質問
OSS からの CDN オリジンフェッチには、バケット ACL を公開読み取りまたは公開読み書きにする必要がありますか?
公開読み取り権限を設定する必要はありません。バケット ACL が非公開に設定されていても、CDN によるオリジンフェッチを有効にできます。詳細については、「非公開バケットのオリジンフェッチの設定」をご参照ください。
関連ドキュメント
高度なカスタマイズが必要なシナリオでは、REST API リクエストを直接送信することも可能です。ただし、REST API リクエストを送信する場合は、署名を計算するコードを手動で記述する必要があります。API の詳細については、「PutBucketAcl」をご参照ください。
特定のプレフィックスを持つバケット内のオブジェクトに対して、読み取り専用または書き込み専用など、長期的かつ詳細な権限を他のユーザーに付与する場合は、バケットポリシーまたはRAM ポリシーを使用できます。
バケット内のすべてのオブジェクトを一覧表示する権限など、一時的かつ詳細な権限を他のユーザーに付与する場合は、セキュリティトークンサービス(STS)による一時認証を使用できます。詳細については、「STS が提供する一時資格情報を使用して OSS にアクセスする」をご参照ください。