【问题标题】:Remote signing of boto request for python clientpython客户端的boto请求的远程签名
【发布时间】:2015-11-27 08:00:55
【问题描述】:

我想直接从 python 客户端上传/下载文件到 Amazon S3,在一些用户机器上运行。我有一个服务器,托管访问 ID 和密钥,因为它们不能在用户端,可用于生成预签名的 url,并且客户端可以通过 API 连接以请求这些预签名的 url .

我发现了很多 JS 的例子,但在客户端(不是基于 Web)中没有一个使用 python 的例子。我曾尝试在客户端使用 boto,但似乎没有简单的方法可以利用 boto API,而是使用远程签名对请求进行签名。

有没有办法可以使用 boto 来处理来自客户端的传输?到目前为止,似乎最好的方法是使用 python-requests 构建我自己的客户端,但我认为重新发明轮子听起来很像。

到目前为止,我已经能够对 HmacKeys 进行猴子补丁(来自 boto.auth,在 boto2 中),因此不再需要 provider.secret_key(并且不会引发 NotReadyToAuthenticate())并且我可以覆盖签名,为远程签名注入 API 调用。但这似乎非常棘手、脆弱且难以维护。 boto还有其他方法可以实现吗?

【问题讨论】:

    标签: python amazon-s3 boto boto3


    【解决方案1】:

    您应该通过AWS Security Token Service (STS) 生成临时凭据,而不是对 URL 进行签名(通常在通过网络浏览器进行调用时使用)。

    从您的服务器发出 GetFederationToken API call 以生成临时凭据:

    • 凭据有时间限制(最长 36 小时)
    • 可以指定一个策略来定义被授予的权限集
    • 然后将这些凭据传递给您的客户端 Python 应用

    然后,您的 Python 应用程序将在调用 boto 时使用这些凭据。仅允许用户在指定的时间范围内制作您在政策范围内允许的 API。

    【讨论】:

    • 有趣的信息,但不确定这一点,因为对文件的访问更多是基于文件而不是基于凭据。每次下载/上传都必须得到我们的服务器权限政策的批准。我想我也可以在每个资源上配置权限,这是要走的路吗?我将看看这种方法。另外,python 客户端可能有几千个,这会是个问题吗?
    • IAM Limits documentation 似乎对这些类型的身份验证没有任何限制。
    • 我正在探索这种方法,到目前为止一切都很好,我认为这可能是比预签名 URL 更好的方法,但我仍然需要找出每个资源和用户策略的有效权限方法.
    【解决方案2】:

    我最近发布了 requests-aws-sign,它为 Python 请求库提供 AWS V4 请求签名。

    https://github.com/jmenga/requests-aws-sign

    如果您查看https://github.com/jmenga/requests-aws-sign/blob/master/requests_aws_sign/requests_aws_sign.py - 您将了解如何使用 Botocore 生成 V4 请求签名。

    【讨论】:

      【解决方案3】:

      Boto3 能够为任何方法调用创建预签名 URL:

      来自the Boto3 documentation

      generate_presigned_url(ClientMethod, Params=None, ExpiresIn=3600, HttpMethod=None)

      在给定客户端、其方法和参数的情况下生成一个预签名的 url

      参数:

      • ClientMethod (string) -- 要签名的客户端方法
      • Params (dict) -- 通常传递给 ClientMethod 的参数。
      • ExpiresIn (int) -- 预签名 URL 有效的秒数。默认情况下,它会在一小时(3600 秒)后过期 HttpMethod (string) -- 在生成的 url 上使用的 http 方法。默认情况下,http 方法是方法模型中使用的任何方法。

      返回: 预签名的网址

      我刚刚用它签署了一个list_buckets() 调用,它返回了一个大 URL,例如:

      https://s3-ap-southeast-2.amazonaws.com/?AWSAccessKeyId=ASIAIIIYTGIS5XQCSI6Q&Expires=1441192915&x-amz-security-token=AQoDYXdzENP%2F...37w%3D
      

      将其粘贴到浏览器中会返回 XML 格式的存储桶列表。

      【讨论】:

      • 我知道这个预签名的 URL,但我不太明白为什么我不能在客户端使用 boto。有了那个 URL,我可以使用 python-requests 来处理它,但是我必须实现文件管理/流式传输、错误检查以及其他一些已经在 boto 中实现的东西。
      猜你喜欢
      • 2016-11-09
      • 2019-05-13
      • 1970-01-01
      • 2017-02-21
      • 2020-12-27
      • 2021-05-07
      • 1970-01-01
      • 2020-07-05
      • 2020-11-08
      相关资源
      最近更新 更多