オブジェクトアクセス制御リスト (ACL) は、オブジェクトレベルでアクセスを制御できる Object Storage Service (OSS) の機能です。オブジェクトがそのバケットの権限とは独立した権限を必要とする場合、オブジェクト ACL を使用してその読み取り/書き込み権限を制御します。
仕組み
オブジェクト ACL は、事前定義された権限値を使用して、個々のオブジェクトのアクセス範囲を制御します。OSS は、以下の 4 つの権限をサポートしています。
値 | 説明 |
default | バケット ACL を継承します。オブジェクトの読み取り/書き込み権限は、そのバケットの権限と同じになります。 |
private | 非公開。オブジェクト所有者または許可されたユーザーのみがオブジェクトの読み取りと書き込みを行えます。他のすべてのユーザーからのアクセスは拒否されます。 |
public-read | 公開読み取り。匿名ユーザーを含む誰でもオブジェクトを読み取ることができます。書き込みはオブジェクト所有者または許可されたユーザーのみが行えます。 |
public-read-write | 公開読み書き。匿名ユーザーを含む誰でもオブジェクトの読み取りと書き込みを行えます。 |
オブジェクト ACL はバケット ACL より優先されます。オブジェクトの ACL が default 以外の値に設定されている場合、オブジェクト ACL がその権限を管理します。たとえば、オブジェクトの ACL が public-read に設定されている場合、バケットの ACL に関係なく、誰でもそのオブジェクトにアクセスできます。
public-read-write:インターネット上のすべてのユーザーがオブジェクトにアクセスし、書き込むことができます。これにより、データ漏えいや予期しない課金が発生したり、悪意のあるコンテンツや違法なコンテンツがアップロードされるリスクがあります。特定のユースケースを除き、この権限の使用は強く推奨されません。
public-read:誰でもオブジェクトを読み取ることができます。これにより、データ漏えいや予期しない課金が発生する可能性があります。この権限は注意して使用してください。
BucketWorm または ObjectWorm の保持ポリシーが適用されているオブジェクトには、オブジェクト ACL を設定できません。
オブジェクト ACL の設定
デフォルトでは、新しいバケットに対して 公開アクセス禁止が有効になっており、オブジェクト ACL は private または default に制限されます。ACL を public-read または public-read-write に設定するには、まず公開アクセス禁止を無効にする必要があります。
コンソール
バケットリストページに移動し、対象のバケット名をクリックします。
対象オブジェクトの [操作] 列で、詳細 をクリックし、次に ACLを設定 をクリックします。
目的の ACL (アクセス制御リスト) を選択し、OK をクリックします。
ossutil CLI
ossutil 2.0 コマンドラインツールの put-object-acl コマンドを使用して、オブジェクト ACL を設定します。
ossutil api put-object-acl --bucket examplebucket --key exampleobject --acl privateSDK
以下の例は、主要な 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 SetObjectAcl {
public static void main(String[] args) {
String bucketName = "example-bucket";
String objectName = "example.txt";
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 に設定します。
// 有効な値: "private", "public-read", "public-read-write", "default"
PutObjectAclRequest putRequest = PutObjectAclRequest.newBuilder()
.bucket(bucketName)
.key(objectName)
.objectAcl("private")
.build();
PutObjectAclResult putResult = client.putObjectAcl(putRequest);
System.out.println("Successfully set object ACL. RequestId: " + putResult.requestId());
// オブジェクト ACL を取得します。
GetObjectAclRequest getRequest = GetObjectAclRequest.newBuilder()
.bucket(bucketName)
.key(objectName)
.build();
GetObjectAclResult getResult = client.getObjectAcl(getRequest);
System.out.println("Current object 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"
object_name = "example.txt"
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 に設定します。
# 有効な値: "private", "public-read", "public-read-write", "default"
put_result = client.put_object_acl(oss.PutObjectAclRequest(
bucket=bucket_name,
key=object_name,
acl="private"
))
print(f"Successfully set object ACL. RequestId: {put_result.request_id}")
# オブジェクト ACL を取得します。
get_result = client.get_object_acl(oss.GetObjectAclRequest(
bucket=bucket_name,
key=object_name
))
print(f"Current object 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"
objectName := "example.txt"
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion("<region-id>")
client := oss.NewClient(cfg)
// オブジェクト ACL を private に設定します。
// 有効な値: oss.ObjectACLPrivate, oss.ObjectACLPublicRead, oss.ObjectACLPublicReadWrite, oss.ObjectACLDefault
putResult, err := client.PutObjectAcl(context.TODO(), &oss.PutObjectAclRequest{
Bucket: oss.Ptr(bucketName),
Key: oss.Ptr(objectName),
Acl: oss.ObjectACLPrivate,
})
if err != nil {
log.Fatalf("Failed to set object ACL: %v", err)
}
log.Printf("Successfully set object ACL. RequestId: %s", putResult.Headers.Get("X-Oss-Request-Id"))
// オブジェクト ACL を取得します。
getResult, err := client.GetObjectAcl(context.TODO(), &oss.GetObjectAclRequest{
Bucket: oss.Ptr(bucketName),
Key: oss.Ptr(objectName),
})
if err != nil {
log.Fatalf("Failed to get object ACL: %v", err)
}
log.Printf("Current object 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';
$objectName = 'example.txt';
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();
$cfg = Oss\Config::loadDefault();
$cfg->setCredentialsProvider($credentialsProvider);
$cfg->setRegion('<region-id>');
$client = new Oss\Client($cfg);
try {
// オブジェクト ACL を private に設定します。
// 有効な値: ObjectACLType::PRIVATE, ObjectACLType::PUBLIC_READ, ObjectACLType::PUBLIC_READ_WRITE, ObjectACLType::DEFAULT
$putResult = $client->putObjectAcl(new Oss\Models\PutObjectAclRequest(
bucket: $bucketName,
key: $objectName,
acl: Oss\Models\ObjectACLType::PRIVATE
));
printf("Successfully set object ACL. RequestId: %s\n", $putResult->requestId);
// オブジェクト ACL を取得します。
$getResult = $client->getObjectAcl(new Oss\Models\GetObjectAclRequest(
bucket: $bucketName,
key: $objectName
));
printf("Current object 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 objectName = "example.txt";
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 に設定します。
// 有効な値: "private", "public-read", "public-read-write", "default"
var putResult = await client.PutObjectAclAsync(new OSS.Models.PutObjectAclRequest()
{
Bucket = bucketName,
Key = objectName,
Acl = "private"
});
Console.WriteLine($"Successfully set object ACL. RequestId: {putResult.RequestId}");
// オブジェクト ACL を取得します。
var getResult = await client.GetObjectAclAsync(new OSS.Models.GetObjectAclRequest()
{
Bucket = bucketName,
Key = objectName
});
Console.WriteLine($"Current object 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 objectName = 'example.txt';
const client = new OSS({
region: 'oss-<region-id>',
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
bucket: bucketName,
authorizationV4: true,
});
try {
// オブジェクト ACL を private に設定します。
// 有効な値: 'private', 'public-read', 'public-read-write', 'default'
await client.putACL(objectName, 'private');
console.log('Successfully set object ACL.');
// オブジェクト ACL を取得します。
const result = await client.getACL(objectName);
console.log(`Current object ACL: ${result.acl}`);
} catch (err) {
console.error('Operation failed:', err.message);
}
}
main();
よくある質問
非公開オブジェクトを他のユーザーと一時的に共有するにはどうすればよいですか?
署名付き URL を生成することで、ACL を変更することなく、指定した期間だけ非公開オブジェクトへの一時的なアクセスをユーザーに許可できます。
参考資料
高度なカスタマイズが必要なシナリオでは、直接 REST API リクエストを行うことができます。これらのリクエストには手動で署名する必要があることにご注意ください。API の詳細については、「PutObjectACL」をご参照ください。
バケット内の特定のプレフィックスを持つオブジェクトへの読み取り専用または書き込み専用アクセスなど、他のユーザーに長期的できめ細かい権限を付与するには、バケットポリシーまたは RAM ポリシーを使用します。
他のユーザーに一時的できめ細かい権限を付与するには、セキュリティトークンサービス (STS) を使用できます。詳細については、「STS からの一時的なアクセス認証情報を使用して OSS にアクセスする」をご参照ください。