このトピックでは、企業のユースケースを例に、OSS バケット、ディレクトリ、オブジェクトに対する詳細な権限付与の構成方法について説明します。OSS のフラットなストレージモデルおよびプレフィックスに基づく一覧表示がポリシー構成に与える影響や、異なる RAM ユーザーに対して特定のディレクトリレベルの権限を付与する方法を学びます。
ストレージ構造と権限付与
OSS ストレージモデル
OSS はフラットなストレージモデルを使用して、オブジェクトをキーと値のペアとして保存します。すべてのオブジェクトは直接バケットに属しており、物理的なディレクトリ階層は存在しません。コンソールに表示される「ディレクトリ」は、オブジェクトキーのプレフィックスとデリミタ (/) を使用してフォルダ階層をシミュレートすることで実現されています。この機能により、ファイルをグループ化・分類・管理できます。
バケット examplebucket について、コンソールに表示されるディレクトリ構造と対応するオブジェクトキーは次のとおりです。
examplebucket
├── Development/ # Key: Development/ (directory object)
│ ├── Alibaba Cloud.pdf # Key: Development/Alibaba Cloud.pdf
│ ├── ProjectA.docx # Key: Development/ProjectA.docx
│ └── ProjectB.docx # Key: Development/ProjectB.docx
├── Marketing/ # Key: Marketing/ (directory object)
│ ├── data2020.xlsx # Key: Marketing/data2020.xlsx
│ └── data2021.xlsx # Key: Marketing/data2021.xlsx
├── Private/ # Key: Private/ (directory object)
│ └── 2017/ # Key: Private/2017/ (directory object)
│ ├── images.zip # Key: Private/2017/images.zip
│ └── promote.pptx # Key: Private/2017/promote.pptx
└── oss-dg.pdf # Key: oss-dg.pdf
ディレクトリオブジェクトのキーは / で終わります。これにより、OSS はそのオブジェクトを「ディレクトリ」として認識します。実際のストレージシステムでは、ディレクトリオブジェクトを含むすべてのオブジェクトがフラットな構造で保存されています。
OSS には真のディレクトリ階層が存在しないため、「ディレクトリ」へのアクセス権限を付与する場合、実際には特定のプレフィックスを持つすべてのオブジェクトへのアクセス権限を付与することになります。たとえば、Development/ ディレクトリへのアクセスを許可することは、キーが Development/ で始まるすべてのオブジェクトへのアクセスを許可することと同等です。
バケット、ディレクトリ、オブジェクトのリクエストの違い
操作対象によって必要な API リクエストおよび Resource 構成が異なります。これらの違いを理解することが、ポリシーを正しく構成するための鍵となります。
ListObjects リクエストの仕組み
コンソールは、GetBucket (ListObjects) API オペレーションの次の 2 つのパラメーターを使用して、ディレクトリのような構造を表示します。
|
パラメーター |
説明 |
例 |
|
|
応答を、指定されたプレフィックスで始まるキーを持つオブジェクトのみに制限します。 |
|
|
|
オブジェクトをグループ化するための文字で、通常は |
|
ユーザーがコンソールで Development/ フォルダをクリックすると、コンソールは OSS に次のリクエストを送信します。
GET /?prefix=Development/&delimiter=/ HTTP/1.1
Host: examplebucket.oss-cn-hangzhou.aliyuncs.com
OSS は Development/ で始まるすべてのオブジェクトを返します。delimiter=/ が指定されているため、OSS はサブディレクトリ(例:Development/SubFolder/)を CommonPrefixes として返し、それらの中にあるすべてのファイルを一覧表示しません。
リソース構成
|
操作対象 |
呼び出される API |
|
ポリシー構成のポイント |
|
バケットのルートディレクトリの一覧表示 |
ListObjects(prefix は空、delimiter は |
|
|
|
ディレクトリを入力してください |
ListObjects(prefix は |
|
|
|
ファイル内容の読み取りおよび書き込み |
|
Resource はパスまで指定可能で、ワイルドカード |
コンソールと API/SDK アクセスの違い
OSS にコンソールからアクセスする場合、バケット一覧から目的のディレクトリへナビゲートする必要があります。このため、直接 API や SDK を呼び出す場合よりも多くの権限が必要です。
|
アクセス方法 |
必要な権限 |
|
API/SDK |
目的のリソースに対する権限(例: |
|
コンソール |
目的のリソースに対する権限に加え、 |
シナリオ
バケット examplebucket 内のすべてのファイルのデフォルト ACL(アクセスコントロールリスト)が非公開であると仮定します。バケット構造は次のとおりです。
examplebucket
├── Development/ # Development directory
│ ├── Alibaba Cloud.pdf
│ ├── ProjectA.docx
│ └── ProjectB.docx
├── Marketing/ # Marketing directory
│ ├── data2020.xlsx
│ └── data2021.xlsx
├── Private/ # Confidential directory
│ └── 2017/
│ ├── images.zip
│ └── promote.pptx
└── oss-dg.pdf
アクセスの制御の目的は次のとおりです。
|
RAM ユーザー/ユーザーグループ |
権限付与対象 |
権限タイプ |
|
RAM ユーザー Anne |
|
読み書き |
|
RAM ユーザー Leo |
|
読み取り専用 |
|
特定のユーザーグループのすべてのメンバー |
|
アクセス拒否 |
手順 1:バケットの作成とオブジェクトのアップロード
-
バケット一覧に移動し、バケットの作成 をクリックして、
examplebucketのようなバケットを作成します。 -
バケット内で、ディレクトリの作成 をクリックして、
Development、Marketing、およびPrivate(さらにPrivate配下にサブディレクトリ2017を作成)します。 -
アップロード をクリックして、次のパスにオブジェクトをアップロードします。
-
ルートディレクトリ:
oss-dg.pdf -
Development/ディレクトリ:Alibaba Cloud.pdf、ProjectA.docx、ProjectB.docx -
Marketing/ディレクトリ:data2020.xlsx、data2021.xlsx -
Private/2017/ディレクトリ:images.zip、promote.pptx
-
手順 2:RAM ユーザー Anne および Leo の作成
RAM コンソールのユーザーページに移動し、ユーザーの作成 をクリックして、ユーザー Anne および Leo を作成します。
手順 3:Development ディレクトリへの読み書きアクセスの付与
ポリシー設計
Development/ フォルダへの読み書きアクセスを有効にするには、次の 2 種類の権限を付与する必要があります。
-
一覧表示権限:
Development/フォルダ内のオブジェクトを一覧表示できる権限(oss:ListObjects)。ここでConditionを使用して、Developmentプレフィックスで始まるオブジェクトのみを一覧表示できるように制限します。 -
読み書き権限:
Development/ディレクトリ内のファイルを読み取ったりアップロードしたりできる権限(oss:GetObject、oss:PutObject)。Resource はexamplebucket/Development/*に設定します。
ポリシーの作成とアタッチ
-
RAM コンソールのポリシーページに移動し、ポリシーの作成 をクリックします。
-
JSON タブで、次のポリシードキュメントを入力します。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "oss:ListObjects", "Resource": "acs:oss:*:*:examplebucket", "Condition": { "StringLike": { "oss:Prefix": [ "Development", "Development/*" ] } } }, { "Effect": "Allow", "Action": [ "oss:GetObject", "oss:PutObject", "oss:GetObjectAcl" ], "Resource": "acs:oss:*:*:examplebucket/Development/*" } ] }ポリシー分析:
-
最初のステートメント:Resource をバケット自体に設定し、
Conditionブロックのoss:Prefix条件を使用して、Developmentディレクトリおよびそのサブディレクトリ内の一覧表示を許可します。 -
2 番目のステートメント:読み取りおよび書き込み権限を付与し、Resource を
Development/*パス内のすべてのオブジェクトに指定します。
-
-
OK をクリックし、ポリシー名(例:
AllowAnneAccessDevelopment)を入力して、OK をクリックして作成を完了します。 -
ユーザーページに移動し、RAM ユーザー Anne を見つけて、新しく作成したポリシーをアタッチして権限を追加します。
手順 4:Marketing ディレクトリへの読み取り専用アクセスの付与
手順 3 と同様のプロシージャに従って、RAM ユーザー Leo 用の読み取り専用ポリシーを作成およびアタッチします。このポリシーは読み書きポリシーと似ていますが、Action 要素には読み取り関連の操作のみが含まれます。ポリシードキュメントは次のとおりです。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "oss:ListObjects",
"Resource": "acs:oss:*:*:examplebucket",
"Condition": {
"StringLike": {
"oss:Prefix": [
"Marketing",
"Marketing/*"
]
}
}
},
{
"Effect": "Allow",
"Action": [
"oss:GetObject",
"oss:GetObjectAcl"
],
"Resource": "acs:oss:*:*:examplebucket/Marketing/*"
}
]
}
oss:PutObject を Action から削除することで、Leo はファイルを読み取ることしかできず、アップロードや変更はできません。
手順 5:Private ディレクトリへのアクセス拒否
Private/ フォルダへのアクセスを防止したい RAM ユーザーを同じユーザーグループにまとめて、そのユーザーグループに対して拒否ポリシーを構成することで、権限を一元的に管理します。
この方法は、ユーザーグループのメンバーである RAM ユーザーにのみ適用されます。今後作成されるものを含むアカウント内のすべての RAM ユーザーに対してこのルールを強制するには、バケットポリシー を使用してリソース側で拒否ポリシーを構成することを推奨します。
ユーザーグループの作成とメンバーの追加
-
RAM ユーザグループリストに移動し、[ユーザグループの作成] をクリックします(例:
DenyPrivateAccessGroup)。 -
グループメンバーの追加 をクリックし、
Private/フォルダへのアクセスを拒否する必要がある RAM ユーザーをユーザーグループに追加します。
拒否ポリシーの作成とアタッチ
-
RAM コンソールのポリシーページに移動し、ポリシーの作成 をクリックします。
-
JSON タブで、次のポリシードキュメントを入力します。
{ "Version": "1", "Statement": [ { "Effect": "Deny", "Action": "oss:*", "Resource": "acs:oss:*:*:examplebucket/Private/*" }, { "Effect": "Deny", "Action": "oss:ListObjects", "Resource": "acs:oss:*:*:examplebucket", "Condition": { "StringLike": { "oss:Prefix": [ "Private/", "Private/*" ] } } } ] }ポリシー分析:
-
最初のステートメント:
Private/パス配下のすべてのファイルに対するあらゆる操作を拒否します。 -
2 番目のステートメント:
Private/フォルダの内容を一覧表示することを拒否し、ユーザーがファイル一覧を表示できないようにします。
-
-
OK をクリックし、ポリシー名(例:
DenyAccessPrivateFolder)を入力して、OK をクリックして作成を完了します。 -
グループページに移動し、ユーザーグループを見つけて、先ほど作成したポリシーをアタッチして権限を追加します。
ユーザーグループに所属する RAM ユーザーがファイルの一覧表示やダウンロードによって Private/ フォルダにアクセスしようとすると、OSS は権限拒否のエラー応答を返します。