images.mysite.com
S3 のような単純なバケットと、バックアップなどを含む他のバケットがあります。
images.mysite.com
画像をアップロードするために、特定のユーザーがバケットにアクセスできるようにしたいと考えています。しかし、私は彼に他のバケットを見せたくありません。それらが存在することすらありません。
これを行うポリシーを作成できませんでした。何か制限的なことを試みるたびに、バケットのリストがブロックされてしまいます。
私はしばらくこれを試してきましたが、最終的に実用的な解決策を思い付きました。実行するアクションの種類に応じて、異なる「リソース」を使用する必要があります。また、前の回答 ( など) に不足しているアクションをいくつか含め、DeleteObject
さらに制限( など) を追加しPutBucketAcl
ました。
現在、次の IAM ポリシーが機能しています。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation",
"s3:ListBucketMultipartUploads"
],
"Resource": "arn:aws:s3:::itnighq",
"Condition": {}
},
{
"Effect": "Allow",
"Action": [
"s3:AbortMultipartUpload",
"s3:DeleteObject",
"s3:DeleteObjectVersion",
"s3:GetObject",
"s3:GetObjectAcl",
"s3:GetObjectVersion",
"s3:GetObjectVersionAcl",
"s3:PutObject",
"s3:PutObjectAcl",
"s3:PutObjectVersionAcl"
],
"Resource": "arn:aws:s3:::itnighq/*",
"Condition": {}
},
{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*",
"Condition": {}
}
]
}
バケットに関するアクションとオブジェクトに関するアクションは、別の arn を持つ必要があります。
アクセス許可を付与せずに S3 コンソールへのアクセスを提供することはできませんListAllMyBuckets
。
私の場合(そしておそらくあなたの将来の読者も)、受け入れられる代替手段は、サインインしたユーザーを、表示したいバケットに直接リダイレクトすることです。
これを行うには、IAM サインイン URL に以下を追加します。
/s3/?bucket=bucket-name
完全なサインイン URL ( your-aliasとbucket-nameを置き換えます):
https://your-alias.signin.aws.amazon.com/console/s3/?bucket=bucket-name
IAM ポリシー ( bucket-name を置き換えます):
{
"Statement": [
{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "arn:aws:s3:::*"
},
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::bucket-name",
"arn:aws:s3:::bucket-name/*"
]
}
]
}
ユーザーに対してバケット固有のアクセス許可を作成する方法の詳細については、次のブログを参照してください。 /
このポリシーを試してください。また、選択したバケットのみをユーザーにリストさせる方法がないことも考慮してください。すべてのバケットをリストすることも、何もリストしないこともできます。
{
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:GetObjectAcl",
"s3:PutObjectAcl",
"s3:ListBucket",
"s3:GetBucketAcl",
"s3:PutBucketAcl",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:::your_bucket_here/*",
"Condition": {}
},
{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*",
"Condition": {}
}
]
}
回答がチェックされなかった理由について混乱していますか?
上記のソリューションから各ポリシー ステートメントを分類してみましょう。
このポリシー ステートメントはバケットの内容に適用されますが、バック自体には適用されません。バケツに何が入っているかがわからないため、これはおそらく質問が求めているものではありません。
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:GetObjectAcl",
"s3:PutObjectAcl",
"s3:ListBucket",
"s3:GetBucketAcl",
"s3:PutBucketAcl",
"s3:GetBucketLocation"
],
"Resource": "arn:aws:s3:::your_bucket_here/*",
"Condition": {}
}
から派生したこの 2 つのステートメント ポリシーは、( arn:aws:s3:::your_bucket_here/
) readonlyでバケットへの読み取り専用アクセスを許可しますが、バケットのコンテンツに対する CRUD ops は引き続き許可します ( arn:aws:s3:::your_bucket_here/*
)。
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation",
"s3:ListBucketMultipartUploads"
],
"Resource": "arn:aws:s3:::your_bucket_here",
"Condition": {}
},
{
"Effect": "Allow",
"Action": [
"s3:AbortMultipartUpload",
"s3:DeleteObject",
"s3:DeleteObjectVersion",
"s3:GetObject",
"s3:GetObjectAcl",
"s3:GetObjectVersion",
"s3:GetObjectVersionAcl",
"s3:PutObject",
"s3:PutObjectAcl",
"s3:PutObjectAclVersion"
],
"Resource": "arn:aws:s3:::your_bucket_here/*",
"Condition": {}
}
ただし、ポリシーには以下のステートメントが含まれており、ユーザーはエンドポイントですべてのバケットを表示できます。これはおそらく、質問が求めているものではありません。
{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*",
"Condition": {}
}
ただし、S3 ストアを閲覧するクライアントを使用する場合、上記は非常に便利です。クライアントがバケットではなくストアに直接アクセスする場合は、ルートにあるバケットのリストにアクセスする必要があります。
おそらく最も単純な使用例:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:ListBucket"],
"Resource": ["arn:aws:s3:::bucket-name"]
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": ["arn:aws:s3:::bucket-name/*"]
}
]
}
次の作業を行うことができました。他のバケットをリストすると、Access Denied メッセージが受信されたことを意味します。ただし、バケット名をパスとして設定して接続すると、必要なバケットを表示できました。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetBucketLocation",
"s3:ListAllMyBuckets"
],
"Resource": "arn:aws:s3:::test"
},
{
"Effect": "Allow",
"Action": ["s3:ListBucket"],
"Resource": ["arn:aws:s3:::test"]
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": ["arn:aws:s3:::test/*"]
}
]
}
この接続をテストするために Cyberduck を使用していました。
このポリシーを試してください。ユーザーはバケットを一覧表示できません。許可されたバケットへの直接リンクを使用する必要があります。
例: s3.console.aws.amazon.com/s3/buckets/bucketname/?region=us-east-1&tab=overview
{
"Statement": [
{
"Action": [
"s3:ListBucket"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::bucketname"
]
},
{
"Action": [
"s3:PutObject",
"s3:GetObject"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::bucketname*"
]
},
],
"Version": "2012-10-17"
}
上記の他のものと同様:
{
"Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Action":[
"s3:ListBucket"
],
"Resource":"arn:aws:s3:::awsexamplebucket"
},
{
"Effect":"Allow",
"Action":[
"s3:PutObject",
"s3:GetObject"
],
"Resource":"arn:aws:s3:::awsexamplebucket/*"
}
]
}
ただし、ここに欠けている部分があります。S3->Home からバケットにアクセスすることはできませんが、直接リンクを介して目的のバケットのみにアクセスすることは可能です。
https://s3.console.aws.amazon.com/s3/buckets/yourawsbucket/
詳細については、次の投稿を参照してください。
https://aws.amazon.com/premiumsupport/knowledge-center/s3-console-access-certain-bucket/
同様のニーズを追加するだけで、これで解決します:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:Get*",
"s3:Put*",
"s3:DeleteObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::my-bucket-name",
"arn:aws:s3:::my-bucket-name/*"
]
}
]
}
以下の解決策は私にとってはうまくいきました。特定のバケットmy-s3-bucketで特定のユーザーmy_iam_userにアクセスを許可するポリシーが必要でした。
このポリシーにより、ユーザーは特定の s3 バケットのファイルを一覧表示、削除、取得できます。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ListBucket",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:user/my_iam_user"
},
"Action": [
"s3:ListBucket"
],
"Resource": "arn:aws:s3:::my-s3-bucket"
},
{
"Sid": "AddDeleteFiles",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:user/my_iam_user"
},
"Action": [
"s3:DeleteObject",
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::my-s3-bucket/*"
}
]
}
これについては、Amazon がhttp://blogs.aws.amazon.com/security/post/Tx3VRSWZ6B3SHAV/Writing-IAM-Policies-How-to-grant-access-to-an-Amazon-S3-bucketで詳しく説明しています。
Deny
アクセスしたくないバケットの句を追加します。それらはまだリストされている可能性がありますが、それらの内容にアクセスすることはできません.
{ "バージョン": "2012-10-17", "声明": [ { "効果": "許可", "アクション": "s3:*", "リソース": "*" }、 { "効果": "拒否", "アクション": "s3:*", "リソース": [ "arn:aws:s3:::バケット名", 「arn:aws:s3:::バケット名/*」 ] } ] }