バケットポリシーは、バケットにアタッチされるリソースベースの権限付与ポリシーです。バケットポリシーを使用して、クロスアカウントアクセスを許可したり、匿名アクセスを有効にしたり、IP アドレスまたは VPC によるアクセス制限を設定できます。
仕組み
バケットポリシーはリソースベースモデルを採用しています。つまり、バケットにアタッチされ、どのプリンシパルがどのような条件下でどのリソースに対してどの操作を実行できるかを定義します。
リクエストが到着すると、OSS はバケットポリシーや RAM ポリシーなど、関連するすべてのポリシーを評価します。評価は拒否優先原則に従います。明示的な Deny(拒否)ルールがある場合、Allow(許可)ルールの有無に関係なく、そのリクエストはブロックされます。一致するルールが存在しない場合は、デフォルトでリクエストが拒否されます。
バケットオーナーに対しては、バケットポリシーに以下の特別なルールが適用されます。
-
プリンシパルがワイルドカード (*) に設定され、ポリシーが条件を含まない場合、そのポリシーはバケットのオーナー以外のユーザーにのみ適用されます。
-
プリンシパルがワイルドカード (*) に設定され、かつポリシーに条件が含まれている場合、そのポリシーはバケット所有者や匿名ユーザーを含むすべてのユーザーに適用されます。Deny ルールにより、バケット全体にアクセスできなくなる可能性があります。Allow ルールにより、データが匿名ユーザーに公開される可能性があります。
複数のステートメントが同じユーザーに適用される場合、有効な権限はすべてのステートメントの UNION(和集合)となりますが、拒否優先原則に従います。
-
acs:SourceIp条件キーはリクエストの送信元 IP アドレスのみを照合し、その IP アドレスがパブリックネットワークからのものか VPC 内のものかを区別しません。つまり、acs:SourceIpのみを使用してアクセスを制限すると、同じ IP アドレス範囲を使用する別の VPC からのリクエストも許可されてしまい、不正アクセスのリスクが生じます。そのため、バケットポリシーを設定する際、acs:SourceIpを指定する場合は、必ずacs:SourceVpcも併用して、リクエストのネットワークソースを明確に特定してください。 -
この制約は新規のバケットポリシーにのみ適用されます。既存のバケットポリシーには影響しません。ただし、既存のバケットポリシーを変更した場合は新規の提出とみなされ、この制約が適用されます。
バケットポリシーの設定
OSS では、次の 2 種類の設定方法を提供しています:グラフィカル方式と構文方式。
-
グラフィカル方式:一般的な権限付与シナリオ向けのフォームベースのインターフェイスです。
-
構文方式:すべてのポリシー機能および複雑な条件の組み合わせをサポートする JSON ベースのエディターです。構文方式でバケットポリシーを追加または変更すると、対応するポリシーエントリがグラフィカルビューにも同期表示されます。いずれの方式で設定されたポリシーも相互にリンクされ、常に同期が保たれます。ポリシー内の Resource フィールドは、権限付与の対象となるリソースの範囲を指定します。
グラフィカル方式
-
バケット一覧ページに移動し、対象のバケットをクリックします。
-
左側のナビゲーションウィンドウで、 をクリックします。
-
GUI で追加 を選択し、新規権限 をクリックします。
パラメーター
説明
関連リソース
バケット全体または指定されたリソースのどちらに権限を付与するかを選択します。
リソースパス
-
関連リソースをバケット全体に設定した場合、リソースパスは
bucket-name/*に設定されます。 -
関連リソースを指定されたリソースに設定した場合、権限を付与するディレクトリまたはオブジェクトを入力します。複数のエントリを追加できます。
ユーザー
権限を付与するプリンシパルを指定します。
-
すべてのアカウント (*):匿名ユーザーを含むすべてのユーザーに権限を付与します。
-
RAM ユーザー:現在の Alibaba Cloud アカウントに属する RAM ユーザーを選択します。
ログイン中のアカウントは、Alibaba Cloud アカウント (root アカウント) であるか、またはバケット管理権限および RAM の
ListUsers権限を持つ RAM ユーザーである必要があります。そうでない場合、RAM ユーザーの一覧は表示されません。 -
他のアカウント:権限を付与する他のアカウントまたは RAM ユーザーの UID を入力するか、
arn:stsで始まる資格情報を持つ一時ユーザー(例:arn:sts::1798************:assumed-role/role-name/session-name)を入力します。複数のユーザーを指定できます。1 行につき 1 つのユーザーを入力してください。RAM ロールに権限を付与した場合、そのロールは OSS コンソールからリソースにアクセスできません。ossutil、SDK、または API を使用してください。
許可された操作
-
簡易設定:一般的な権限付与操作の組み合わせを選択します。オプションには、読み取り専用 (ListObject を除く)、読み取り専用 (ListObject を除く)、読み書き、フルコントロール、および アクセス拒否 があります。
-
詳細設定:効果(許可する または 拒否)および 操作 をカスタマイズします。
条件(オプション)
ポリシーを有効にする条件を設定します。
-
アクセス方法:オプションには HTTPS および HTTP があります。オプションを選択すると、選択した方法を使用するアクセスリクエストに対してのみポリシーが有効になります。
-
IP =:IP アドレスのリストを入力します。このオプションを選択すると、指定された IP アドレスからのアクセスリクエストに対してのみポリシーが有効になります。
-
IP ≠:IP アドレスのリストを入力します。このオプションを選択すると、指定された IP アドレス以外からのアクセスリクエストに対してのみポリシーが有効になります。
-
VPC =:現在のアカウントに属する VPC を選択するか、他のアカウントに属する VPC を入力します。このオプションを選択すると、指定された VPC からのアクセスリクエストに対してのみポリシーが有効になります。
-
VPC ≠:現在のアカウントに属する VPC を選択するか、他のアカウントに属する VPC を入力します。このオプションを選択すると、指定された VPC 以外からのアクセスリクエストに対してのみポリシーが有効になります。
複数の条件を設定する場合、すべての条件を満たす必要があります(AND 条件)。
-
-
設定内容を確認後、OK をクリックしてバケットポリシーを適用します。
構文方式
-
バケット一覧ページに移動し、対象のバケットをクリックします。
-
左側のナビゲーションウィンドウで、 をクリックします。
-
構文で追加 を選択し、編集 をクリックします。エディターで、JSON 形式の権限付与ポリシーを入力します。
ポリシー例:VPC
vpc-t4nlw426y44rd3iq4xxxx以外からアクセスリクエストが送信された場合、ユーザー20214760404935xxxxがexample-bucketに対してすべての操作を実行することを拒否します。{ "Version": "1", "Statement": [ { "Sid": "DenyNonVpcAccess", "Effect": "Deny", "Action": "oss:*", "Principal": [ "20214760404935xxxx" ], "Resource": [ "acs:oss:*:174649585760xxxx:example-bucket", "acs:oss:*:174649585760xxxx:example-bucket/*" ], "Condition": { "StringNotEquals": { "acs:SourceVpc": "vpc-t4nlw426y44rd3iq4xxxx" } } } ] }完全な権限付与ポリシーには、Version および Statement が含まれます。
-
Version:アクセスポリシーのバージョンです。値は固定で
1であり、変更できません。 -
Statement:ポリシーの本文です。1 つ以上の具体的なルールを含みます。各ルールにはオプションの Sid が含まれ、Effect、Action、Principal、Resource、および Condition が含まれます。
ポリシー要素
説明
例での意味
Sid(オプション)
ステートメント ID です。ポリシー内の各ステートメントを識別するための人間が読める一意の識別子です。差別化、管理、監査に役立ちますが、権限自体には影響しません。
拒否ステートメントを
DenyNonVpcAccessとして識別します。Effect
ポリシーの効果です。有効な値は
AllowおよびDenyです。リクエストを拒否します。
Action
リソースに対して実行する具体的な操作です。ワイルドカード (
*) がサポートされています。すべての OSS 操作 (
oss:*) を拒否します。Principal
ポリシーが適用されるユーザー、アカウント、またはロールです。
Principal フィールドを空のリスト (
<code class="inline-code___1opEe" data-tag="code" id="396b0553f4p34">Principal:[]) に設定することは、すべてのアカウント (<code class="inline-code___1opEe" data-tag="code" id="86478af1e5pzx">Principal:["*"]) に設定することと同じです。ポリシーは RAM ユーザー
20214760404935xxxxのみに適用されます。Resource
ポリシーが適用されるリソースです。
ポリシーは
example-bucketバケット自体およびその内部のすべてのオブジェクトに適用されます。Condition
ポリシーを有効にする条件です。
複数の条件を設定する場合、すべての条件を満たす必要があります(AND 条件)。
この Deny ポリシーは、リクエストの送信元 VPC が
vpc-t4nlw426y44rd3iq4xxxxでない場合にのみ有効になります。ポリシー要素の完全なリファレンスについては、「権限付与の構文と要素」をご参照ください。
-
-
権限付与ポリシーの内容を確認後、保存 をクリックし、画面の指示に従ってください。
構文方式では、個別の操作(例:oss:DeleteObject)を 1 つ以上指定できるため、権限の範囲をグラフィカル方式の簡易設定にある フルコントロール(oss:* に相当)よりも狭くすることができます。詳細設定でも個別の操作を指定できるため、構文方式と同等の粒度を実現できます。各操作に対応する権限については、OSS API リファレンスをご参照ください。
ベクターバケットポリシーの設定
ベクターバケットでは、バケットポリシーの設定に構文方式のみがサポートされています。
-
ベクターバケット一覧ページに移動し、対象のベクターバケットをクリックします。
-
左側のナビゲーションウィンドウで、 をクリックします。
-
編集 をクリックします。エディターで、JSON 形式の権限付与ポリシーを入力します。
ポリシー例:
vector-bucket-example内のインデックステーブルindextestに対して、ユーザー20816353761158****にベクトルデータの読み書き権限を付与します。{ "Version": "1", "Statement": [{ "Effect": "Allow", "Action": [ "oss:PutVectors", "oss:GetVectors" ], "Principal": [ "20816353761158****" ], "Resource": [ "acs:ossvector:*:*:vector-bucket-example/indextest" ] }] }完全な権限付与ポリシーには、Version および Statement が含まれます。
-
Version:アクセスポリシーのバージョンです。値は固定で
1であり、変更できません。 -
Statement:ポリシーの本文です。1 つ以上の具体的なルールを含みます。各ルールには Effect、Action、Principal、Resource、および Condition が含まれます。
ポリシー要素
説明
例での意味
Effect
ポリシーの効果です。有効な値は
AllowおよびDenyです。リクエストを許可します。
Action
リソースに対して実行する具体的な操作です。ワイルドカード (
*) がサポートされています。ベクトルデータの読み書きを行います。
Principal
ポリシーが適用されるユーザー、アカウント、またはロールです。
Principal フィールドを空のリスト (
<code class="inline-code___1opEe" data-init-id="396b0553f4p34" data-tag="code" id="38fd39c90a131">Principal:[]) に設定することは、すべてのアカウント向けに設定すること (<code class="inline-code___1opEe" data-init-id="86478af1e5pzx" data-tag="code" id="da174b022cl89">Principal:["*"]) と同じです。ポリシーは RAM ユーザー
20816353761158****のみに適用されます。Resource
ポリシーが適用されるリソースです。
ポリシーは
vector-bucket-exampleバケット内のindextestインデックステーブルに適用されます。Condition
ポリシーを有効にする条件です。
複数の条件を設定する場合、すべての条件を満たす必要があります(AND 条件)。
なし。
ポリシー要素の完全なリファレンスについては、「権限付与の構文と要素」をご参照ください。
-
-
権限付与ポリシーの内容を確認後、保存 をクリックし、画面の指示に従ってください。
OSS-HDFS ポリシーの設定
OSS-HDFS サービスユーザーが .dlsdata/ ディレクトリおよびそのオブジェクトにアクセスできるようにするため、OSS-HDFS が有効化されたバケットのバケットポリシーを設定する際は、権限付与操作を アクセス拒否 に設定しないでください。「OSS-HDFS の使用要件」をご参照ください。
特定のネットワーク IP アドレスまたは VPC へのアクセスを制限するには、すべての Deny ステートメントに次の条件を追加してください。これにより、OSS-HDFS バックエンドサービスがクラシックネットワーク経由でバケットへの読み書きを行えるようになります。
"StringNotLike": {
"oss:ClassicIntranet": [
"true"
]
}
適用シナリオ:権限の付与
以下のシナリオでは、特定のユーザー、ロール、またはすべてのユーザーへのアクセス権限の付与方法を示します。それぞれに適応可能なポリシー例を記載しています。
シナリオ 1:読み書き権限の付与
チームメンバーまたはパートナーにバケットへの読み書きアクセス権限を付与します。この例では、RAM ユーザー 27737962156157xxxx および 20214760404935xxxx に対して example-bucket の読み書き権限を付与します。
このポリシーでは、バケット一覧の権限は付与されません。RAM ユーザーはバケットページを直接参照できません。代わりに、左側のナビゲーションウィンドウで を使用して対象のバケットを追加できます。
{
"Version":"1",
"Statement":[
{
"Effect":"Allow",
"Action":[
"oss:GetObject",
"oss:PutObject",
"oss:GetObjectAcl",
"oss:PutObjectAcl",
"oss:AbortMultipartUpload",
"oss:ListParts",
"oss:RestoreObject",
"oss:GetVodPlaylist",
"oss:PostVodPlaylist",
"oss:PublishRtmpStream",
"oss:ListObjectVersions",
"oss:GetObjectVersion",
"oss:GetObjectVersionAcl",
"oss:RestoreObjectVersion"
],
"Principal":[
"27737962156157xxxx",
"20214760404935xxxx"
],
"Resource":[
"acs:oss:*:174649585760xxxx:example-bucket/*"
]
},
{
"Effect":"Allow",
"Action":[
"oss:ListObjects"
],
"Principal":[
"27737962156157xxxx",
"20214760404935xxxx"
],
"Resource":[
"acs:oss:*:174649585760xxxx:example-bucket"
],
"Condition":{
"StringLike":{
"oss:Prefix":[
"*"
]
}
}
}
]
}
シナリオ 2:特定のディレクトリへの読み取り専用権限の付与
特定のディレクトリへの読み取り専用アクセスを許可します。この例では、RAM ユーザー 20214760404935xxxx に対して、example-bucket 内のプレフィックスが hangzhou/2020 および shanghai/2015 のディレクトリに読み取り専用権限を付与します。
このポリシーでは、バケット一覧の権限は付与されません。RAM ユーザーはバケットページを直接参照できません。代わりに、左側のナビゲーションウィンドウで を使用して対象のバケットを追加できます。
{
"Version":"1",
"Statement":[
{
"Action":[
"oss:GetObject",
"oss:GetObjectAcl",
"oss:GetObjectVersion",
"oss:GetObjectVersionAcl"
],
"Effect":"Allow",
"Principal":[
"20214760404935xxxx"
],
"Resource":[
"acs:oss:*:174649585760xxxx:example-bucket/hangzhou/2020/*",
"acs:oss:*:174649585760xxxx:example-bucket/shanghai/2015/*"
]
},
{
"Action":[
"oss:ListObjects",
"oss:ListObjectVersions"
],
"Condition":{
"StringLike":{
"oss:Prefix":[
"hangzhou/2020/*",
"shanghai/2015/*"
]
}
},
"Effect":"Allow",
"Principal":[
"20214760404935xxxx"
],
"Resource":[
"acs:oss:*:174649585760xxxx:example-bucket"
]
}
]
}
シナリオ 3:表示および一覧表示権限の付与
ユーザーがバケット情報を表示し、オブジェクトを一覧表示できるようにします。この例では、RAM ユーザーに example-bucket の表示および一覧表示権限を付与します。
このポリシーでは、バケット一覧の権限は付与されません。RAM ユーザーはバケットページを直接参照できません。代わりに、左側のナビゲーションウィンドウで を使用して対象のバケットを追加できます。
{
"Version":"1",
"Statement":[
{
"Action":[
"oss:Get*",
"oss:ListObjects",
"oss:ListObjectVersions"
],
"Effect":"Allow",
"Principal":[
"20214760404935xxxx"
],
"Resource":[
"acs:oss:*:174649585760xxxx:example-bucket"
]
}
]
}
シナリオ 4:RAM ロールへの読み取り権限の付与
RAM ロールを通じてバケットオブジェクトへの一時的なアクセスを許可します。RAM ユーザーまたはアプリケーションがロールを偽装して一時的な認証情報を取得します。この例では、1 つの RAM ロールのすべてのセッションおよび別の RAM ロールの特定のセッションに対して、example-bucket 内のすべてのオブジェクトの読み取り権限を付与します。
RAM ロールに権限を付与する場合、Principal は次の形式に従う必要があります:arn:sts::<uid>:assumed-role/<role-name>/<session-name>。<role-name> および <session-name> の値はすべて小文字である必要があります。
{
"Version": "1",
"Statement": [
{
"Action": [
"oss:GetObject"
],
"Effect": "Allow",
"Principal": [
"arn:sts::10323xxxxx72056:assumed-role/role-name/session-name",
"arn:sts::10323xxxxx72056:assumed-role/role2-name/*"
],
"Resource": [
"acs:oss:*:10323xxxxx72056:example-bucket/*"
]
}
]
}
シナリオ 5:すべてのユーザーへの一覧表示権限の付与
すべてのユーザーがオブジェクトを一覧表示できるようにしますが、コンテンツへのアクセスは許可しません。この例では、すべてのユーザー (*) に対して example-bucket の一覧表示権限を付与します。
{
"Version":"1",
"Statement":[
{
"Action":[
"oss:ListObjects",
"oss:ListObjectVersions"
],
"Effect":"Allow",
"Principal":[
"*"
],
"Resource":[
"acs:oss:*:174649585760xxxx:example-bucket"
]
}
]
}
シナリオ 6:AccessKey ペアなしで ECS インスタンスから内部ネットワーク経由で OSS にアクセス
同一リージョン内の ECS インスタンスから内部エンドポイント経由で OSS にアクセスする場合、送信先バケットの読み書き権限によって、追加の権限付与が必要かどうかが異なります。
-
public-read バケット:ECS インスタンスは、追加のバケットポリシー設定なしで、内部 URL 経由で直接バケットにアクセスできます。
-
private バケット:ECS インスタンスが配置されている VPC からのアクセスリクエストを許可するように、
acs:SourceVpc条件キーを使用したバケットポリシーを設定する必要があります。
内部 URL の形式は次のとおりです。bucketname は送信先バケットの名前に、<region> はバケットが配置されているリージョン(例:cn-hangzhou)に置き換えてください。
https://bucketname.oss-<region>-internal.aliyuncs.com/objectname
次のコマンドを実行して、内部ネットワークアクセスが期待どおりに機能することを確認します。
curl -I https://bucketname.oss-<region>-internal.aliyuncs.com/objectname
応答が 403 AccessDenied を返す場合、現在の ECS インスタンスの VPC がバケットポリシーで権限付与されていません。次の手順でトラブルシューティングを行ってください。
-
バケットページに移動し、送信先バケットをクリックします。
-
左側のナビゲーションウィンドウで、アクセスの制御 > バケットポリシー をクリックし、新規権限 をクリックします。
-
権限付与条件を設定します。VPC = を選択し、ECS インスタンスが配置されている VPC を指定します。
-
権限付与内容を確認後、OK をクリックしてバケットポリシーを適用します。
-
ECS インスタンスがパブリックエンドポイントではなく、内部エンドポイント経由でリクエストを送信していることを確認します。
-
curl コマンドを再度実行して検証します。応答が依然として 403 を返す場合は、バケットポリシーの VPC 条件で設定された VPC ID が ECS インスタンスの VPC ID と一致しているか確認してください。
適用シナリオ:ネットワークアクセスの制限
以下のシナリオでは、acs:SourceIp および acs:SourceVpc 条件キーを使用して、ネットワークソース(パブリック IP または VPC)に基づいてバケットへのアクセスを制限します。下表は、一般的なアプローチをまとめたものです。
|
アクセスソース |
ポリシー アプローチ |
シナリオ |
|
任意の VPC |
|
|
|
特定の VPC |
指定された VPC ID と等しくない acs:SourceVpc を持つリクエストを拒否します。 |
|
|
特定のパブリック IP |
ステートメント 1 は、指定されていない IP アドレスからのパブリックネットワークリクエストを拒否します。ステートメント 2 は、すべての VPC リクエストを拒否します。 |
|
|
特定の VPC 内の特定の IP 範囲 |
ステートメント 1 は、指定されていない VPC からのリクエストを拒否します。ステートメント 2 は、指定された VPC 内の指定されていない IP 範囲からのリクエストを拒否します。 |
|
|
特定のパブリック IP または特定の VPC |
ステートメント 1 は、指定されていない IP アドレスからのパブリックネットワークリクエストを拒否します。ステートメント 2 は、指定されていない VPC からの VPC リクエストを拒否します。 |
|
|
特定の IP を除くすべて(ブラックリスト) |
指定された IP からのリクエストを拒否し、制約を満たすために SourceVpc にワイルドカード ( |
|
|
特定の IP(ダウンロードのみ拒否) |
指定された IP からの |
|
|
クラシックネットワーク |
クラシックネットワークアクセスを許可します。 |
シナリオ 1:パブリックネットワークアクセスの制限
acs:SourceVpc 条件キーを使用して拒否ステートメントを追加することで、バケットへのすべてのパブリックネットワークアクセスをブロックします。このステートメントは、VPC 以外から送信されたリクエストを拒否します。次の例では、example-bucket へのすべての非 VPC アクセスを拒否します。
{
"Version": "1",
"Statement": [
{
"Effect": "Deny",
"Action": "oss:*",
"Principal": [
"*"
],
"Resource": [
"acs:oss:*:174649585760xxxx:example-bucket/*",
"acs:oss:*:174649585760xxxx:example-bucket"
],
"Condition": {
"StringNotLike": {
"acs:SourceVpc": [
"vpc-*"
]
}
}
}
]
}
シナリオ 2:特定の VPC へのアクセス制限
acs:SourceVpc 条件キーを使用して、バケットへのアクセスを特定の VPC に制限します。このステートメントは、他の VPC またはパブリックネットワークからのリクエストをブロックします。次の例では、VPC t4nlw426y44rd3iq4xxxx の外部のすべてのユーザーが example-bucket のオブジェクトを読み取ることを拒否します。
-
次の拒否ステートメントのプリンシパルがワイルドカード (
*) に設定されており、条件が含まれているため、この拒否ステートメントはバケットオーナーを含むすべてのユーザーに適用されます。 -
次の拒否ステートメントはアクセスを制限するだけであり、権限を付与するものではありません。プリンシパルに権限が付与されていない場合は、必要な権限を付与する Allow ステートメントを追加できます。
{
"Version":"1",
"Statement":[
{
"Effect":"Deny",
"Action":[
"oss:GetObject"
],
"Principal":[
"*"
],
"Resource":[
"acs:oss:*:174649585760xxxx:example-bucket/*"
],
"Condition":{
"StringNotEquals":{
"acs:SourceVpc":[
"vpc-t4nlw426y44rd3iq4xxxx"
]
}
}
}
]
}
シナリオ 3:特定のパブリック IP アドレスへのアクセス制限
バケットへのアクセスを特定のパブリック IP アドレスに制限するには、次の 2 つの拒否ステートメントを作成します。
-
ステートメント 1(指定されていない IP アドレスからのパブリックネットワークリクエストを拒否):このステートメントは、
StringNotLike: {"acs:SourceVpc": "vpc-*"}を使用してパブリックネットワークリクエストを識別します(パブリックネットワークリクエストのacs:SourceVpc値はvpc-で始まりません)。次に、NotIpAddress: {"acs:SourceIp": "..."}を使用して、指定された IP アドレス以外からのリクエストを拒否します。両方の条件が満たされた場合に拒否アクションがトリガーされます。 -
ステートメント 2(すべての VPC リクエストを拒否):このステートメントは、
StringLike: {"acs:SourceVpc": "vpc-*"}を使用して、任意の VPC からのすべてのリクエストを一致させて拒否します。目的は指定されたパブリック IP アドレスからのアクセスのみを許可するためです。
いずれかのステートメントに一致するリクエストは拒否されます。次の例では、パブリック IP 203.0.113.5 以外のすべてのユーザーが example-bucket への読み取りアクセスを拒否されます。
他の Alibaba Cloud アカウントの VPC からのアクセスを制限するには、ステートメント 2 の Condition の vpc-* を、対象アカウントの VPC ID(形式:vpc-xxx。対象アカウントの VPC コンソールから取得可能)に置き換えることができます。acs:SourceVpc 条件キーは、現在のアカウントおよび他の Alibaba Cloud アカウントの両方の VPC ID をサポートします。
-
次の拒否ステートメントのプリンシパルがワイルドカード (
*) に設定されており、条件が含まれているため、この拒否ステートメントはバケットオーナーを含むすべてのユーザーに適用されます。 -
次の拒否ステートメントはアクセスを制限するだけであり、権限を付与するものではありません。プリンシパルに権限が付与されていない場合は、必要な権限を付与する Allow ステートメントを追加できます。
{
"Version": "1",
"Statement": [{
"Effect": "Deny",
"Action": [
"oss:GetObject"
],
"Principal": [
"*"
],
"Resource": [
"acs:oss:*:174649585760xxxx:example-bucket/*"
],
"Condition": {
"NotIpAddress": {
"acs:SourceIp": [
"203.0.113.5"
]
},
"StringNotLike": {
"acs:SourceVpc": [
"vpc-*"
]
}
}
},
{
"Effect": "Deny",
"Action": [
"oss:GetObject"
],
"Principal": [
"*"
],
"Resource": [
"acs:oss:*:174649585760xxxx:example-bucket/*"
],
"Condition": {
"StringLike": {
"acs:SourceVpc": [
"vpc-*"
]
}
}
}
]
}
シナリオ 4:VPC 内の IP 範囲へのアクセス制限
バケットへのアクセスを特定の VPC 内の特定の IP 範囲に制限するには、次の 2 つの拒否ステートメントを作成します。
-
ステートメント 1(指定された VPC の外部からのすべてのリクエストを拒否):このステートメントは、
StringNotEquals: {"acs:SourceVpc": "..."}を使用して、他の VPC およびパブリックネットワークからのリクエストを拒否します。 -
ステートメント 2(VPC 内の指定された IP 範囲の外部からのリクエストを拒否):このステートメントは、
StringEquals: {"acs:SourceVpc": "..."}を使用して、指定された VPC からのリクエストを一致させ、次にNotIpAddress: {"acs:SourceIp": "..."}を使用して、指定された IP アドレス範囲の外部からのリクエストを拒否します。両方の条件が満たされた場合に拒否アクションがトリガーされます。
いずれかのステートメントに一致するリクエストは拒否されます。次の例では、VPC t4nlw426y44rd3iq4xxxx 内の 192.168.0.0/16 範囲以外のすべてのユーザーが example-bucket への読み取りアクセスを拒否されます。
-
次の拒否ステートメントのプリンシパルがワイルドカード (
*) に設定されており、条件が含まれているため、この拒否ステートメントはバケットオーナーを含むすべてのユーザーに適用されます。 -
次の拒否ステートメントはアクセスを制限するだけであり、権限を付与するものではありません。プリンシパルに権限が付与されていない場合は、必要な権限を付与する Allow ステートメントを追加できます。
{
"Version":"1",
"Statement":[
{
"Effect":"Deny",
"Action":[
"oss:GetObject"
],
"Principal":[
"*"
],
"Resource":[
"acs:oss:*:174649585760xxxx:example-bucket/*"
],
"Condition":{
"StringNotEquals":{
"acs:SourceVpc":[
"vpc-t4nlw426y44rd3iq4xxxx"
]
}
}
},
{
"Effect":"Deny",
"Action":[
"oss:GetObject"
],
"Principal":[
"*"
],
"Resource":[
"acs:oss:*:174649585760xxxx:example-bucket/*"
],
"Condition":{
"StringEquals":{
"acs:SourceVpc":[
"vpc-t4nlw426y44rd3iq4xxxx"
]
},
"NotIpAddress":{
"acs:SourceIp":[
"192.168.0.0/16"
]
}
}
}
]
}
シナリオ 5:パブリック IP または VPC へのアクセス制限
バケットへのアクセスを特定のパブリック IP または特定の VPC に制限するには、次の 2 つの拒否ステートメントを作成します。
-
ステートメント 1(パブリックネットワークリクエストの場合、指定されていない IP を拒否):このステートメントは、
StringNotLike: {"acs:SourceVpc": "vpc-*"}を使用してパブリックネットワークリクエストを識別し、次にNotIpAddress: {"acs:SourceIp": "..."}を使用して、指定されていないパブリック IP アドレスからのリクエストを拒否します。両方の条件が満たされた場合に拒否アクションがトリガーされます。VPC リクエストは、そのacs:SourceVpc値がvpc-で始まるため、このステートメントには一致しません。 -
ステートメント 2(VPC リクエストの場合、指定されていない VPC を拒否):このステートメントは、
StringLike: {"acs:SourceVpc": "vpc-*"}を使用して VPC リクエストを識別し、次にStringNotEquals: {"acs:SourceVpc": "..."}を使用して、指定されていない VPC からのリクエストを拒否します。両方の条件が満たされた場合に拒否アクションがトリガーされます。パブリックネットワークリクエストは、そのacs:SourceVpc値がvpc-で始まらないため、このステートメントには一致しません。
いずれかのステートメントに一致するリクエストは拒否されます。次の例では、パブリック IP 203.0.113.5 または VPC t4nlw426y44rd3iq4xxxx 以外のすべてのユーザーが example-bucket への読み取りアクセスを拒否されます。
acs:SourceVpc 条件キーは、現在のアカウントおよび他の Alibaba Cloud アカウントの両方の VPC ID をサポートしており、クロスアカウント VPC アクセス制御を実現します。他のアカウントの特定の VPC からのアクセスを許可するには、ステートメント 2 の VPC ID を対象アカウントの VPC ID に置き換えてください。
-
次の拒否ステートメントのプリンシパルがワイルドカード (
*) に設定されており、条件が含まれているため、この拒否ステートメントはバケットオーナーを含むすべてのユーザーに適用されます。 -
次の拒否ステートメントはアクセスを制限するだけであり、権限を付与するものではありません。プリンシパルに権限が付与されていない場合は、必要な権限を付与する Allow ステートメントを追加できます。
{
"Version":"1",
"Statement":[
{
"Effect":"Deny",
"Action":[
"oss:GetObject"
],
"Principal":[
"*"
],
"Resource":[
"acs:oss:*:174649585760xxxx:example-bucket/*"
],
"Condition":{
"StringNotLike":{
"acs:SourceVpc":[
"vpc-*"
]
},
"NotIpAddress":{
"acs:SourceIp":[
"203.0.113.5"
]
}
}
},
{
"Effect":"Deny",
"Action":[
"oss:GetObject"
],
"Principal":[
"*"
],
"Resource":[
"acs:oss:*:174649585760xxxx:example-bucket/*"
],
"Condition":{
"StringLike":{
"acs:SourceVpc":[
"vpc-*"
]
},
"StringNotEquals":{
"acs:SourceVpc":[
"vpc-t4nlw426y44rd3iq4xxxx"
]
}
}
}
]
}
シナリオ 6: IP ブラックリストを設定する
特定の IP アドレスまたはアドレス範囲からのアクセスをブロックするには、バケットポリシーに拒否ステートメントを追加します。
StringLike: {"acs:SourceVpc": "*"} 条件は、ワイルドカードを使用してすべての値に一致させ、VPC の範囲を制限しません。これは、acs:SourceIp に対応する acs:SourceVpc 条件が必要という制約を満たすためだけに存在します。
-
次の拒否ステートメントのプリンシパルがワイルドカード (
*) に設定されており、条件が含まれているため、この拒否ステートメントはバケットオーナーを含むすべてのユーザーに適用されます。 -
複数の IP アドレスおよび IP アドレス範囲を設定できます。カンマで区切ってください。
{
"Version": "1",
"Statement": [{
"Effect": "Deny",
"Action": "oss:*",
"Principal": [
"*"
],
"Resource": [
"acs:oss:*:174649585760xxxx:example-bucket/*",
"acs:oss:*:174649585760xxxx:example-bucket"
],
"Condition": {
"IpAddress": {
"acs:SourceIp": [
"101.***.***.100"
]
},
"StringLike": {
"acs:SourceVpc": [
"*"
]
}
}
}]
}
シナリオ 7:特定の IP アドレスからのダウンロード操作の拒否
特定の IP アドレスがバケット内のオブジェクトをダウンロード (GetObject) および一覧表示 (ListObjects) することを拒否しながら、その IP アドレスがオブジェクトをアップロード (PutObject) することを引き続き許可するには、Deny ステートメントの Action を GetObject および ListObjects のみに限定します。シナリオ 6 の IP ブラックリストとは異なり、oss:* を拒否するのではなく、このポリシーはダウンロードタイプの操作のみを拒否するため、アップロードは影響を受けません。
StringLike: {"acs:SourceVpc": "*"} 条件は、ワイルドカードを使用してすべての値に一致させ、VPC の範囲を制限しません。これは、acs:SourceIp に対応する acs:SourceVpc 条件が必要という制約を満たすためだけに存在します。
次の Deny ステートメントの Principal がワイルドカード (*) に設定されており、ステートメントに Condition が含まれているため、この Deny ステートメントはバケットオーナーを含むすべてのリクエスターに適用されます。
複数の IP アドレスおよび IP アドレス範囲を設定できます。カンマで区切ってください。
{
"Version": "1",
"Statement": [{
"Effect": "Deny",
"Action": [
"oss:GetObject",
"oss:ListObjects"
],
"Principal": [
"*"
],
"Resource": [
"acs:oss:*:174649585760xxxx:example-bucket/*",
"acs:oss:*:174649585760xxxx:example-bucket"
],
"Condition": {
"IpAddress": {
"acs:SourceIp": [
"101.***.***.100"
]
},
"StringLike": {
"acs:SourceVpc": [
"*"
]
}
}
}]
}
このポリシーが有効になると、拒否された IP アドレスからの GetObject および ListObjects リクエストは 403 AccessDenied を返しますが、PutObject リクエストは影響を受けません。
シナリオ 8:クラシックネットワークアクセスの設定
oss:ClassicIntranet 条件キーは、リクエストが OSS クラシックネットワークから送信されたかどうかを示します。有効な値は true および false です。一部の OSS バックエンドサービス(ログデリバリーやバケットインベントリなど)は、クラシックネットワーク経由でバケットにアクセスします。次の条件を使用して、クラシックネットワークからのリクエストを一致させます。
"Condition": {
"StringEquals": {
"oss:ClassicIntranet": [
"true"
]
}
}
ネットワークアクセス制限(Deny ポリシー)を設定する際、上記のバックエンドサービスを許可するために、Deny ステートメントの Condition ブロックに次の条件を追加して、クラシックネットワークリクエストを除外し、意図しないブロッキングを回避します。
"StringNotEquals": {
"oss:ClassicIntranet": [
"true"
]
}
シナリオ 9:特定の IP アドレスに読み書き権限を付与し、他のすべての IP アドレスに読み取り専用権限を付与
特定の IP アドレス範囲からのリクエストに読み書き権限を付与し、他のすべての IP アドレスからのリクエストに読み取り専用権限を付与するには、2 つの 許可する ステートメントが必要です。acs:SourceIp 条件キーのみを使用する単一のステートメントは保存できません。OSS では、acs:SourceVpc 条件キーを acs:SourceIp と一緒に指定する必要があるためです。次の例では、2 つのステートメントを組み合わせて、この差別化された権限付与を実現します。
-
ステートメント 1 は、IP アドレス範囲
192.168.0.0/16からのリクエストに対してexample-bucketの読み書き権限を付与します。 -
ステートメント 2 は、条件なしで任意の IP アドレスからのリクエストに対して
example-bucketの読み取り専用権限を付与します。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"oss:GetObject",
"oss:PutObject",
"oss:ListObjects"
],
"Resource": [
"acs:oss:*:*:examplebucket",
"acs:oss:*:*:examplebucket/*"
],
"Condition": {
"IpAddress": {
"acs:SourceIp": [
"192.168.0.0/16"
]
},
"StringNotLike": {
"acs:SourceVpc": [
"vpc-*"
]
}
}
},
{
"Effect": "Allow",
"Action": [
"oss:GetObject",
"oss:ListObjects"
],
"Resource": [
"acs:oss:*:*:examplebucket",
"acs:oss:*:*:examplebucket/*"
]
}
]
}
複数のステートメントが共存する場合の完全検証
バケットに複数のポリシーステートメントが含まれる場合、いずれかのステートメントを追加または変更すると、ポリシー内のすべてのステートメントに対して完全検証がトリガーされます。acs:SourceIp 条件キーを含むすべてのステートメントには、acs:SourceVpc 条件キーも含まれている必要があります。そうでない場合、PutBucketPolicy 操作は失敗し、エラーコード 0030-00000008 を返します。
トラブルシューティング手順:
-
GetBucketPolicyを呼び出して、バケットの現在のポリシー内のすべてのステートメントを取得します。 -
各ステートメントの
Condition要素を確認し、acs:SourceIpを含むすべてのステートメントにacs:SourceVpcも含まれていることを検証します。 -
ステップ 2 で特定されたステートメントに不足している
acs:SourceVpc条件を追加し、PutBucketPolicyを再度呼び出してポリシーを再提出します。
適用シナリオ:セキュリティ制御
以下のシナリオでは、認証情報の制限、パブリックアクセスの防止、保持ポリシーの制限などのセキュリティ制御を実施します。
シナリオ 1:API 呼び出しに一時的な認証情報の必須化
API 呼び出しに一時的なアクセス認証情報の使用を必須化します。このポリシーは、acs:AccessId 条件キーを使用して、長期認証情報(Alibaba Cloud アカウントまたは RAM ユーザーのアクセスキー)からのアクセスをブロックします。次の例では、一時的な認証情報(TMP. または STS. で始まるもの)を持たないすべてのユーザーが example-bucket を表示およびそのオブジェクトを一覧表示することを拒否します。
{
"Version": "1",
"Statement": [
{
"Effect": "Deny",
"Action":[
"oss:Get*",
"oss:ListObjects",
"oss:ListObjectVersions"
],
"Principal":[
"*"
],
"Resource":[
"acs:oss:*:174649585760xxxx:example-bucket/*"
],
"Condition": {
"StringNotLike": {
"acs:AccessId": [
"TMP.*",
"STS.*"
]
}
}
}
]
}
シナリオ 2:パブリック ACL の禁止
バケットおよびオブジェクトの ACL がパブリックに設定されることを防止します。次の 2 つの拒否ステートメントを作成します。
-
oss:x-oss-acl条件キーを使用して、バケット ACL がprivate以外の権限に設定されることを防止する拒否ステートメントを作成します。公開読み取りまたは公開読み書き ACL を設定しようとすると、拒否ルールがトリガーされます。 -
oss:x-oss-object-acl条件キーを使用して、オブジェクト ACL がprivateおよびdefault以外の権限に設定されることを防止する拒否ステートメントを作成します。
いずれかのステートメントに一致するリクエストは拒否されます。次の例では、example-bucket に対するパブリック ACL 操作を拒否します。
{
"Version": "1",
"Statement": [
{
"Effect": "Deny",
"Action": [
"oss:PutBucketAcl"
],
"Principal": [
"*"
],
"Resource": [
"acs:oss:*:*:example-bucket"
],
"Condition": {
"StringNotEquals": {
"oss:x-oss-acl": "private"
}
}
},
{
"Effect": "Deny",
"Action": [
"oss:PutObjectAcl"
],
"Principal": [
"*"
],
"Resource": [
"acs:oss:*:*:example-bucket/*"
],
"Condition": {
"StringNotEquals": {
"oss:x-oss-object-acl": [
"private",
"default"
]
}
}
}
]
}
シナリオ 3:ObjectWorm 保持期間の制限
バケットに対してオブジェクトレベルの保持ポリシー(ObjectWorm)を有効化した後、バケットポリシーを使用して最大保持期間を制限できます。次の例では、保持期間を 30 日に制限します。30 日を超える PutObjectRetention リクエストは拒否されます。
{
"Version": "1",
"Statement": [
{
"Effect": "Deny",
"Action": [
"oss:PutObjectRetention"
],
"Principal": [
"*"
],
"Resource": [
"acs:oss:*:174649585760xxxx:example-bucket/*"
],
"Condition": {
"NumericGreaterThan": {
"oss:object-remaining-retention-days": "30"
}
}
}
]
}
-
oss:object-remaining-retention-daysは ObjectWorm ポリシーの条件キーです。リクエストで指定された残りの保持日数を表します。 -
このポリシーのプリンシパルがワイルドカード (*) に設定されており、条件が含まれているため、このポリシーはバケットオーナーを含むすべてのユーザーに適用されます。
匿名アップロードの診断
バケットに予期しないファイルが表示された場合は、バケットポリシーに、Principal がワイルドカード文字 (*) に設定された Allow 文が含まれていないか確認してください。この文により、誰でも認証なしでスクリプト (たとえば、python-requests や curl) を使用してオブジェクトをアップロードできます。
-
OSS コンソールでリアルタイムログクエリを有効化します。対象のバケットに移動し、ログ管理 > リアルタイムクエリ をクリックして、今すぐ有効化 をクリックします。
-
Simple Log Service (SLS) でアクセスログをクエリし、匿名アップロードをフィルターします。
select access_id, user_agent, client_ip, http_method, object from oss-log-store where access_id = '-' and user_agent like '%python-requests%' -
フィールドの説明:
-
access_idが-の場合、匿名(未認証)リクエストを示します。 -
user_agentは、オブジェクトをアップロードするために使用されたツールを示します(例:python-requests/2.28.1)。 -
client_ipは、匿名アップロードの送信元 IP アドレスです。
-
-
匿名アップロードでは、
sign_typeがNotSignに設定されますが、署名付きアップロードでは、sign_typeがNORMAL_SIGN4に設定されます。Principalが*に設定された Allow 文を変更または削除しても、コンソール、ossbrowser、または ossutil を介して実行される署名付きアップロードには影響しません。
読み取り専用ユーザーがオブジェクトを書き込める
AliyunOSSReadOnlyAccess システムポリシーは読み取り操作 (oss:Get* および oss:List*) のみを付与し、書き込み権限は一切含まれていません。このポリシーのみがアタッチされた RAM ユーザーがオブジェクトを書き込める場合(例:PutObject リクエストが 200 OK を返す場合)、そのユーザーは他のソースから重複する書き込み権限を持っている可能性があります。次の 3 つのソースを確認してください。
-
RAM カスタムポリシー:
ListPoliciesForUserを呼び出して RAM ユーザーにアタッチされたすべてのポリシーを一覧表示し、oss:Put*またはoss:*を付与するカスタムポリシーがないか確認します。 -
バケットポリシー: 対象バケットのバケットポリシーを確認します。
プリンシパル要素にこの RAM ユーザーが含まれているか、および操作要素に書き込み操作が含まれているかを確認します。 -
RAM ユーザーグループポリシー: RAM ユーザーが RAM ユーザーグループに属している場合、そのユーザーグループに書き込み権限を付与するポリシーがアタッチされているかどうかを確認します。
この問題を解決するには、重複する書き込み権限ポリシーを削除または変更して、RAM ユーザーの権限が AliyunOSSReadOnlyAccess のみによって制御されるようにします。重複する書き込み権限ポリシーを削除した後、読み取り専用 RAM ユーザーからの PutObject などのリクエストは 403 AccessDenied を返し、You have no right to access this object because of bucket acl に似たエラーメッセージが表示されます。
開発およびツール統合
コンソール以外にも、グラフィカルツール、CLI ツール、SDK を使用してバケットポリシーを設定できます。
-
グラフィカルツール ossbrowser の使用
ossbrowser は、バケットレベルのポリシー操作向けに視覚的でコンソールのような体験を提供します。ossbrowser をインストールしてサインインし、ポリシーを設定します。
-
コマンドラインツール ossutil の使用
put-bucket-policy コマンドを使用して、権限付与ポリシーを設定します。
説明ベクターバケットの権限付与ポリシーを設定するには、
ossutil vectors-api put-bucket-policyコマンドを実行します。 -
SDK の使用
Java SDK、Python SDK、Go SDK、および Node.js SDK などの SDK を使用してポリシーを設定します。SDK リファレンス には、サポートされているすべての言語が記載されています。
-
API の直接呼び出し
PutBucketPolicy 操作を呼び出して、バケット権限付与ポリシーを設定します。
クォータと制限事項
-
ポリシーのサイズ: バケットには複数のバケットポリシーの文を設定できますが、すべてのポリシーの合計サイズは 16 KB を超えることはできません。
-
フィールド長:バケットポリシー内の各フィールドの長さは 4,095 バイトを超えてはなりません。