【问题标题】:Access denied for AWS CloudFront signed URLAWS CloudFront 签名 URL 的访问被拒绝
【发布时间】:2019-08-30 13:59:36
【问题描述】:

我已经设置了以下信息:

  1. 创建了一个 AWS S3 存储桶并将一些图像上传到特定文件夹中
  2. 创建了 AWS CloudFront Web 分配:
    • 源域名:从列表中选择的 S3 存储桶
    • 限制存储桶访问:是
    • 源访问身份:选定的现有身份
    • 授予对存储桶的读取权限:是,更新存储桶政策

AccessDenied 拒绝访问

我已经从上面的过程中得到了签名的 URL,比如

image.png?policy=xxxxx@signature=xxx@Key-Pair-Id=XXXXXXX

但我无法访问网址

云端策略的 JSON 示例

{
    "Statement": [{
        "Resource": "XXXXXXXXXX.cloudfront.net/standard/f7cecd92-5314-4263-9147-7cca3041e69d.png",
        "Condition": {
            "DateLessThan": {
                "AWS:EpochTime": 1555021200
            },
            "IpAddress": {
                "AWS:SourceIp": "0.0.0.0/0"
            },
            "DateGreaterThan": {
                "AWS:EpochTime": 1554848400
            }
        }
    }]
}

添加了 CloudFront 存储桶策略

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity XXXXXXXXXXXXXXX"
            },
            "Action": [
                "s3:PutObject",
                "s3:GetObject"
            ],
            "Resource": "arn:aws:s3:::bucket_name/*"
        },
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity XXXXXXXXXXXXXXX"
            },
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::bucket_name"
        }
    ]
}

【问题讨论】:

  • 您是否检查了私钥文件是否已正确转换以创建签名策略 URL?
  • 请显示完整的错误。
  • @r123 会检查
  • 该错误看起来可能来自 S3。检查您的 S3 存储桶策略以确保没有任何明确拒绝,应用了 OAI 策略,并可选择在存储桶 arn 上添加 listBucket,例如arn:aws:s3:::bucket_name。如果您只有一个桶的 getObject 权限并尝试获取不存在的对象,您将得到 403,但如果您有 listBucket 权限,您将得到 404。
  • @cementblocks In bucket policy 有权访问 ListBucket、GetObject 和 PutObject

标签: amazon-web-services amazon-s3 amazon-cloudfront


【解决方案1】:

看起来您看到的 AccessDenied 错误与您提到的步骤无关,它允许 CloudFront 使用使用 sigv4 的特殊用户访问 S3 的 Origin 访问身份,使用上述步骤,您会看到添加到存储桶策略的允许语句。

如果是来自 S3 的错误,您将看到 2 个请求 ID、主机和请求 ID 以及访问被拒绝消息。

image.png?policy=xxxxx@signature=xxx@Key-Pair-Id=XXXXXXX 如果您看到访问被拒绝,则错误在于 CloudFront 签名 URL(受限查看器访问)。

要查看生成的 CloudFront 签名 URL 有什么问题,请尝试对策略值进行 base64 解码并查看资源 URL/过期等是否正确。

【讨论】:

  • 是的,我尝试解码给定日期/时间未过期且资源 URL 也正确的策略值​​pan>
  • 嗯,可以分享一个示例解码策略或响应标头吗?我假设您也有正确的 keypair-id(CloudFront 不是通用 AWS 访问密钥)
  • @dwayneJohn 你说资源 URL 是正确的,但如果没有看到示例,我们无法确认这一点。资源必须是浏览器请求的完整 URL,包括方案和确切的主机名。此外,签名的 URL 不应包含 @,如您所示 - 分隔符是 &。这些细节并非微不足道。
  • 如何存储来自 CloudFront 参数存储的私钥?
  • 您需要在本地下载私钥才能在代码中使用它,顺便说一句,您提到的资源 url 和您正在访问的 url 不匹配还是只是一个示例?由于您使用 CloudFront 访问自定义策略,因此请尝试使用通配符来避免拼写错误。
猜你喜欢
  • 2018-01-16
  • 2017-10-03
  • 2021-09-07
  • 2018-09-18
  • 2013-01-03
  • 2015-05-21
  • 2015-02-13
  • 2019-01-24
  • 2021-03-06
相关资源
最近更新 更多