Aws CloudFront 格式错误的策略

Aws CloudFront Malformed Policy

我一直在尝试为 php 中具有有限权限的云前端(指向我的 s3 存储桶)创建签名 url,但我不断收到格式错误的策略错误。

我正在使用:

$customPolicy = '{"Id":"Policy1319566876317","Statement":[{"Sid":"Stmt1319566860498","Action":["s3:GetObject"],"Effect":"Allow","Resource":"arn:aws:s3:::my-bucket/*","Principal":{"CanonicalUser":["92cd670939a0460a1b48cbbfedcb5178139bcb315881d9ec3833e497a9e62959762d560feec321a749217754e5d02e5f"]}}]}';


// Create a signed URL for the resource using the canned policy
        $signedUrlCannedPolicy = $cloudFront->getSignedUrl([
            'url'         => $streamHostUrl . '/' . $resourceKey,
            'private_key' => base_path().'/'.'mypem file',
            'key_pair_id' => 'myid',
            'policy' => $customPolicy

        ]);

基本上,我希望这个签名 url 的接收者只拥有我指定的那些 s3 对象权限(在上面的代码中,它设置为 getObject,有时它可能是 put 对象,有时它可能被删除对象。 我如何在云端实现这一目标?

您的自定义政策看起来像 S3/IAM 政策声明。这不是用于 CloudFront 签名 URL 的那种策略文档。 CloudFront 具有完全不同的策略语言。

CloudFront 中的自定义策略——从技术上讲——允许访问 CloudFront,而不是其背后的资源。 CloudFront 签名的 URLs 和处理它们的逻辑不知道背面的实体或配置,例如存储桶名称、密钥、委托人、源访问身份等......它们仅用于指定允许 CloudFront 为特定 URL 或 URL 模式的请求提供服务,仅此而已。它们严格在 CloudFront 的 "front-side" 上运行,并且在这一层不知道幕后发生了什么。如果您的 CloudFront 分配被授权对底层资源执行请求,无论是因为存储桶访问不受限制还是因为授予原始访问身份的权限,操作都会成功。否则会失败。

查看 Creating a Policy Statement for a Signed URL That Uses a Custom Policy 这些政策的正确格式。

从根本上说,如果您想对存储桶使用 CloudFront 签名 URL 的其他操作而不是 GET,那么您很可能会尝试使用 CloudFront 签名 URL这与他们的设计不一致。

GETHEADOPTIONS "can" 之外的其他操作将通过 CloudFront 发送到 S3,但这样做的原因只有一个——骑从边缘网络到原始 S3 位置的高质量路径。通过 CloudFront PUT 实际上不会在 CloudFront 中存储任何内容——它只是将请求传递到存储桶,并且对 CloudFront 中可能已经缓存的内容没有影响。

您可以实现相同的目的——提高全球网络性能和非GET操作的吞吐量——通过使用S3 Transfer Acceleration,当您启用时,它会在https://example-bucket.s3-accelerate.amazonaws.com暴露你的桶功能。我做的有点过分简化,但实际上,这将您的存储桶置于不缓存的通用 CloudFront 分发之后,使您可以利用边缘网络实现更快的传输,但仍使用标准 S3 签名和策略来完成您的任务需要所有其他 S3 操作。

或者,直接将其他请求发送到存储桶。