このチュートリアルでは、ビジネスシナリオを用いて、OSS のバケット、フォルダ、ファイルに対する詳細なアクセス権限を設定する方法を説明します。OSS のフラットなストレージ構造とプレフィックスによる一覧表示の仕組みがポリシー設定にどのように影響するか、また、異なる Resource Access Management (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 として返します。
操作ごとの Resource 構成
操作対象 | トリガーされる API | Resource 構成 | ポリシー設定の要点 |
バケットのルートディレクトリを一覧表示する | ListObjects (プレフィックスは空、デリミタは |
| Resource 要素は、特定のパスではなくバケット自体を指します。 |
フォルダに入る | ListObjects (プレフィックスは |
| Resource 要素は、特定のパスではなくバケット自体を指します。一覧表示可能な範囲は |
ファイルの内容を読み書きする |
| Resource 要素はパスを指定でき、ワイルドカード文字 |
コンソールと API/SDK アクセスの違い
コンソール経由で OSS にアクセスする場合、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 ユーザー Anne |
| 読み取り/書き込み権限 |
RAM ユーザー Leo |
| 読み取り専用権限 |
指定されたユーザーグループのすべてのメンバー |
| アクセス拒否 |
ステップ 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 ユーザー Anne と Leo の作成
ユーザーリストページに移動し、[ユーザーの作成] をクリックします。ユーザー Anne と Leo を作成します。
ステップ 3:Anne への Development フォルダに対する読み取り/書き込み権限の付与
ポリシー設計のアプローチ
Development/ フォルダへの読み取り/書き込みアクセスを許可するには、2 種類の権限を付与する必要があります。
一覧表示権限:ユーザーが
Development/フォルダ内のオブジェクトを一覧表示できるようにします (oss:ListObjects)。Conditionは、一覧表示をDevelopmentプレフィックスで始まるオブジェクトに制限します。読み取り/書き込み権限:
Development/フォルダ内のファイルの読み取り (oss:GetObject) とアップロード (oss:PutObject) を許可します。Resource 要素はexamplebucket/Development/*を指します。
ポリシーの作成と付与
RAM ポリシーページに移動し、[ポリシーの作成] をクリックします。
[スクリプトエディター] タブを選択し、次のポリシー内容を入力します。
{ "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/*" } ] }ポリシーの分析:
最初の Statement:バケットに対する一覧表示権限を付与します。
oss:Prefixを持つConditionは、一覧表示をDevelopmentフォルダとそのサブフォルダ内のコンテンツに制限します。2 番目の Statement:読み取り/書き込み権限を付与します。Resource は
Development/*パス内のすべてのオブジェクトを指します。
[OK] をクリックします。[ポリシー名] (例:
AllowAnneAccessDevelopment) を入力し、[OK] をクリックしてポリシーを作成します。ユーザーリストページに移動します。RAM ユーザー Anne を見つけ、[権限の追加] をクリックし、作成したばかりのポリシーを選択します。
ステップ 4:Leo への 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 操作が削除されています。Leo はファイルの読み取りのみ可能で、アップロードや変更はできません。
ステップ 5:指定ユーザーグループへの Private フォルダに対するアクセス拒否
ユーザーグループを使用して権限を集中管理できます。Private/ フォルダへのアクセスを拒否すべき RAM ユーザーを同じユーザーグループに追加します。その後、そのグループに拒否ポリシーをアタッチします。
この方法は、ユーザーグループのメンバーである RAM ユーザーにのみ適用されます。新規ユーザーを含むアカウント内のすべての RAM ユーザーのアクセスを拒否するには、バケットポリシーを使用してバケットに拒否ポリシーを設定する必要があります。
ユーザーグループの作成とメンバーの追加
RAM ユーザーグループページに移動し、[ユーザーグループの作成] をクリックします。たとえば、
DenyPrivateAccessGroupという名前を付けます。[メンバーの追加] をクリックし、
Private/フォルダへのアクセスを拒否すべき RAM ユーザーをユーザーグループに追加します。
拒否ポリシーの作成と付与
RAM ポリシーページに移動し、[ポリシーの作成] をクリックします。
[スクリプトエディター] タブを選択し、次のポリシー内容を入力します。
{ "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/*" ] } } } ] }ポリシーの分析:
最初の Statement:
Private/パス配下のすべてのオブジェクトに対するすべての操作を拒否します。2 番目の Statement:ユーザーがファイルリストを閲覧できないように、
Private/フォルダのコンテンツの一覧表示を拒否します。
[OK] をクリックします。[ポリシー名] (例:
DenyAccessPrivateFolder) を入力し、[OK] をクリックしてポリシーを作成します。RAM ユーザーグループページに移動します。ユーザーグループに対して [権限の追加] をクリックし、作成したばかりのポリシーを選択します。
グループ内の RAM ユーザーが Private/ フォルダにアクセスしようとすると、ユーザーがファイルのリスト表示を試みているかダウンロードを試みているかに関わらず、OSS は権限拒否エラーを返します。