同じバケットに対して異なる権限を必要とする複数のアプリケーションやチームのアクセスを管理するために、それぞれに個別のアクセスポイントを作成できます。このアプローチでは、エンティティごとに専用のアクセスポイントポリシーを使用するため、単一の複雑なバケットポリシーの複雑さを回避できます。
仕組み
アクセスポイントは、バケットアクセス用のプロキシレイヤーとして機能します。アクセスポイントを作成すると、Object Storage Service (OSS) は一意の アクセスポイントエイリアス を生成します。リクエストではバケット名の代わりにこのエイリアスを使用します。各アクセスポイントは、許可されるアクション、リソース、ID を定義する独自の アクセスポイントポリシー と、ユースケースに基づいてアクセスを分離できる ネットワークオリジン (インターネットまたは特定の Virtual Private Cloud (VPC)) で設定できます。
アクセスポイント経由でリクエストを行うと、システムは RAM ポリシー、バケットポリシー、AP ポリシーの 3 種類のポリシーを評価します。RAM ポリシーとバケットポリシーを組み合わせた結果が許可であり、かつ AP ポリシーも許可である場合にのみ、リクエストは許可されます。権限評価ロジックの詳細については、「権限評価ロジック」をご参照ください。
デフォルトでは、アクセスポイントはバケットリソースにアクセスできません。まず、バケットポリシーで 権限委任 を設定し、oss:DataAccessPointArn、oss:DataAccessPointAccount、または oss:AccessPointNetworkOrigin の条件キーを使用して、特定のアクセスポイントがバケットにアクセスすることを明示的に許可する必要があります。
クイックスタート
このセクションでは、アクセスポイントを使い始めるための 3 つのステップ (アクセスポイントの作成、権限委任の設定、アクセスポイントを使用したリソースへのアクセス) を説明します。
ステップ 1:アクセスポイントの作成
アクセスポイントを作成し、そのポリシーを設定して、「どの ID」が「どの条件」下で「どの OSS リソース」に対して「どのアクション」を実行できるかを定義します。
アクセスポイント のリストに移動し、[アクセスポイントの作成] をクリックします。
[アクセスポイント名] を入力し、関連するバケットとネットワークオリジンを選択してから、[次へ] をクリックします。
説明[ネットワークオリジン] を [VPC] に設定した場合は、[VPC ID] を入力する必要があります。ID は VPC コンソールから取得できます。
指定された VPC のリージョンは、OSS ゲートウェイエンドポイントをサポートするリージョンである必要があります。リージョンが一致しない場合、認証リクエストが VPC に正しく関連付けられず、認証が失敗します。
[パブリックアクセスのブロック] オプションをオフにし、アクセスポイントポリシーを設定します。
ビジュアルエディター
パラメーター
説明
関連リソース
バケット全体 または 指定されたリソース のどちらに権限を付与するかを選択します。
リソースパス
関連リソース で バケット全体 を選択した場合、リソースパス は
accesspoint/{access-point-name}/*になります。関連リソース で 指定されたリソース を選択した場合、ディレクトリまたは個別のオブジェクトを入力します。複数のエントリを追加できます。
ユーザー
権限を付与する ID を指定します。
[RAM ユーザー]:現在の Alibaba Cloud アカウント配下の RAM ユーザーを選択します。
現在のアカウントの RAM ユーザーのリストを表示するには、ログインしているアカウントが Alibaba Cloud アカウントであるか、このバケットの管理権限と Resource Access Management (RAM) コンソールの
ListUsers権限を持つ RAM ユーザーである必要があります。[その他のアカウント]:別のアカウントまたは RAM ユーザーの UID、あるいは
arn:stsで始まる一時ユーザーの ARN (例:arn:sts::1798************:assumed-role/role-name/session-name) を入力します。複数のユーザーを承認でき、1行に1エントリを記述します。
許可された操作
[簡易設定]:一般的な権限の組み合わせから選択します。オプションには、読み取り専用 (ListObject を除く)、読み取り専用 (ListObject を除く)、[読み取り/書き込み]、フルコントロール、アクセス拒否 があります。
[詳細設定]:効果 (許可する または 拒否) と承認された [アクション] をカスタマイズします。
JSON エディター
エディターに JSON 形式でポリシーを入力します。
ポリシー例:ユーザー
20816353761158****に読み取り/書き込み権限を付与します。{ "Version": "1", "Statement": [{ "Effect": "Allow", "Action": [ "oss:GetObject", "oss:PutObject", "oss:GetObjectAcl", "oss:PutObjectAcl", "oss:ListObjects", "oss:AbortMultipartUpload", "oss:ListParts", "oss:RestoreObject", "oss:ListObjectVersions", "oss:GetObjectVersion", "oss:GetObjectVersionAcl", "oss:RestoreObjectVersion" ], "Principal": [ "20816353761158****" ], "Resource": [ "acs:oss:{region-id}:179882766168****:accesspoint/{ap-name}/object/*" ] }, { "Effect": "Allow", "Action": [ "oss:ListObjects", "oss:GetObject" ], "Principal": [ "20816353761158****" ], "Resource": [ "acs:oss:{region-id}:179882766168****:accesspoint/{ap-name}" ], "Condition": { "StringLike": { "oss:Prefix": [ "*" ] } } }] }完全なポリシーには、Version と 1 つ以上の Statement 要素が含まれます。
Version:ポリシーのバージョンです。これは
1に固定されており、変更できません。Statement:ポリシーの本体であり、権限を付与または拒否する 1 つ以上のルールが含まれます。各ステートメントには、effect、action、principal、resource、condition が含まれます。
ポリシー要素
説明
Effect
ポリシーの効果で、
AllowまたはDenyのいずれかです。Action
リソースに対して実行される特定の操作です。ワイルドカード文字 (
*) がサポートされています。Principal
ポリシーが適用される ID (ユーザー、アカウント、ロールなど) です。
Resource
ポリシーが適用されるリソースです。
Condition
ポリシーが有効になるために満たす必要がある条件です。
複数の条件が設定されている場合、ポリシーが有効になるには すべての条件を満たす 必要があります (AND 関係)。
承認要素の完全なリストについては、「ポリシーの構文と構造」をご参照ください。
[送信] をクリックし、アクセスポイントが作成されるのを待ちます。
ステップ 2:権限の委任
アクセスポイントを作成した後、権限を委任するためにバケットポリシーも作成する必要があります。このポリシーは、どのアクセスポイントがバケットにアクセスできるかを定義します。アクセスポイントには 3 種類の権限委任があります:
oss:DataAccessPointArn:特定のアクセスポイントのアクセス権限を委任します。oss:DataAccessPointAccount:現在のアカウント配下のすべてのアクセスポイントのアクセス権限を委任します。oss:AccessPointNetworkOrigin:指定されたネットワークオリジンからのすべてのアクセスポイントのアクセス権限を委任します。
特定のアクセスポイントへの委任
[バケット] リストに移動し、対象のバケットをクリックします。
左側のナビゲーションウィンドウで、 をクリックし、[ポリシー構文で追加] を選択します。
[編集] をクリックし、エディターに JSON 形式でポリシーを入力します。
説明設定する際は、例の UID、バケット名、リージョン ID、アクセスポイント名を独自の値に置き換えてください。バケットポリシーが空でない場合は、既存のポリシーに
Statement要素を追加してください。{ "Version": "1", "Statement": [{ "Effect": "Allow", "Action": [ "oss:*" ], "Principal": [ "*" ], "Resource": [ "acs:oss:*:179882766168****:example-bucket", "acs:oss:*:179882766168****:example-bucket/*" ], "Condition": { "StringEquals": { "oss:DataAccessPointArn": [ "acs:oss:oss-{region-id}:179882766168****:accesspoint/{ap-name}" ] } } }] }[保存] をクリックして、バケットポリシーの設定を完了します。
すべてのアクセスポイントへの委任
[バケット] リストに移動し、対象のバケットをクリックします。
左側のナビゲーションウィンドウで、 をクリックし、[ポリシー構文で追加] を選択します。
[編集] をクリックし、エディターに JSON 形式でポリシーを入力します。
説明設定する際は、例の UID とバケット名を独自の値に置き換えてください。バケットポリシーが空でない場合は、既存のポリシーに
Statement要素を追加してください。{ "Version": "1", "Statement": [{ "Effect": "Allow", "Action": [ "oss:*" ], "Principal": [ "*" ], "Resource": [ "acs:oss:*:179882766168****:example-bucket", "acs:oss:*:179882766168****:example-bucket/*" ], "Condition": { "StringEquals": { "oss:DataAccessPointAccount": [ "179882766168****" ] } } }] }[保存] をクリックして、バケットポリシーの設定を完了します。
ネットワークオリジンによる委任
[バケット] リストに移動し、対象のバケットをクリックします。
左側のナビゲーションウィンドウで、 をクリックし、[ポリシー構文で追加] を選択します。
[編集] をクリックし、エディターに JSON 形式でポリシーを入力します。
説明設定する際は、例の UID とバケット名を独自の値に置き換えてください。バケットポリシーに既にコンテンツが含まれている場合は、既存のポリシーの
Statement配列に新しい要素を追加してください。oss:AccessPointNetworkOriginがinternetに設定されている場合、ネットワークオリジンがインターネットであるすべてのアクセスポイントに権限が委任されます。この設定では、パブリックインターネットと VPC の両方からのアクセスが許可されます。アクセスを VPC のみに制限するには、この値をvpcに変更します。
{ "Version": "1", "Statement": [{ "Effect": "Allow", "Action": [ "oss:*" ], "Principal": [ "*" ], "Resource": [ "acs:oss:*:179882766168****:example-bucket", "acs:oss:*:179882766168****:example-bucket/*" ], "Condition": { "StringEquals": { "oss:AccessPointNetworkOrigin": [ "internet" ] } } }] }[保存] をクリックして、バケットポリシーの設定を完了します。
「バケットポリシーにはパブリックアクセスセマンティクスが含まれています」というメッセージが表示された場合は、アクセスポイントに権限を委任する前に、バケットの [パブリックアクセスのブロック] オプションをオフにしてください。
ステップ 3:アクセスポイント経由でのリソースへのアクセス
アクセスポイントを作成すると、OSS は自動的にアクセスポイントエイリアスを生成します。RAM ユーザーなどの承認された ID は、このエイリアスを使用して対応する OSS リソースにアクセスできます。
SDK
現在、アクセスポイントエイリアスを使用して OSS リソースにアクセスできるのは、Java SDK と Python SDK のみです。
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.GetObjectRequest;
import java.io.File;
/**
* これは、アクセスポイントを使用してオブジェクトをローカルファイルにダウンロードする方法を示す OSS Java SDK v2 の例です。
*/
public class DownloadObjectWithAccessPoint {
public static void main(String[] args) {
// OSS クライアントを作成します。
String accessKeyId = System.getenv("OSS_ACCESS_KEY_ID");
String accessKeySecret = System.getenv("OSS_ACCESS_KEY_SECRET");
CredentialsProvider provider = new StaticCredentialsProvider(accessKeyId, accessKeySecret);
OSSClient client = OSSClient.newBuilder()
.credentialsProvider(provider)
.region("<region-id>")
.build();
// アクセスポイントエイリアスを使用してオブジェクトをローカルファイルにダウンロードします。
String bucket = "example-ap-b156d01070a10322664d6704cd1d47****-ossalias";
String key = "example.jpg";
File file = new File("example.jpg");
client.getObjectToFile(GetObjectRequest.newBuilder()
.bucket(bucket)
.key(key)
.build(), file);
System.out.println("File downloaded: " + key + " -> " + file.getPath());
// クライアントを閉じます。
try {
client.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""これは、アクセスポイントを使用してオブジェクトをローカルファイルにダウンロードする方法を示す OSS Python SDK v2 の例です。"""
import alibabacloud_oss_v2 as oss
def main() -> None:
"""メイン関数。"""
# OSS クライアントを作成します。
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
config = oss.config.load_default()
config.credentials_provider = credentials_provider
config.region = "<region-id>"
config.endpoint = "oss-<region-id>.aliyuncs.com"
client = oss.Client(config)
# アクセスポイントエイリアスを使用してオブジェクトをローカルファイルにダウンロードします。
bucket = "example-ap-b156d01070a10322664d6704cd1d47****-ossalias"
key = "example.jpg"
file_path = "example.jpg"
request = oss.GetObjectRequest(bucket, key)
client.get_object_to_file(request, file_path)
print(f"File downloaded: {key} -> {file_path}")
if __name__ == "__main__":
main()
ossutil
ossutil を使用して OSS リソースにアクセスする場合、バケット名としてアクセスポイントエイリアスを使用します。
ossutil cp oss://example-ap-b156d01070a10322664d6704cd1d47****-ossalias/example.jpg /tmpREST API
REST API を使用して OSS リソースにアクセスする場合、Host ヘッダーでアクセスポイントエイリアスを使用します。以下に例を示します:
GET /ObjectName HTTP/1.1
Host: example-ap-b156d01070a10322664d6704cd1d47****-ossalias.oss-{region-id}.aliyuncs.com
Date: GMT Date
Authorization: SignatureValue利用シーン
次の例では、ビッグデータ分析シナリオ向けのアクセスポイントソリューションを設計し、きめ細かな権限コントロールを通じて複数の部門に安全で分離されたアクセスを可能にする方法を示します。
シナリオ
Alibaba Cloud アカウント UID 137918634953**** を持つ企業が、中央で収集されたデータを examplebucket という名前のバケットに保存しています。10 の事業部門が、次の要件でこのバケットにアクセスする必要があります:
部門 | アクセス範囲 | 権限 | ネットワークオリジン |
部門 1~3 |
| 読み取り専用 | インターネット |
部門 4 | バケット全体 | 読み取り/書き込み | インターネット |
部門 5~10 |
| 読み取り/書き込み | VPC のみ |
ソリューション設計
ビジネスの分離とセキュリティ要件に基づき、このソリューションでは異なるアクセスシナリオに対して 3 つのアクセスポイントを使用します。アクセスポイントポリシーを使用して、正確な権限コントロールとネットワークアクセス制限を実装します。
アクセスポイント | 名前 | ネットワークオリジン | 承認されたユーザー | 承認されたリソース | 権限 |
アクセスポイント 1 |
| インターネット | 部門 1~3 の RAM ユーザー (UID: |
| 読み取り専用 |
アクセスポイント 2 |
| インターネット | 部門 4 の RAM ユーザー (UID: |
| 読み取り/書き込み |
アクセスポイント 3 |
| VPC | 部門 5~10 の RAM ユーザー (UID: |
| 読み取り/書き込み |
AP ポリシー設定
ap-01:読み取り専用
{
"Version": "1",
"Statement": [{
"Effect": "Allow",
"Action": [
"oss:GetObject",
"oss:GetObjectAcl",
"oss:ListObjects",
"oss:RestoreObject",
"oss:ListObjectVersions",
"oss:GetObjectVersion",
"oss:GetObjectVersionAcl",
"oss:RestoreObjectVersion"
],
"Principal": [
"26571698800555****"
],
"Resource": [
"acs:oss:{region-id}:137918634953****:accesspoint/ap-01/object/dir1/*"
]
},{
"Effect": "Allow",
"Action": [
"oss:ListObjects",
"oss:GetObject"
],
"Principal": [
"26571698800555****"
],
"Resource": [
"acs:oss:{region-id}:137918634953****:accesspoint/ap-01"
],
"Condition": {
"StringLike": {
"oss:Prefix": [
"dir1/*"
]
}
}
}]
}ap-02:読み取り/書き込み
{
"Version": "1",
"Statement": [{
"Effect": "Allow",
"Action": [
"oss:GetObject",
"oss:PutObject",
"oss:GetObjectAcl",
"oss:PutObjectAcl",
"oss:ListObjects",
"oss:AbortMultipartUpload",
"oss:ListParts",
"oss:RestoreObject",
"oss:ListObjectVersions",
"oss:GetObjectVersion",
"oss:GetObjectVersionAcl",
"oss:RestoreObjectVersion"
],
"Principal": [
"25770968794578****"
],
"Resource": [
"acs:oss:{region-id}:137918634953****:accesspoint/ap-02/object/*"
]
},{
"Effect": "Allow",
"Action": [
"oss:ListObjects",
"oss:GetObject"
],
"Principal": [
"25770968794578****"
],
"Resource": [
"acs:oss:{region-id}:137918634953****:accesspoint/ap-02"
],
"Condition": {
"StringLike": {
"oss:Prefix": [
"*"
]
}
}
}]
}ap-03:VPC 読み取り/書き込み
{
"Version": "1",
"Statement": [{
"Effect": "Allow",
"Action": [
"oss:GetObject",
"oss:PutObject",
"oss:GetObjectAcl",
"oss:PutObjectAcl",
"oss:ListObjects",
"oss:AbortMultipartUpload",
"oss:ListParts",
"oss:RestoreObject",
"oss:ListObjectVersions",
"oss:GetObjectVersion",
"oss:GetObjectVersionAcl",
"oss:RestoreObjectVersion"
],
"Principal": [
"26806658794579****"
],
"Resource": [
"acs:oss:{region-id}:137918634953****:accesspoint/ap-03/object/dir2/*"
]
},{
"Effect": "Allow",
"Action": [
"oss:ListObjects",
"oss:GetObject"
],
"Principal": [
"26806658794579****"
],
"Resource": [
"acs:oss:{region-id}:137918634953****:accesspoint/ap-03"
],
"Condition": {
"StringLike": {
"oss:Prefix": [
"dir2/*"
]
}
}
}]
}バケットポリシーの委任
このシナリオでは、同じアカウント配下に複数のアクセスポイントがあるため、oss:DataAccessPointAccount を使用して一括で委任することを推奨します。このアプローチにより、バケットポリシーの設定が簡素化されます。より詳細な制御が必要な場合は、oss:DataAccessPointArn を使用して各アクセスポイントに個別に権限を委任することもできます。
一括委任
{
"Version": "1",
"Statement": [{
"Effect": "Allow",
"Action": [
"oss:*"
],
"Principal": [
"*"
],
"Resource": [
"acs:oss:*:137918634953****:examplebucket",
"acs:oss:*:137918634953****:examplebucket/*"
],
"Condition": {
"StringEquals": {
"oss:DataAccessPointAccount": [
"137918634953****"
]
}
}
}]
}個別委任
{
"Version": "1",
"Statement": [{
"Effect": "Allow",
"Action": [
"oss:*"
],
"Principal": [
"*"
],
"Resource": [
"acs:oss:*:137918634953****:examplebucket",
"acs:oss:*:137918634953****:examplebucket/*"
],
"Condition": {
"StringEquals": {
"oss:DataAccessPointArn": [
"acs:oss:oss-{region-id}:137918634953****:accesspoint/ap-01",
"acs:oss:oss-{region-id}:137918634953****:accesspoint/ap-02",
"acs:oss:oss-{region-id}:137918634953****:accesspoint/ap-03"
]
}
}
}]
}権限評価ロジック
RAM およびバケットポリシー | アクセスポイントポリシー | 最終結果 |
許可 | 許可 | 許可 |
許可 | 拒否 | 拒否 |
許可 | 無視 | 無視 |
拒否 | 許可 | 拒否 |
拒否 | 拒否 | 拒否 |
拒否 | 無視 | 拒否 |
無視 | 許可 | 無視 |
無視 | 拒否 | 拒否 |
無視 | 無視 | 無視 |
許可:アクセスリクエストが権限ポリシーの Allow ステートメントに一致し、どの Deny ステートメントにも一致しない場合。
拒否 (明示的な拒否):アクセスリクエストが権限ポリシーの Deny ステートメントに一致する場合。Deny ステートメントは常に Allow ステートメントよりも優先されるため、明示的な拒否となります。
無視 (暗黙的な拒否):アクセスリクエストがどの Allow または Deny ステートメントにも一致しない場合。デフォルトでは、RAM ユーザーはどの操作を実行する権限も持っていません。明示的に許可されていないアクションは、暗黙的に拒否されます。
制限事項
項目 | 説明 |
作成方法 | アクセスポイントは OSS コンソール、API、または ossutil を使用して作成できますが、SDK では作成できません。 |
数量 | Alibaba Cloud アカウントごとに最大 1,000 個のアクセスポイントを作成できます。 |
変更ルール | アクセスポイントが作成されると、そのアクセスポイントポリシーのみを変更できます。名前やエイリアスなどの基本情報は変更できません。 |
アクセス方法 | 匿名アクセスはサポートされていません。 |
よくある質問
IP アドレスホワイトリストのサポート
はい。JSON エディターを使用して、アクセスポイントポリシーに "IpAddress": {"acs:SourceIp": ["xxx"]} のような IP アドレスベースの条件を追加できます。
アクセスポイントを作成するための権限
次の権限が必要です:oss:CreateAccessPoint、oss:GetAccessPoint、oss:DeleteAccessPoint、oss:ListAccessPoints、oss:PutAccessPointPolicy、oss:GetAccessPointPolicy、oss:DeleteAccessPointPolicy、oss:PutBucketPolicy、oss:GetBucketPolicy、および oss:DeleteBucketPolicy。