RAM ポリシーを使用して、OSS のバケット、ディレクトリ、オブジェクトに対してきめ細かなアクセス制御を設定します。フラットストレージモデルとプレフィックスベースのリスト表示がポリシー設計に与える影響、および異なる RAM ユーザーにディレクトリレベルの権限を付与する方法について説明します。
ストレージ構造と権限付与
OSS ストレージモデル
OSS はフラットなストレージ構造を採用しており、オブジェクトをキーと値のペアとして保存します。すべてのオブジェクトはバケットに直接属し、物理的なディレクトリ階層は存在しません。コンソールに表示される「ディレクトリ」は、オブジェクトキーのプレフィックスと区切り文字 (/) を使用して、フォルダ階層を擬似的に表現したものです。
バケット examplebucket では、コンソールに以下のディレクトリ構造とオブジェクトキーが表示されます。
examplebucket
├── Development/ # キー: Development/ (ディレクトリオブジェクト)
│ ├── Alibaba Cloud.pdf # キー: Development/Alibaba Cloud.pdf
│ ├── ProjectA.docx # キー: Development/ProjectA.docx
│ └── ProjectB.docx # キー: Development/ProjectB.docx
├── Marketing/ # キー: Marketing/ (ディレクトリオブジェクト)
│ ├── data2020.xlsx # キー: Marketing/data2020.xlsx
│ └── data2021.xlsx # キー: Marketing/data2021.xlsx
├── Private/ # キー: Private/ (ディレクトリオブジェクト)
│ └── 2017/ # キー: Private/2017/ (ディレクトリオブジェクト)
│ ├── images.zip # キー: Private/2017/images.zip
│ └── promote.pptx # キー: Private/2017/promote.pptx
└── oss-dg.pdf # キー: 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.comOSS は Development/ で始まるすべてのオブジェクトを返します。delimiter=/ が指定されているため、OSS は、その配下にあるすべてのファイルを一覧表示するのではなく、サブディレクトリ (Development/SubFolder/ など) を CommonPrefixes として返します。
リソース構成
操作対象 | トリガーされる API |
| ポリシー設定のポイント |
バケットのルートディレクトリをリスト表示 | ListObjects、prefix が空、delimiter が |
|
|
ディレクトリへのアクセス | prefix が |
|
|
ファイルコンテンツの読み取りと書き込み |
| リソースはパスまで指定でき、ワイルドカード |
コンソールと API/SDK アクセスの比較
コンソール経由のアクセスでは、バケットリストからターゲットディレクトリまで移動する必要があるため、直接的な API や SDK の呼び出しよりも多くの権限が必要になります。
アクセス方法 | 必要な権限 |
API/SDK |
|
コンソール | 対象リソースの権限に加えて、 |
シナリオ
バケット examplebucket 内のすべてのファイルのデフォルトの読み書き ACL がプライベートであると仮定します。バケットの構造は次のとおりです。
examplebucket
├── Development/ # 開発ディレクトリ
│ ├── Alibaba Cloud.pdf
│ ├── ProjectA.docx
│ └── ProjectB.docx
├── Marketing/ # マーケティングディレクトリ
│ ├── data2020.xlsx
│ └── data2021.xlsx
├── Private/ # 機密ディレクトリ
│ └── 2017/
│ ├── images.zip
│ └── promote.pptx
└── oss-dg.pdfアクセス制御の目標:
RAM ユーザー/ユーザーグループ | 権限付与の対象 | 権限の種類 |
RAM ユーザー「アン」 |
| 読み取り/書き込み |
RAM ユーザー「レオ」 |
| 読み取り専用 |
特定のユーザーグループのすべてのメンバー |
| アクセス拒否 |
ステップ1:バケットの作成とオブジェクトのアップロード
バケットリストに移動し、バケットの作成 から
examplebucketなどのバケットを作成します。バケットに、ディレクトリの作成 を使用して
Development、Marketing、Privateの各ディレクトリを作成します (Privateの下にサブディレクトリ2017も作成します)。アップロード をクリックして、以下のパスにオブジェクトをアップロードします:
ルートディレクトリ:
oss-dg.pdfDevelopment/ディレクトリ:Alibaba Cloud.pdf、ProjectA.docx、ProjectB.docxMarketing/ディレクトリ:data2020.xlsx、data2021.xlsxPrivate/2017/ディレクトリ:images.zip、promote.pptx
ステップ2:RAM ユーザー「アン」と「レオ」の作成
RAM コンソールの [ユーザー] ページに移動し、[ユーザーの作成] をクリックして、ユーザー Anne と Leo を作成します。
ステップ3:Development ディレクトリへの読み取り/書き込みアクセスの付与
ポリシーの設計
Development/ への読み書きアクセスには、2 種類の権限が必要です:
一覧表示権限: 一覧表示を
Developmentプレフィックスに制限するCondition付きで、Development/内のオブジェクトを一覧表示します (oss:ListObjects)。読み取り/書き込み権限:
Development/内のファイルの読み取りとアップロード (oss:GetObject、oss:PutObject)。リソースはexamplebucket/Development/*に設定されます。
ポリシーの作成とアタッチ
RAM コンソールの[ポリシー] ページに移動し、[ポリシーの作成] をクリックします。
[JSON] タブで、以下のポリシードキュメントを入力します。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "oss:ListObjects", "Resource": "acs:oss:*:*:examplebucket", "Condition": { "StringLike": { "oss:Prefix": [ "", "Development/*" ] } } }, { "Effect": "Allow", "Action": [ "oss:GetObject", "oss:PutObject", "oss:GetObjectAcl" ], "Resource": "acs:oss:*:*:examplebucket/Development/*" } ] }ポリシーの分析:
最初のステートメント:
Conditionのoss:Prefixを使用して一覧表示をDevelopmentディレクトリおよびサブディレクトリに制限することで、バケットに対するリスト権限を付与します。2 番目のステートメント:
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/*"
]
}
}
},
{
"Effect": "Allow",
"Action": [
"oss:GetObject",
"oss:GetObjectAcl"
],
"Resource": "acs:oss:*:*:examplebucket/Marketing/*"
}
]
}oss:PutObject がアクションから除外されているため、 Leo はファイルの読み取りはできますが、アップロードや変更はできません。
ステップ5:Private ディレクトリへのアクセスの拒否
Private/ フォルダーにアクセスすべきでない 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/配下のオブジェクトに対するすべての操作を拒否します。2番目のステートメント:
Private/コンテンツの一覧表示を拒否するため、ユーザーはファイル一覧を表示できなくなります。
OK をクリックし、[ポリシー名] (
DenyAccessPrivateFolderなど) を入力し、OK をクリックして作成を完了します。グループ ページに移動してユーザーグループを見つけ、先ほど作成したポリシーをアタッチして [権限を追加] します。
グループメンバーが Private/ フォルダー内のファイルを一覧表示またはダウンロードしようとすると、OSS は権限拒否エラーを返します。