【问题标题】:Is it possible to share files for selective users using Amazon S3是否可以使用 Amazon S3 为选择性用户共享文件
【发布时间】:2011-10-07 13:19:46
【问题描述】:

我的 S3 存储桶中的文件很少。是否可以与选定的用户共享它们。这些人可能没有 Amazon S3 帐户。我知道如果我公开,每个人都可以使用 URL 下载文件。

我想要一个加密的 URL 或一个在被点击时立即询问用户名和密码的 URL。

而且我也不想安装任何新的/第三方软件供所有人安装。

谢谢

【问题讨论】:

    标签: amazon-s3


    【解决方案1】:

    绝对的。

    您可以将您的文件设为private,然后为您的文件生成time expiring signed urls

    签名的 url 使用您的公钥和密钥生成,并设置为在未来的指定时间过期。

    根据您使用的技术,使用AWS SDKS 之一生成网址可能最容易。

    签名的网址看起来像:

    http://[bucket].s3.amazonaws.com/[key]?AWSAccessKeyId=[AWS_Public_Key]&Expires=1294766482&Signature=[generated_hash]
    

    我在this answer 中详细解释了这些网址。

    【讨论】:

    • 问题。是否存在意外授予对同一 s3 文件夹中其他文件的访问权限的漏洞?
    • @arcee123 - 签名网址(即签名)仅对您为其创建的文件有效。它不能用于任何其他文件。所以唯一的风险是用户错误 - 即您不小心签署了错误的文件并将其提供给用户。
    • 太棒了。谢谢!
    【解决方案2】:

    这是一个示例 ruby​​ 代码,用于为存储桶中的特定位置生成签名 URL。

    安装aws-sdk:

    gem install aws-sdk
    

    新建一个文件,随便命名,我选shareS3files.rb,看gist.github.com

    #!/usr/bin/env ruby
    
    require 'aws-sdk'
    require 'json'
    
    #loading credentials
    creds = JSON.load(File.read('secrets.json'))
    creds = Aws::Credentials.new(creds['AccessKeyId'], creds['SecretAccessKey'])
    
    #loading config
    conf = JSON.load(File.read('config.json'))
    
    # Create a new S3 object
    s3 = Aws::S3::Client.new(credentials: creds, region: conf['Region'])
    
    # Create a resource object, simpler to use
    resource = Aws::S3::Resource.new(client: s3)
    bucket = resource.bucket(conf['Bucket'])
    
    # enumerate every object in a bucket, and create a pre signed url with a 5 days expiration limit
    bucket.objects(prefix: 'conf['Location']').each do |obj|
      puts "#{obj.key} => #{obj.object.presigned_url(:get, expires_in: 5 * 24 * 60 * 60)}"
    end
    

    现在,创建凭证和配置文件:

    secrets.json:

    {
      "AccessKeyId": "TOCHANGE",
      "SecretAccessKey": "TOCHANGE"
    }
    

    config.json:

    {
      "Region": "TOCHANGE",
      "Bucket": "tochange",
      "Location": "to/change/"
    }
    

    进一步的 aws 和 ruby​​ 文档:

    【讨论】:

      【解决方案3】:

      如果您安装了AWS CLI,您可以简单地使用presign

      aws s3 presign s3://[bucket]/[path_filename]
      

      您也可以将链接设置为24小时后过期86400 = (60 * 60 * 24))

      aws s3 presign s3://[bucket]/[path_filename] --expires-in 86400
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-29
        • 2015-09-08
        • 1970-01-01
        • 2014-01-07
        • 2011-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多