このチュートリアルでは、Resource Access Management (RAM) ポリシーを使用して、Object Storage Service (OSS) バケット、ディレクトリ、およびディレクトリ内のオブジェクトへのアクセスを制御する方法を示します。
背景情報
RAMポリシーは、ユーザーに基づいて構成された権限付与ポリシーです。 RAMポリシーを設定して、従業員、システム、アプリケーションなどのユーザーを管理できます。 ユーザーがアクセスできるリソースを指定できます。 たとえば、RAMポリシーを作成して、バケットの読み取り権限のみをユーザーに付与できます。
RAMポリシーはJSON形式です。 RAMポリシーには、次のフィールドが含まれます。
ステートメント: 承認ステートメント。 RAMポリシーには、複数の権限付与ステートメントを含めることができます。
効果: RAMポリシーの効果。 有効な値は、Allow および Deny です。
説明RAMポリシーにAllowステートメントとDenyステートメントが同時に含まれている場合、DenyステートメントがAllowステートメントよりも優先されます。
Action: リソースに対して許可されたアクション。
RAMポリシーエディターを使用してRAMポリシーを生成することを推奨します。 詳細については、「RAM Policy Editor」をご参照ください。
RAMポリシーと比較して、バケットポリシーはOSSコンソールで設定できます。 バケット所有者は、他のユーザーにOSSリソースへのアクセス権限を付与できます。 詳細については、「他のユーザーにOSSリソースへのアクセスを許可するバケットポリシーの設定」をご参照ください。
バケットとディレクトリ
OSSはフラットデータモデル構造を使用します。 すべてのオブジェクトはバケットに保存されます。 したがって、OSSには、階層ファイルシステムで使用されるディレクトリとサブディレクトリはありません。 ただし、OSSコンソールでディレクトリ階層をシミュレートして、オブジェクトをグループ化、分類、管理することができます。 次の図は、OSSコンソールのサンプルディレクトリを示しています。
OSSは、オブジェクトがキーと値のペアとして識別される分散オブジェクトストレージサービスです。 オブジェクト名に基づいてオブジェクトのコンテンツを取得できます。 たとえば、oss-dg.pdfという名前のオブジェクトと、examplebucketという名前のDevelopment、Marketing、Privateのディレクトリがバケットに格納されます。
Developmentディレクトリを作成すると、キーが
Development/
のオブジェクトがOSSコンソールに作成されます。 スラッシュ (/
) は、区切り文字としてキーに含まれます。ProjectA.docxという名前のオブジェクトをDevelopmentディレクトリにアップロードすると、オブジェクトはOSSコンソールにアップロードされ、オブジェクトのキーは
Development/ProjectA.docx
に設定されます。キーでは、
Development
はプレフィックス、スラッシュ (/
) は区切り文字です。 バケット内の共通のプレフィックスと区切り文字を共有するすべてのオブジェクトを一覧表示できます。 OSSコンソールで、[Development] ディレクトリをクリックすると、ディレクトリ内のオブジェクトが一覧表示されます。 次の図は、Developmentディレクトリ内のオブジェクトを示しています。説明examplebucketバケットのDevelopmentディレクトリ内のオブジェクトを一覧表示するには、OSSコンソールからOSSにリクエストが送信され、指定されたプレフィックス
Development
と区切り文字としてスラッシュ (/
) が含まれるオブジェクトを一覧表示します。 上記の例では、Development/Alibaba Cloud.pdf
、Development/ProjectA.docx
、およびDevelopment/ProjectB.docx
キーを持つ3つのオブジェクトがexamplebucketバケットに格納されています。
このチュートリアルを開始する前に、ルートレベルのバケットコンテンツの概念を理解する必要があります。 たとえば、examplebucketバケットには次のオブジェクトが含まれています。
Development/Alibaba Cloud.pdf
Development/ProjectA.docx
Development/ProjectB.docx
マーケティング /data2020.xlsx
マーケティング /data2021.xlsx
Private/2017/images.zip
Private/2017/promote.pptx
oss-dg.pdf
これらのオブジェクトのキーは、Development、Marketing、およびPrivateディレクトリをルートレベルのディレクトリとして、oss-dg.pdfをルートレベルのオブジェクトとして持つ論理階層を決定します。 OSSコンソールでバケット名をクリックすると、Development/ 、Marketing/ 、Private/ などの複数のオブジェクトで共有される共通のプレフィックスと区切り文字がルートレベルのディレクトリとして表示されます。 oss-dg.pdfオブジェクトにはプレフィックスがありません。 オブジェクトはルートレベルのオブジェクトとして表示されます。
リクエストとレスポンス
RAMユーザーに権限を付与する前に、OSSコンソールでバケット名をクリックしたときにOSSコンソールがOSSとどのようにやり取りするかを理解する必要があります。
バケットへのアクセス要求を送信する
OSSコンソールでexamplebucketバケットをクリックすると、OSSコンソールはGetBucket (ListObjects) リクエストをOSSに送信します。
リクエストの例
GET /?prefix=&delimiter=/ HTTP/1.1 Host: examplebucket.oss-cn-hangzhou.aliyuncs.com Date: Fri, 24 Feb 2012 08:43:27 GMT Authorization: OSS qn6q*******************:DNrn******************
上記のリクエストでは、prefixパラメーターの値は空のままで、delimiterパラメーターの値はスラッシュ (/) です。
レスポンスの例
HTTP/1.1 200 OK x-oss-request-id: 534B371674E88A4D8906**** Date: Fri, 7 Aug 2020 08:43:27 GMT Content-Type: application/xml Content-Length: 712 Connection: keep-alive Server: AliyunOSS <?xml version="1.0" encoding="UTF-8"?> <ListBucketResult xmlns="http://doc.oss-cn-hangzhou.aliyuncs.com"> <Name>examplebucket</Name> <Prefix></Prefix> <Marker></Marker> <MaxKeys>100</MaxKeys> <Delimiter>/</Delimiter> <IsTruncated>false</IsTruncated> <Contents> <Key>oss-dg.pdf</Key> ... </Contents> <CommonPrefixes> <Prefix>Development</Prefix> </CommonPrefixes> <CommonPrefixes> <Prefix>Marketing</Prefix> </CommonPrefixes> <CommonPrefixes> <Prefix>Private</Prefix> </CommonPrefixes> </ListBucketResult>
レスポンス解析
OSSコンソールは、OSSから返されたレスポンスを解析し、バケット内のルートレベルのオブジェクトとディレクトリを表示します。
バケット内のディレクトリにアクセスするリクエストを送信する
OSSコンソールでexamplebucketバケットのDevelopment/ ディレクトリをクリックすると、OSSコンソールはGetBucket (ListObjects) リクエストをOSSに送信します。 リクエストには、プレフィックスとデリミタパラメータが含まれます。
リクエストの例
GET /?prefix=Development/&delimiter=/ HTTP/1.1 Host: examplebucket.oss-cn-hangzhou.aliyuncs.com Date: Fri, 24 Feb 2012 08:43:27 GMT Authorization: OSS qn6q*******************:DNrn******************
上記のリクエストでは、prefixパラメーターの値は
Development/
で、delimiterパラメーターの値はスラッシュ (/) です。レスポンスの例
レスポンスで、OSSはキーに指定されたプレフィックスが含まれているオブジェクトを返します。
HTTP/1.1 200 OK x-oss-request-id: 534B371674E88A4D8906**** Date: Fri, 7 Aug 2020 08:43:27 GMT Content-Type: application/xml Content-Length: 712 Connection: keep-alive Server: AliyunOSS <?xml version="1.0" encoding="UTF-8"?> <ListBucketResult xmlns="http://doc.oss-cn-hangzhou.aliyuncs.com"> <Name>examplebucket</Name> <Prefix>Development/</Prefix> <Marker></Marker> <MaxKeys>100</MaxKeys> <Delimiter>/</Delimiter> <IsTruncated>false</IsTruncated> <Contents> <Key>ProjectA.docx</Key> ... </Contents> <Contents> <Key>ProjectB.docx</Key> ... </Contents> <Contents> <Key>Alibaba Cloud.pdf</Key> ... </Contents> </ListBucketResult>
レスポンス解析
OSSコンソールは、OSSから返されたレスポンスを解析し、Development /ディレクトリにオブジェクトを表示します。
シナリオ
たとえば、examplebucket
バケットの所有者であり、バケット内のすべてのオブジェクトとディレクトリのアクセス制御リスト (ACL) はデフォルトでプライベートです。 バケット内のDevelopment
ディレクトリ、およびディレクトリ内のサブディレクトリとオブジェクトに対する読み取りおよび書き込み権限をRAMユーザーAnneに付与する必要があります。 RAMユーザーLeoに、Marketing
ディレクトリおよびディレクトリ内のサブディレクトリおよびオブジェクトに対する読み取り専用権限を付与する必要があります。 また、現在のAlibaba CloudアカウントのすべてのRAMユーザーがPrivate
ディレクトリにアクセスできないようにします。
ステップ1: バケットを作成し、バケットにオブジェクトをアップロードする
examplebucketという名前のバケットを作成します。
バケットにDevelopment、Marketing、Privateディレクトリを作成します。 詳細については、「ディレクトリの作成」をご参照ください。
次の要件に基づいて、指定したディレクトリにオブジェクトをアップロードします。
oss-dg.pdfオブジェクトをexamplebucketバケットのルートディレクトリにアップロードします。
Alibaba Cloud.pdf、ProjectA.docx、およびProjectB.docxオブジェクトをDevelopmentディレクトリにアップロードします。
data2020.xlsxおよびdata2021.xlsxオブジェクトをMarketingディレクトリにアップロードします。
images.zipおよびpromote.pptxオブジェクトをPrivateディレクトリにアップロードします。
詳細については、「オブジェクトのアップロード」をご参照ください。
ステップ2: RAMユーザーを作成するAnneとLeo
RAMコンソールでRAMユーザーAnneとLeoを作成します。詳細情報:RAM ユーザーの作成
手順3: RAMユーザーAnneにDevelopmentディレクトリの読み取りおよび書き込み権限を付与する
AllowAnneToReadAndWriteFolderDevelopmentポリシーをRAMユーザーのAnneにアタッチします。
左側のナビゲーションウィンドウで、 を選択します。
ポリシー ページで、ポリシーの作成 をクリックします。
ポリシーの作成 ページで、[JSON] タブをクリックします。
次のポリシーコンテンツを入力し、[次へ] をクリックしてポリシー情報を編集します。
次のポリシーコンテンツを使用して、RAMユーザーAnneにDevelopmentディレクトリおよびディレクトリ内のすべてのオブジェクトの読み取りおよび書き込み権限を付与します。
{ "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/*" ] } ] }
ポリシーの 名前 および [指定] パラメーターを指定します。
OK をクリックします。
AllowAnneToReadAndWriteFolderDevelopmentポリシーをRAMユーザーのAnneにアタッチします。 詳細については、「RAM ユーザーへの権限の付与」をご参照ください。
手順4: RAMユーザーLeoにMarketingディレクトリの読み取り専用権限を付与する
AllowLeoToReadAndWriteFolderMarketingという名前のカスタムポリシーを作成するには、手順3を参照してください。 次のポリシーコンテンツを使用して、MarketingディレクトリおよびMarketingディレクトリ内のすべてのオブジェクトに対する読み取り専用権限をRAMユーザーに付与します。 ポリシーコンテンツには、次の設定が含まれます。
{
"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/*"
]
}
]
}
手順5: 現在のAlibaba CloudアカウントのすべてのRAMユーザーからプライベートディレクトリへのアクセスを拒否する
ユーザーグループを作成し、ユーザーグループにメンバーを追加します。
ユーザーグループの作成方法の詳細については、「RAMユーザーグループの作成」をご参照ください。 ユーザーグループを作成したら、現在のAlibaba CloudアカウントのすべてのRAMユーザーをユーザーグループに追加します。 詳細については、「RAMユーザーグループへのRAMユーザーの追加」をご参照ください。
DenyAllRamToAccessFolderPrivateという名前のカスタムポリシーを作成します。
左側のナビゲーションウィンドウで、 を選択します。
ポリシー ページで、ポリシーの作成 をクリックします。
次のポリシーコンテンツを入力し、[次へ] をクリックしてポリシー情報を編集します。
次のポリシーコンテンツを使用して、現在のAlibaba CloudアカウントのすべてのRAMユーザーからプライベートディレクトリへのアクセスを拒否します。
{ "Version":"1", "Statement":[ { "Effect":"Deny", "Action":[ "oss:*" ], "Resource":[ "acs:oss:*:*:examplebucket/Private/*" ], "Condition":{ } }, { "Effect":"Deny", "Action":[ "oss:ListObjects" ], "Resource":[ "acs:oss:*:*:*" ], "Condition":{ "StringLike":{ "oss:Prefix":[ "Private/", "Private/*" ] } } } ] }
ポリシーの 名前 および [指定] パラメーターを指定します。
OK をクリックします。
DenyAllRamToAccessFolderPrivateポリシーをユーザーグループにアタッチします。 詳細については、「RAMユーザーグループへの権限付与」をご参照ください。
ポリシーをユーザーグループにアタッチすると、ユーザーグループのRAMユーザーは
examplebucket
バケットのPrivate
ディレクトリにアクセスできなくなります。 RAMユーザーがPrivate/2017/images.zip
およびPrivate/2017/promote.pptx
オブジェクトをPrivate
ディレクトリに一覧表示するリクエストを送信すると、エラー応答が返されます。