アクセスポイントは、バケットへの独立したエントリポイントを提供します。アプリケーションまたはチームごとに個別のアクセスポイントを作成し、アクセスポイントポリシーを使用して権限を個別に管理することで、単一のバケットポリシーの複雑なルールを回避できます。
仕組み
アクセスポイントは、バケットのプロキシレイヤーとして機能します。アクセスポイントを作成すると、Object Storage Service (OSS) は一意の アクセスポイントエイリアス を生成します。このエイリアスは、リクエスト内のバケット名の代わりに使用されます。各アクセスポイントには、シナリオに応じた分離アクセスを実現するための独自の アクセスポイントポリシー (許可するアクション、リソース、アイデンティティを定義) と ネットワークオリジン (インターネットまたは指定した VPC) があります。
ユーザーがアクセスポイント経由でリクエストすると、システムは RAM ポリシー、バケットポリシー、およびアクセスポイントポリシーをまとめて評価します。リクエストは、RAM ポリシーとバケットポリシーを組み合わせた評価と、アクセスポイントポリシーの評価の両方が Allow になる場合にのみ成功します。詳細については、権限評価ロジックをご参照ください。
デフォルトでは、アクセスポイントにはバケットへのアクセス権限がありません。バケットポリシーで 権限委任 を設定し、oss:DataAccessPointArn、oss:DataAccessPointAccount、または oss:AccessPointNetworkOrigin の条件キーを使用して、アクセスポイントにバケットへのアクセス権限を明示的に付与する必要があります。
クイックスタート
アクセスポイントを作成してバケットポリシーで権限を委任し、アクセスポイントエイリアスを使用してリソースにアクセスします。
ステップ 1: アクセスポイントの作成
アクセスポイントを作成し、そのポリシーを設定して、誰が、どのアクションを、どの OSS リソースに対して、どのような条件で実行できるかを定義します。
-
アクセスポイントリストに移動し、[アクセスポイントの作成] をクリックします。
-
[アクセスポイント名] を入力し、関連付けるバケットと [ネットワークオリジン] を選択して、[次へ] をクリックします。
説明-
[ネットワークオリジン] を [VPC] に設定する場合、[VPC ID] を入力する必要があります。VPC ID は VPC コンソールから取得できます。
-
指定する VPC のリージョンは、OSS ゲートウェイエンドポイントをサポートするリージョンのいずれかである必要があります。リージョンが一致しない場合、認証リクエストが指定された VPC に正しく関連付けられず、認証に失敗します。
-
-
[パブリックアクセスのブロック] オプションをオフにし、アクセスポイントポリシーを設定します。
GUI
パラメータ
説明
関連リソース
アクセスを許可する対象として、バケット全体 または 指定されたリソース を選択します。
リソースパス
-
関連リソース を バケット全体 に設定した場合、リソースパス は
accesspoint/{アクセスポイント名}/*に設定されます。 -
関連リソース を 指定されたリソース に設定した場合、許可するディレクトリまたは個々のオブジェクトを入力します。複数のエントリを追加できます。
ユーザー
権限を付与する対象を指定します。
-
[RAM ユーザー]: 現在の Alibaba Cloud アカウントに属する RAM ユーザーを選択します。
ログインしているアカウントは、Alibaba Cloud アカウント、またはバケット管理権限と
ListUsers権限を持つ RAM ユーザーである必要があります。そうでない場合、RAM ユーザーは一覧表示されません。 -
[その他のアカウント]: 別のアカウントまたは RAM ユーザーの UID、または
arn:stsで始まる ARN を持つ、引き受けたロールのユーザー (例:arn:sts::1798************:assumed-role/role-name/session-name) を入力します。複数のユーザーに権限を付与する場合は、1 行に 1 つずつ入力します。
許可された操作
-
[簡易設定]: 一般的な許可操作の組み合わせを選択します。オプションには、読み取り専用 (ListObject を除く)、読み取り専用 (ListObject を除く)、[読み取り/書き込み]、フルコントロール、アクセス拒否 があります。
-
[詳細設定]: 効果 (許可する または 拒否) と [アクション] をカスタマイズします。
構文
エディターに 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": [ "*" ] } } }] }ポリシードキュメントには、[バージョン] と [ステートメント] が含まれます。
-
[バージョン]: ポリシーのバージョンです。この値は
1に固定されており、変更できません。 -
[ステートメント]: ポリシールールです。各ステートメントには、[エフェクト]、[アクション]、[プリンシパル]、[リソース]、[条件] が含まれます。
ポリシー要素
説明
エフェクト
ポリシーのエフェクトです。有効な値は
AllowとDenyです。アクション
リソースに対して実行する操作です。アスタリスク (
*) ワイルドカードがサポートされています。プリンシパル
ポリシーが適用されるユーザー、アカウント、またはロールです。
リソース
ポリシーが適用されるリソースです。
条件
ポリシーが有効になる条件です。
複数の条件が指定されている場合、それらは論理 AND で評価されます。ポリシーが有効になるには、すべての条件を満たす必要があります。
すべてのポリシー要素は、「認証の構文と要素」で定義されています。
-
-
[送信] をクリックし、アクセスポイントが作成されるまで待ちます。
ステップ 2: 権限の委任
アクセスポイントを作成した後、バケットポリシーで権限委任を設定し、バケットへのアクセス権を付与します。3 つの委任タイプが利用できます。
-
oss:DataAccessPointArn: 特定のアクセスポイントに対してアクセス権限を委任します。 -
oss:DataAccessPointAccount: 現在の Alibaba Cloud アカウント配下のすべてのアクセスポイントに対してアクセス権限を委任します。 -
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" ] } } }] } -
-
[保存] をクリックして、バケットポリシーを適用します。
"The bucket policy contains public access semantics" などのエラーが表示された場合は、権限を委任する前に、バケットの [パブリックアクセスのブロック] をオフにしてください。
ステップ 3: リソースへのアクセス
許可された ID (RAM ユーザーなど) は、アクセスポイントエイリアスを使用して OSS リソースにアクセスします。
SDK
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("Download complete: " + 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"Download complete: {key} -> {file_path}")
if __name__ == "__main__":
main()
ossutil
ossutil コマンドでアクセスポイントエイリアスをバケット名として使用します。
ossutil cp oss://example-ap-b156d01070a10322664d6704cd1d47****-ossalias/example.jpg /tmp
REST API
Host ヘッダーでアクセスポイントエイリアスを使用します。
GET /ObjectName HTTP/1.1
Host: example-ap-b156d01070a10322664d6704cd1d47****-ossalias.{region-id}.aliyuncs.com
Date: GMT Date
Authorization: SignatureValue
curl を使用して、アクセスポイントの接続性と権限設定をすばやく確認できます。
curl -v \
-H "Date: <GMT time>" \
-H "Authorization: OSS <AccessKeyId>:<Signature>" \
"https://<access-point-alias>.<region-id>.oss-accesspoint.aliyuncs.com/<ObjectName>" \
-o <local-file-path>
シナリオ例
この例では、アクセスポイントを使用して、ビッグデータ分析シナリオで複数の部門に、安全で分離されたアクセスを提供します。
シナリオ
ある企業 (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-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:{region-id}:137918634953****:accesspoint/ap-01",
"acs:oss:{region-id}:137918634953****:accesspoint/ap-02",
"acs:oss:{region-id}:137918634953****:accesspoint/ap-03"
]
}
}
}]
}
権限評価ロジック
|
RAMとバケットポリシーの結果 |
アクセスポイントポリシーの結果 |
最終結果 |
|
許可 |
許可 |
許可 |
|
許可 |
拒否 |
拒否 |
|
許可 |
暗黙の拒否 |
許可 |
|
拒否 |
許可 |
拒否 |
|
拒否 |
拒否 |
拒否 |
|
拒否 |
暗黙の拒否 |
拒否 |
|
暗黙の拒否 |
許可 |
許可 |
|
暗黙の拒否 |
拒否 |
拒否 |
|
暗黙の拒否 |
暗黙の拒否 |
暗黙の拒否 |
-
許可:リクエストが許可ステートメントに一致し、拒否ステートメントに一致しない場合を指します。
-
明示的な拒否:リクエストが拒否ステートメントに一致する場合を指します。拒否は許可に優先します。
-
暗黙の拒否:リクエストが許可ステートメントにも拒否ステートメントにも一致しない場合を指します。デフォルトでは、RAM アイデンティティには権限がありません。明示的に許可されていないアクションは、すべて暗黙的に拒否されます。
クォータと制限
|
制限 |
説明 |
|
作成方法 |
OSS コンソール、API、または ossutil を使用してアクセスポイントを作成します。SDK での作成はサポートされていません。 |
|
アクセスポイント数 |
1 つの Alibaba Cloud アカウントにつき、最大 1,000 個のアクセスポイントを作成できます。 |
|
変更ルール |
作成後、変更できるのはアクセスポイントポリシーのみです。名前とエイリアスは変更不可です。 |
|
アクセス方法 |
匿名アクセスはサポートされていません。 |
よくある質問
アクセスポイントポリシーは IP 許可リストをサポートしていますか?
はい。IP ベースのアクセス制御を行うには、アクセスポイントポリシーに acs:SourceIp 条件を追加します。例:
{
"Version": "1",
"Statement": [{
"Effect": "Allow",
"Action": ["oss:GetObject"],
"Principal": ["*"],
"Resource": ["acs:oss:{region-id}:179882766168****:accesspoint/{ap-name}/object/*"],
"Condition": {
"IpAddress": {
"acs:SourceIp": ["192.168.1.0/24", "203.0.113.5"]
}
}
}]
}
このポリシーでは、指定した IP または CIDR 範囲からのリクエストのみが、アクセスポイント経由でリソースにアクセスできます。この例では、単一の IP を指定する推奨方法として、"203.0.113.5" (単一の IP) を使用しています。CIDR 表記 (単一の IP を表す /32 など) を使用する場合は、適切な条件演算子を選択してください。
|
条件演算子 |
動作 |
ユースケース |
|
|
境界 IP (ネットワークアドレスとブロードキャストアドレス) を除外します。 |
単一の IP、または /1~/31 の範囲 |
|
|
境界 IP を含めます。 |
単一の IP に /32 を使用する場合 |
IpAddress は、CIDR 範囲を評価する際に境界 IP (ネットワークアドレスとブロードキャストアドレス) を除外します。/32 マスクでは、IP 自体が境界アドレスと見なされ除外されるため、ポリシーは効果がありません。代わりに IpAddressIncludeBorder を使用してください。
"Condition": {
"IpAddressIncludeBorder": {
"acs:SourceIp": ["203.0.113.5/32"]
}
}
作成に必要な権限
必要な権限は次のとおりです:oss:CreateAccessPoint、oss:GetAccessPoint、oss:DeleteAccessPoint、oss:ListAccessPoints、oss:PutAccessPointPolicy、oss:GetAccessPointPolicy、oss:DeleteAccessPointPolicy、oss:PutBucketPolicy、oss:GetBucketPolicy、および oss:DeleteBucketPolicy。