Amazon Simple Storage Service (Amazon S3) バケットポリシーで、プリンシパル要素と明示的な拒否でワイルドカードを使用したいと思います。どうすればできますか?
簡単な説明
AWS Identity and Access Management (IAM) エンティティによって作成された Amazon S3 バケットへのアクセスを防ぐには、バケットポリシーで特定のアクセス権限を指定します。バケットポリシーでは、NotPrincipal 要素と明示的拒否を使用する必要があります。詳細については、「](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_notprincipal.html#specifying-notprincipal)NotPrincipal と Deny の使用[」を参照してください。
ただし、Amazon S3 は NotPrincipal 要素も含めたワイルドカードをサポートしていないため、各ステートメントブロックのターゲットエンティティとして Principal を使用する必要があります。各ステートメントブロックでは、各許可ブロックの条件も指定する必要があります。
解決策
まず、次のリソースがあることを確認します。
- S3 バケット
- IAM ロール
- IAM ロールのある Amazon Elastic Compute Cloud (Amazon EC2) インスタンス (または、このロールではない他の IAM ロールに切り替えることも可能)
- IAM エンティティの一意 ID (この一意 ID は、IAM API コールを実行することでも取得可能)
次の例では、aws:userid の中でワイルドカードを使用して、呼び出し元のプロセスが渡すすべての名前を網羅しています。この例には、ユーザーが一時的な認証情報を取得する呼び出しを行うときに使用するアプリケーション、サービス、またはインスタンス ID も網羅したワイルドカードが使用されています。詳細については、「ポリシー変数に使用可能なリクエスト情報」を参照してください。この例では、ロックアウトを防ぐために AWS アカウントのルートユーザーが含まれています。
注: 例の中の名前は必ず自身のロール ID とバケット名に置き換えてください。
ポリシーの完全な例を次に示します。拒否ブロック内の StringNotLike 条件に注目してください。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::444455556666:role/s3-access-role"
]
},
"Action": [
"s3:ListBucket"
],
"Resource": "arn:aws:s3:::awsexamplebucket1"
},
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::444455556666:role/s3-access-role"
]
},
"Action": [
"s3:DeleteObject",
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::awsexamplebucket1/*"
},
{
"Sid": "",
"Effect": "Deny",
"Principal": "*",
"Action": [
"s3:ListBucket",
"s3:DeleteObject",
"s3:GetObject",
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::awsexamplebucket1/*",
"arn:aws:s3:::awsexamplebucket1"
],
"Condition": {
"StringNotLike": {
"aws:userid": [
"AROAID2GEXAMPLEROLEID:*",
"444455556666"
]
}
}
}
]
}
関連情報
How to restrict Amazon S3 bucket access to a specific IAM role
AWS JSON ポリシーの要素: NotPrincipal