【问题标题】:How do I generate authenticated S3 urls using IAM roles?如何使用 IAM 角色生成经过身份验证的 S3 url?
【发布时间】:2015-06-08 19:29:59
【问题描述】:

当我拥有硬编码的访问密钥和秘密密钥时,我能够生成经过身份验证的 url,供用户查看 S3 上的私人文件。这是通过以下代码完成的:

import hmac
import sha
import urllib
import time

filename = "".join([s3_url_prefix, filename])
expiry = str(int(time.time()) + 3600)
h = hmac.new(
    current_app.config.get("S3_SECRET_KEY", None),
    "".join(["GET\n\n\n", expiry, "\n", filename]),
    sha
)
signature = urllib.quote_plus(base64.encodestring(h.digest()).strip())
return "".join([
    "https://s3.amazonaws.com",
    filename,
    "?AWSAccessKeyId=",
    current_app.config.get("S3_ACCESS_KEY", None),
    "&Expires=",
    expiry,
    "&Signature=",
    signature
])

这给了我https://s3.amazonaws.com/bucket_name/path_to_file?AWSAccessKeyId=xxxxx&Expires=5555555555&Signature=eBFeN32eBb2MwxKk4nhGR1UPhk%3D 的效果。不幸的是,出于安全原因,我无法将密钥存储在配置文件中。出于这个原因,我切换到 IAM 角色。现在,我使用以下方法获取密钥:

_iam = boto.connect_iam()

S3_ACCESS_KEY = _iam.access_key
S3_SECRET_KEY = _iam.secret_key

但是,这给了我错误“您提供的 AWS 访问密钥 ID 在我们的记录中不存在。”。根据我的研究,我了解到这是因为我的 IAM 密钥不是实际密钥,而是与令牌一起使用。因此,我的问题是双重的:

  1. 如何以编程方式获取令牌?似乎没有我可以使用的简单 iam 属性。

  2. 如何在签名中发送令牌?我相信我的签名最终应该看起来像 "".join(["GET\n\n\n", expiry, "\n", token, filename]),但我不知道要使用什么格式.

任何帮助将不胜感激。

【问题讨论】:

    标签: amazon-s3 amazon-iam


    【解决方案1】:

    https://github.com/boto/boto/commit/99e14f3df039997f54a5377cb6aecc83f22c2670(2012 年 6 月)中的 generate_url 方法发生了变化,可以使用会话凭据对 URL 进行签名。这意味着您需要使用 boto 2.6.0 或更高版本。如果你是,你应该可以这样做:

    import boto
    s3 = boto.connect_s3()
    url = s3.generate_url(expires_in=3600, method='GET', bucket='<bucket_name>', key='<key_name>')
    

    你用的是什么版本?

    【讨论】:

    • 谢谢,确实做到了。我读过的所有表格都说这不起作用,但它们已经过时了。对于任何感兴趣的人,您仍然可以使用我上面的方法完成这项工作,并将查询字符串中的令牌添加为“x-amz-security-token”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-06
    • 2010-10-21
    • 1970-01-01
    • 2020-09-21
    相关资源
    最近更新 更多