アクセスポイントは、バケットにアクセスするための専用のエントリポイントを提供します。異なる権限を持つ複数のアプリケーションやチームがバケットにアクセスする必要がある場合、それぞれに個別のアクセスポイントを作成できます。その後、アクセスポイントポリシー (AP ポリシー) を使用して、各アクセスポイントの権限を管理できます。これにより、単一のバケットポリシーで複雑な権限ルールを維持する複雑さを回避できます。
仕組み
アクセスポイントは、バケットアクセスに対するプロキシレイヤーとして機能します。アクセスポイントを作成すると、Object Storage Service (OSS) は一意のアクセスポイントエイリアスを生成します。リクエストでは、バケット名の代わりにこのエイリアスを使用します。各アクセスポイントは、許可される操作、リソース、ID を定義する独自の AP ポリシーと、インターネットまたは指定された VPC のいずれかであるネットワークオリジンを持つことができます。これにより、さまざまなビジネスシナリオに基づいた分離されたアクセスが可能になります。
ユーザーがアクセスポイントを介してリソースにアクセスすると、システムは RAM ポリシー、バケットポリシー、および AP ポリシーを評価します。リクエストが許可されるのは、RAM ポリシーとバケットポリシーの組み合わせた結果が許可であり、かつ AP ポリシーの結果も許可である場合のみです。詳細な評価ロジックについては、「権限評価ロジック」をご参照ください。
デフォルトでは、アクセスポイントはバケットリソースにアクセスできません。まず、バケットポリシーで権限委任を設定する必要があります。oss:DataAccessPointArn、oss:DataAccessPointAccount、oss:AccessPointNetworkOrigin などの条件キーを使用して、特定のアクセスポイントに対してバケットへのアクセスを明示的に許可できます。
利用開始の手順
以下の 3 つのステップでは、アクセスポイントの作成、権限の委任、およびアクセスポイントを使用したリソースへのアクセス方法を説明します。
ステップ 1:アクセスポイントの作成
アクセスポイントを作成し、その AP ポリシーを設定します。ポリシーは、どの ID がどの OSS リソースに対してどのような条件下でどのような操作を実行できるかを定義します。
アクセスポイントのリストに移動し、[アクセスポイントの作成] をクリックします。
[アクセスポイント名] を入力し、関連するバケットとネットワークオリジンを選択して、[次へ] をクリックします。
説明[ネットワークオリジン] を [VPC] に設定した場合は、[VPC ID] を入力する必要があります。VPC コンソールから VPC ID を取得できます。
入力する VPC リージョンは、OSS ゲートウェイエンドポイントをサポートするリージョンのいずれかである必要があります。リージョンが一致しない場合、認証リクエストが指定された VPC に正しく関連付けられず、認証が失敗します。
[パブリックアクセスのブロック] オプションをオフにし、アクセスポイントポリシーを設定します。
ビジュアルエディターを使用したポリシーの追加
設定項目
説明
関連リソース
バケット全体 または 指定されたリソース のどちらに権限を付与するかを選択します。
リソースパス
関連リソース を バケット全体 に設定した場合、リソースパス は
accesspoint/{access-point-name}/*になります。関連リソース を 指定されたリソース に設定した場合、権限を付与するフォルダまたは個々のオブジェクトを入力します。複数のレコードを追加できます。
ユーザー
権限付与オブジェクトを指定します。
[RAM ユーザー]:現在の Alibaba Cloud アカウントに属する RAM ユーザーを選択します。
現在のログインアカウントは、Alibaba Cloud アカウント、またはバケットに対する管理権限と RAM コンソールでの
ListUsers権限を持つ RAM ユーザーである必要があります。そうでない場合、現在のアカウントの RAM ユーザーのリストを表示できません。[他のアカウント]:権限を付与する別のアカウントまたは RAM ユーザーの UID を入力するか、
arn:stsで始まる一時的な権限付与ユーザー (例: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 と Statement が含まれます。
Version:アクセスポリシーのバージョンです。値は
1に固定されており、変更できません。Statement:ポリシーの本体で、1 つ以上の特定の許可または拒否ルールが含まれます。各ステートメントには、Effect、Action、Principal、Resource、および Condition が含まれます。
ポリシー要素
説明
Effect
ポリシーの効果です。有効な値は
AllowとDenyです。Action
リソースに対して実行される特定の操作です。ワイルドカード文字
*を使用できます。Principal
ポリシーが適用されるエンティティ (ユーザー、アカウント、ロールなど) です。
Resource
ポリシーが適用されるリソースの範囲です。
Condition
ポリシーが有効になる条件です。
複数の条件を設定した場合、ポリシーが有効になるにはすべての条件を満たす必要があります (AND 関係)。
権限付与要素の完全なリストについては、「権限付与の構文と要素」をご参照ください。
[送信] をクリックし、アクセスポイントが作成されるのを待ちます。
ステップ 2:アクセスポイントへの権限委任
アクセスポイントを作成した後、バケットポリシーを使用して権限を委任する必要もあります。これにより、どのアクセスポイントがバケットにアクセスできるかが定義されます。3 種類の権限委任が利用可能です:
oss:DataAccessPointArn:特定のアクセスポイントにアクセス権限を委任します。oss:DataAccessPointAccount:現在の Alibaba Cloud アカウント配下のすべてのアクセスポイントにアクセス権限を委任します。oss:AccessPointNetworkOrigin:指定されたネットワークオリジンからのすべてのアクセスポイントにアクセス権限を委任します。
特定のアクセスポイントへの権限委任
バケットリストに移動し、対象のバケットをクリックします。
左側のナビゲーションウィンドウで、 を選択し、[JSON ポリシーの追加] を選択します。
[編集] をクリックし、エディターに権限付与ポリシーを 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 ポリシーの追加] を選択します。
[編集] をクリックし、エディターに権限付与ポリシーを 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 ポリシーの追加] を選択します。
[編集] をクリックし、エディターに権限付与ポリシーを 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 は自動的にアクセスポイントエイリアスを生成します。Resource Access Management (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 つのアクセスポイントを使用します。AP ポリシーを使用して、正確な権限制御とネットワークアクセス制限を実装します。
アクセスポイント | 名前 | ネットワークオリジン | 権限付与ユーザー | 権限付与リソース | 権限 |
アクセスポイント 1 |
| インターネット | 部門 1~3 の RAM ユーザー (UID: |
| 読み取り専用 |
アクセスポイント 2 |
| インターネット | 部門 4 の RAM ユーザー (UID: |
| 読み取り/書き込み |
アクセスポイント 3 |
| VPC | 部門 5~10 の RAM ユーザー (UID: |
| 読み取り/書き込み |
AP ポリシーの設定
ap-01 (部門 1~3 の読み取り専用アクセス)
{
"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 (部門 4 のバケット全体への読み取り/書き込みアクセス)
{
"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 (部門 5~10 の 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 ポリシーとバケットポリシーの組み合わせ結果 | AP ポリシーの結果 | 最終結果 |
許可 | 許可 | 許可 |
許可 | 拒否 | 拒否 |
許可 | 無視 | 無視 |
拒否 | 許可 | 拒否 |
拒否 | 拒否 | 拒否 |
拒否 | 無視 | 拒否 |
無視 | 許可 | 無視 |
無視 | 拒否 | 拒否 |
無視 | 無視 | 無視 |
許可:アクセスリクエストがアクセスポリシーの Allow ステートメントに一致し、どの Deny ステートメントにも一致しない場合。
拒否 (明示的な拒否):アクセスリクエストがアクセスポリシーの Deny ステートメントに一致する場合。Allow ステートメントにも一致する場合でも、拒否優先の原則により、結果は明示的な拒否となります。
無視 (暗黙的な拒否):アクセスリクエストがどの Allow または Deny ステートメントにも一致しない場合。デフォルトでは、RAM ID には権限がありません。明示的に許可されていない操作は、暗黙的に拒否されます。
クォータと制限
制限事項 | 説明 |
作成方法 | アクセスポイントは、OSS コンソール、API、または ossutil を使用して作成できます。SDK を使用してアクセスポイントを作成することはできません。 |
数量 |
|
変更ルール | アクセスポイントが作成された後、変更できるのはアクセスポイントポリシーのみです。アクセスポイント名やエイリアスなどの基本情報は変更できません。 |
アクセス方法 | 匿名アクセスはサポートされていません。 |
よくある質問
アクセスポイントの権限は IP アドレスホワイトリストをサポートしていますか?
はい。JSON を使用してアクセスポイントポリシーを追加し、"IpAddress": {"acs:SourceIp": ["xxx"]} のような条件を含めることで、アクセスを制限できます。
RAM ユーザーがアクセスポイントを作成するために必要な権限は何ですか?
次の権限が必要です:oss:CreateAccessPoint、oss:GetAccessPoint、oss:DeleteAccessPoint、oss:ListAccessPoints、oss:PutAccessPointPolicy、oss:GetAccessPointPolicy、oss:DeleteAccessPointPolicy、oss:PutBucketPolicy、oss:GetBucketPolicy、および oss:DeleteBucketPolicy。