説明
OSS バケットポリシーですべての主体に削除操作を許可すると、適切なアクセス制限がない場合、削除権限が不要な主体もデータや設定を削除できるおそれがあります。実際の権限は、操作、対象リソース、条件、明示的な拒否、公開アクセスのブロックによって決まります。
バケット、オブジェクト、設定の削除は、それぞれ異なる操作です。特に DeleteBucket はバケット所有者だけが実行でき、バケットが空であることが必要です。この権限を指定しても、誰でもバケットと中のデータをまとめて削除できるわけではありません。
想定される影響
- オブジェクトを削除する必要がない主体にその権限が実際に与えられると、データやアプリケーションが使用するオブジェクトが削除される可能性があります。
- バケットの設定を削除する操作が許可されていると、その設定が失われて運用に影響する場合があります。バケット自体、オブジェクト、設定の削除は区別する必要があります。
- 実際に削除が起きると、データの復旧や障害対応が必要になる場合があります。バージョニングや保持ポリシーの効果も、操作と対象ごとに確認が必要です。
対処方法
- 必要なアカウントやロールに対して、必要な削除操作とリソースだけを許可してください。公開アクセスを目的とするポリシーに、不要な削除権限を含めないでください。
- バケットとオブジェクトのリソース表現を区別し、条件、明示的な拒否、ACL、公開アクセスのブロックを併せて確認してください。
privateのACLだけですべてのポリシーによるアクセスを拒否できるわけではありません。 - インラインの
policyはプロバイダー 1.220.0 以降で非推奨です。新しい構成はalicloud_oss_bucket_policyで管理し、移行後も必要な権限と制限が維持されることを確認してください。
例
以下はプロバイダー 1.293.0 で利用できる従来のインライン形式の例です。使用可能な一意のバケット名を選び、ポリシーのリソースパスも合わせて変更してください。
バケット削除とアップロードの指定
hcl
resource "alicloud_oss_bucket" "bucket-policy1" {
bucket = "bucket-1-policy"
acl = "private"
policy = <<POLICY
{"Statement": [
{
"Action": [
"oss:PutObject", "oss:DeleteBucket"
],
"Effect": "Allow",
"Principal": [
"*"
],
"Resource": [
"acs:oss:*:*:bucket-1-policy",
"acs:oss:*:*:bucket-1-policy/*"
]
}
],
"Version":"1"}
POLICY
}
oss:DeleteBucket には、所有者による実行と空のバケットという制約が引き続き適用されます。併記した oss:PutObject はオブジェクトのアップロード権限なので、公開アクセスのブロックなども考慮して、必要なアップロード元だけに許可してください。
一覧取得だけを許可する指定
hcl
resource "alicloud_oss_bucket" "bucket-policy2" {
bucket = "bucket-2-policy"
acl = "private"
policy = <<POLICY
{"Statement": [
{
"Action": [
"oss:ListObjects"
],
"Effect": "Allow",
"Principal": [
"*"
],
"Resource": [
"acs:oss:*:*:bucket-2-policy"
]
}
],
"Version":"1"}
POLICY
}
このステートメントは、削除権限の代わりに oss:ListObjects を許可します。ほかのポリシーによる削除権限を取り消す効果はなく、公開の一覧取得が実際に許可されるとオブジェクト名などが公開されるおそれがあります。一覧の公開も業務上必要か確認してください。