バケットポリシーとは、バケットに関連付けられたリソースベースの認可ポリシーです。バケットポリシーを使用することで、クロスアカウントアクセスの許可、匿名アクセスの有効化、または IP アドレスや VPC によるアクセス制限が可能になります。
仕組み
バケットポリシーはリソースベースのモデルであり、バケットにアタッチして、どのプリンシパルが、どのような条件下で、どのリソースに対して、どのアクションを実行できるかを定義します。
リクエストが到着すると、OSS は、バケットポリシーや RAM ポリシーを含むすべての関連ポリシーを評価します。評価は 拒否優先の原則 に従います。明示的な拒否がある場合、許可ルールに関係なくリクエストがブロックされます。一致するルールが存在しない場合、リクエストはデフォルトで拒否されます。
バケットポリシーには、バケット所有者に対する特別なルールがあります。
プリンシパルがワイルドカード文字 (*) に設定され、ポリシーに 条件が含まれていない 場合、ポリシーは バケット所有者以外のユーザーにのみ適用されます。
プリンシパルがワイルドカード文字 (*) に設定され、ポリシーに 条件が含まれている 場合、ポリシーは バケット所有者や匿名ユーザーを含むすべてのユーザーに適用されます。拒否ルールにより、バケット全体にアクセスできなくなる可能性があります。許可ルールにより、匿名ユーザーにデータが公開される可能性があります。
同じユーザーに複数のステートメントが適用される場合、実効アクセス許可は、 拒否優先の原則 に従い、すべてのステートメントの和集合となります。
acs:SourceIp条件キーは、リクエストのソース IP アドレスのみを照合し、IP アドレスがパブリックネットワークと VPC のどちらからのものかを区別しません。つまり、アクセス制限にacs:SourceIpのみを使用した場合、同じ IP アドレス範囲を使用する別の VPC からのリクエストも許可されてしまい、不正アクセスのリスクが生じます。したがって、バケットポリシーを設定する際、acs:SourceIpを指定する場合は、リクエストのネットワークソースを明示的に識別するためにacs:SourceVpcも指定する必要があります。この制約は、新しいバケットポリシーにのみ適用されます。既存のバケットポリシーには影響しません。ただし、既存のバケットポリシーを変更すると、新規送信として扱われ、この制約の対象となります。
バケットポリシーの設定
OSS は、GUI 方式と構文方式の 2 つの設定方法を提供します。
GUI 方式:一般的な権限付与シナリオ向けのフォームベースのインターフェースです。
構文方式:すべてのポリシー機能と複雑な条件の組み合わせをサポートする JSON ベースのエディターです。
GUI 方式
バケットのリストに移動し、対象のバケットをクリックします。
左側のナビゲーションペインで、をクリックします。
GUI で追加を選択し、新規権限をクリックします。
パラメーター
説明
関連リソース
バケット全体 または 指定されたリソース のどちらに権限を付与するかを選択します。
リソースパス
関連リソース を バケット全体 に設定した場合、リソースパス は
bucket-name/*に設定されます。関連リソース を 指定されたリソース に設定した場合、権限を付与するディレクトリまたはオブジェクトを入力します。複数追加できます。
ユーザー
権限を付与するプリンシパルを指定します。
[すべてのアカウント (*)]:匿名ユーザーを含むすべてのユーザーに権限を付与します。
[RAM ユーザー]:現在の Alibaba Cloud アカウントに属する RAM ユーザーを選択します。
ログインしているアカウントは、Alibaba Cloud アカウント (ルートアカウント) 、またはバケット管理権限と 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] をクリックして Bucket Policy を適用します。
構文方式
バケットのリストに移動し、対象のバケットをクリックします。
左側のナビゲーションペインで、 をクリックします。
構文で追加 を選択し、[編集] をクリックします。エディタで、承認ポリシーを 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 とステートメントが含まれます。
バージョン:アクセスポリシーのバージョン。値は
1に固定されており、変更できません。ステートメント:ポリシーの本体です。1 つ以上の特定のルールが含まれます。各ルールは、オプションの
Sidをサポートし、Effect、アクション、プリンシパル、リソース、Conditionを含みます。ポリシー要素
説明
例での意味
Sid (オプション)
ステートメント ID。ポリシー内の各ステートメントの、人間が判読可能な一意の識別子です。識別、管理、監査に役立ち、権限自体には影響しません。
拒否ステートメントを
DenyNonVpcAccessとして識別します。Effect
ポリシーの効果です。有効な値は
AllowとDenyです。リクエストを拒否します。
アクション
リソースに対して実行する特定のアクション。ワイルドカード文字
*を使用できます。すべての OSS アクション (
oss:*) を拒否します。プリンシパル
ポリシーが適用されるユーザー、アカウント、またはロール。
Principalフィールドを空のリスト () に設定することは、すべてのアカウント (Principal:[]) に設定することと同一です。Principal:["*"]このポリシーは RAM ユーザー
20214760404935xxxxにのみ適用されます。リソース
ポリシーが適用されるリソース。
このポリシーは、
example-bucketバケット自体と、その中のすべてのオブジェクトに適用されます。Condition
ポリシーが有効になる条件。
複数の条件を設定した場合、すべての条件を満たす必要があります (AND 関係) 。
この Deny ポリシーは、リクエストのソース VPC が
vpc-t4nlw426y44rd3iq4xxxxではない場合にのみ有効になります。ポリシー要素の完全なリファレンスについては、権限付与の構文と要素をご参照ください。
承認ポリシーが正しいことを確認したら、[保存] をクリックし、画面の指示に従います。
ベクターバケットポリシーの設定
ベクターバケットでは、バケットポリシーの設定は構文方式のみサポートされています。
ベクターバケット のリストに移動し、対象のベクターバケットをクリックします。
左側のナビゲーションペインで、 をクリックします。
[編集] をクリックします。エディターで、承認ポリシーを JSON 形式で入力します。
ポリシー例: ユーザー
20816353761158****に、vector-bucket-example内のインデックステーブルindextestのベクトルデータに対する読み取りおよび書き込み権限を付与します。{ "Version": "1", "Statement": [{ "Effect": "Allow", "Action": [ "oss:PutVectors", "oss:GetVectors" ], "Principal": [ "20816353761158****" ], "Resource": [ "acs:ossvector:*:*:vector-bucket-example/indextest" ] }] }完全なアクセスポリシーには、Version と ステートメント が含まれます。
バージョン: アクセスポリシーのバージョンです。値は
1に固定されており、変更できません。ステートメント:ポリシーの本体です。1 つ以上の特定のルールが含まれます。各ルールには、エフェクト、アクション、プリンシパル、リソース、および 条件 が含まれます。
ポリシー要素
説明
この例での設定
エフェクト
ポリシーの効果。有効な値は
AllowとDenyです。リクエストを許可します。
アクション
リソースに対する特定のアクション。ワイルドカード文字
*がサポートされています。ベクターデータの読み取りと書き込み。
プリンシパル
ポリシーが適用されるユーザー、アカウント、またはロール。
Principalフィールドに空のリスト () を設定することは、すべてのアカウントに設定する (Principal:[]) ことと同一です。Principal:["*"]このポリシーは、RAM ユーザー
20816353761158****にのみ適用されます。リソース
ポリシーが適用されるリソース。
このポリシーは、
vector-bucket-exampleバケット内のindextestインデックス テーブルに適用されます。条件
ポリシーが有効になる条件。
複数の条件を設定した場合、すべての条件を満たす必要があります (AND 関係)。
なし。
ポリシー要素の完全なリファレンスについては、「権限付与の構文と要素」をご参照ください。
承認ポリシーが正しいことを確認した後、[保存] をクリックし、画面の指示に従ってください。
OSS-HDFS ポリシーの設定
OSS-HDFS サービスのユーザーが .dlsdata/ ディレクトリとそのオブジェクトにアクセスできるようにするには、OSS-HDFS が有効化されたバケットにバケットポリシーを設定する際、操作を [アクセス拒否] に設定しないでください。詳細については、OSS-HDFS を使用するための前提条件をご参照ください。
特定のネットワーク IP アドレスまたは VPC へのアクセスを制限するには、すべての拒否ステートメントに次の条件を追加します。これにより、OSS-HDFS のバックエンドサービスがクラシックネットワーク経由でバケットに対して読み取りおよび書き込みを行えるようになります。
"StringNotLike": {
"oss:ClassicIntranet": [
"true"
]
}一般的なシナリオ:許可の付与
次のシナリオでは、特定のユーザー、ロール、またはすべてのユーザーにアクセスを許可する方法を示します。いずれのシナリオにも、用途に合わせて調整できるポリシー例が含まれています。
シナリオ 1:読み取り/書き込み権限の付与
チームメンバーまたはパートナーに、バケットへの読み取り/書き込みアクセスを付与します。この例では、example-bucket に対する読み取り/書き込み権限を、RAM ユーザー 27737962156157xxxx と 20214760404935xxxx に付与します。
このポリシーでは、バケットを一覧表示する権限は付与されません。RAM ユーザーは Buckets ページを直接参照できません。代わりに、左側のナビゲーションペインで をクリックし、対象のバケットを追加できます。
{
"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:特定のディレクトリへの読み取り専用権限の付与
特定のディレクトリへの読み取り専用アクセスを付与します。この例では、example-bucket 内で、プレフィックスが hangzhou/2020 および shanghai/2015 のディレクトリに対する読み取り専用権限を、RAM ユーザー 20214760404935xxxx に付与します。
このポリシーでは、バケットを一覧表示する権限は付与されません。RAM ユーザーは Buckets ページを直接参照できません。代わりに、左側のナビゲーションペインで をクリックし、対象のバケットを追加できます。
{
"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 ユーザーは Buckets ページを直接参照できません。代わりに、左側のナビゲーションペインで をクリックし、対象のバケットを追加できます。
{
"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"
]
}
]
}一般的なシナリオ:ネットワークアクセスの制限
以下のシナリオでは、acs:SourceIp および acs:SourceVpc 条件キーを使用して、ネットワークソース (パブリック IP または VPC) に基づいてバケットアクセスを制限します。以下の表で、一般的なアプローチをまとめています。
アクセス元 | ポリシーアプローチ | シナリオ |
任意の VPC | acs:SourceVpc が | |
特定の VPC |
| |
特定のパブリック IP | ステートメント 1 は、指定外の IP アドレスからのパブリックネットワークリクエストを拒否します。ステートメント 2 は、すべての VPC リクエストを拒否します。 | |
特定の VPC 内の特定の IP 範囲 | ステートメント 1 は、指定外の VPC からのリクエストを拒否します。ステートメント 2 は、指定された VPC 内の指定外の IP 範囲からのリクエストを拒否します。 | |
特定のパブリック IP または特定の VPC | ステートメント 1 は、指定外の IP アドレスからのパブリックネットワークリクエストを拒否します。ステートメント 2 は、指定外の VPC からの VPC リクエストを拒否します。 | |
特定の IP (ブラックリスト) | 指定された IP からのリクエストを拒否し、制約を満たすために SourceVpc にワイルドカード | |
クラシックネットワーク | クラシックネットワークアクセスを許可します。 |
シナリオ 1:パブリックネットワークアクセスの制限
acs:SourceVpc 条件キーを持つ deny ステートメントを追加することで、バケットへのすべてのパブリックネットワークアクセスをブロックできます。このステートメントは、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 内のオブジェクトの読み取りを拒否します。
以下の拒否ステートメントでは、プリンシパルがワイルドカード文字 (
*) であり、条件が含まれているため、バケット所有者を含むすべてのユーザーに適用されます。次の Deny ステートメントはアクセスを制限するだけで、いかなる権限も付与しません。 プリンシパルに権限が付与されていない場合は、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 つの Deny ステートメントを作成します。
ステートメント 1 (不特定の IP アドレスからのパブリックネットワークリクエストを拒否): このステートメントは、
StringNotLike: {"acs:SourceVpc": "vpc-*"}を使用してパブリックネットワークリクエストを識別します (パブリックネットワークリクエストの場合、acs:SourceVpcの値はvpc-で始まりません)。 さらに、NotIpAddress: {"acs:SourceIp": "..."}を使用して、指定された IP アドレス以外からのリクエストを拒否します。 両方の条件が満たされた場合に、拒否アクションがトリガーされます。ステートメント 2 (すべての VPC リクエストを拒否): このステートメントは、指定されたパブリック IP アドレスからのみアクセスを許可することを目的としているため、
StringLike: {"acs:SourceVpc": "vpc-*"}を使用して、任意の VPC からのすべてのリクエストを照合し、拒否します。
いずれかのステートメントに一致するリクエストは拒否されます。次の例では、パブリック IP 203.0.113.5 からのユーザーを除くすべてのユーザーに対して、example-bucket への読み取りアクセスを拒否します。
以下の拒否ステートメントでは、プリンシパルがワイルドカード文字 (
*) であり、条件が含まれているため、バケット所有者を含むすべてのユーザーに適用されます。次の Deny ステートメントはアクセスを制限するだけで、いかなる権限も付与しません。 プリンシパルに権限が付与されていない場合は、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 つの Deny ステートメントを作成します。
ステートメント 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 への読み取りアクセスを拒否します。
以下の拒否ステートメントでは、プリンシパルがワイルドカード文字 (
*) であり、条件が含まれているため、バケット所有者を含むすべてのユーザーに適用されます。次の Deny ステートメントはアクセスを制限するだけで、いかなる権限も付与しません。 プリンシパルに権限が付与されていない場合は、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 つの Deny ステートメントを作成します。
ステートメント 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 への読み取りアクセスが拒否されます。
以下の拒否ステートメントでは、プリンシパルがワイルドカード文字 (
*) であり、条件が含まれているため、バケット所有者を含むすべてのユーザーに適用されます。次の Deny ステートメントはアクセスを制限するだけで、いかなる権限も付与しません。 プリンシパルに権限が付与されていない場合は、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 ブラックリストの設定
バケットポリシーに Deny ステートメントを追加することで、特定の 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:クラシックネットワークアクセスの設定
oss:ClassicIntranet 条件キーは、リクエストが OSS クラシックネットワークから発信されたかどうかを示します。有効な値は true と false です。一部の OSS バックエンドサービス (ログ配信やバケットインベントリなど) は、クラシックネットワーク経由でバケットにアクセスします。クラシックネットワークからのリクエストに一致させるには、次の条件を使用します。
"Condition": {
"StringEquals": {
"oss:ClassicIntranet": [
"true"
]
}
}ネットワークアクセス制限 (Deny ポリシー) を設定する際に、上記のバックエンドサービスを許可するには、Deny ステートメントの Condition ブロックに次の条件を追加して、クラシックネットワークリクエストを除外し、意図しないブロッキングを回避します。
"StringNotEquals": {
"oss:ClassicIntranet": [
"true"
]
}一般的なシナリオ:セキュリティコントロール
以下のシナリオでは、認証情報の制限、パブリックアクセス防止、保持ポリシーの制限といったセキュリティコントロールを適用します。
シナリオ 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 つの Deny ステートメントを作成します。
oss:x-oss-acl条件キーを使用して、バケット ACL がprivate以外の権限に設定されるのを防ぐ Deny ステートメントを作成します。public-read または public-read-write の ACL を設定しようとすると、拒否ルールがトリガーされます。oss:x-oss-object-acl条件キーを使用して、オブジェクト ACL がprivateおよびdefault以外の権限に設定されるのを防ぐ Deny ステートメントを作成します。
リクエストは、いずれかのステートメントに一致する場合に拒否されます。次の例では、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 ポリシーの条件キーです。リクエストで指定された残りの保持日数を表します。このポリシーのプリンシパルはワイルドカード文字 (*) であり、条件が含まれているため、バケット所有者を含むすべてのユーザーに適用されます。
開発およびツール連携
コンソール以外にも、グラフィカルツール、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 API を呼び出して、バケットポリシーを設定します。
クォータと制限
ポリシーサイズ: 1つのバケットに複数のバケットポリシーステートメントを設定できますが、バケットポリシーのサイズは 16 KB を超えることはできません。
フィールドの長さ: バケットポリシー内の各フィールドの長さは、4,095 バイトを超えることはできません。