1. ホーム
  2. amazon-web-services

[解決済み] アクセスポイントを経由してAmazon S3へのロールを認可する

2022-02-16 04:56:06

質問

目標は、Amazon S3のリードライト(リスト、ゲット、プット、デリート)アクセスを単一のロールに制限し、バケットポリシーをアクセスポイントのみにロックして、アクセスポイントを通じてのみS3にアクセスすることである。

これまでに行った設定は

  • S3の部分的なアクセス制御(list, get, put, delete)をアクセスポイントに委譲する。
  • アクセスポイントレベルで明示的な拒否を適用し、1つのロールにのみアクセスを制限する。
  • そのロールに、アクセスポイント経由でのリストアップ、取得、配置、削除を許可するポリシーを追加しました。

しかし、経験 AccessDenied 上記のいずれかの操作で

S3 Bucketのポリシーはこちらです。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AuthorizeS3ObjectsReadModifyThroughAccessPointsOnly",
            "Effect": "Deny",
            "Principal": "*",
            "Action": [
                "s3:DeleteObject",
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::XXX-YYY-ZZZ/*",
            "Condition": {
                "ForAllValues:StringNotEquals": {
                    "s3:DataAccessPointArn": "arn:aws:s3:us-east-1:XXX-YYY-ZZZ:accesspoint/XXX-YYY-ZZZ"
                }
            }
        },
        {
            "Sid": "AuthorizeS3ObjectsListThroughAccessPointsOnly",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::XXX-YYY-ZZZ",
            "Condition": {
                "ForAllValues:StringNotEquals": {
                    "s3:DataAccessPointArn": "arn:aws:s3:us-east-1:XXX-YYY-ZZZ:accesspoint/XXX-YYY-ZZZ"
                }
            }
        }
    ]
}

で、こちらがアクセスポイントのポリシーです。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AuthorizeReadModifyS3ObjectsThroughSpecificRoleOnly",
            "Effect": "Deny",
            "Principal": {
                "AWS": "*"
            },
            "Action": [
                "s3:DeleteObject",
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:us-east-1:XXX-YYY-ZZZ:accesspoint/XXX-YYY-ZZZ/object/*",
            "Condition": {
                "ForAllValues:StringNotEquals": {
                    "aws:PrincipalArn": "arn:aws:iam::XXX-YYY-ZZZ:role/XXX-YYY-ZZZ"
                }
            }
        },
        {
            "Sid": "AuthorizeListS3ObjectsThroughSpecificRoleOnly",
            "Effect": "Deny",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:us-east-1:XXX-YYY-ZZZ:accesspoint/XXX-YYY-ZZZ",
            "Condition": {
                "ForAllValues:StringNotEquals": {
                    "aws:PrincipalArn": "arn:aws:iam::XXX-YYY-ZZZ:role/XXX-YYY-ZZZ"
                }
            }
        }
    ]
}

で、これがロールポリシーです。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ReadModifyS3Objects",
            "Effect": "Allow",
            "Action": [
                "s3:DeleteObject",
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:us-east-1:XXX-YYY-ZZZ:accesspoint/XXX-YYY-ZZZ/object/*",
            ]
        },
        {
            "Sid": "ListS3Objects",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:us-east-1:XXX-YYY-ZZZ:accesspoint/XXX-YYY-ZZZ"
            ]
        }
    ]
}

これは動作しません。 AccessDenied . 適切なロールを想定し、例えば次のようなコマンドでテストしています。 aws s3 ls "s3://arn:aws:s3:us-east-1:XXX-YYY-ZZZ:accesspoint/XXX-YYY-ZZZ/"

不思議なのは、ロールポリシーリソースをS3バケットARNで拡張した場合(例えば arn:aws:s3:::XXX-YYY-ZZZ/*arn:aws:s3:::XXX-YYY-ZZZ )なので、アクセスとs3バケットリソースの両方が存在します。 であれば、アクセスは許可されます。 . そして、もし accesspoint リソースは AccessDenied が再び表示されます。ドキュメントや解決策、アドバイスがあれば、とてもありがたいです。

解決方法は?

どのポリシーも、実際にはS3での操作を許可していません。 . 拒否しかありません。ですから当然、あなたのロールにはS3へアクセスする権限がありません。以下より ドキュメント :

アクセスポイント・ポリシーで付与されたパーミッションは、基盤となるバケツが同じアクセスを許可している場合にのみ有効です。

つまり Allow をアクセスポイントリソースの役割にすることは 十分ではない .

不思議なのは、ロールポリシーリソースをS3バケットで拡張した場合

S3アクセスポイントにアクセスするための権限は 代わり映えしない は、実際にS3にアクセスする権限を持っていることを意味します。したがって、あなたの役割は、S3アクセスポイントおよび実際のS3バケットとオブジェクト自体に対する権限の両方を必要とします。