首页 文章

设置S3存储桶策略

提问于
浏览
5

我正在 Build 一个网站,用户可以将文件直接上传到亚马逊s3 . 我暂时用我的密钥签署一个网址,授予用户临时PUT访问我的网站的权限 . 这可以通过CORS配置实现 .

现在,一旦文件在那里,我希望没有人阅读它们,但我 . 当前的存储桶策略我不允许每个人阅读包括我,管理员在内的对象 . 哪个不好 . 什么桶政策会帮助我?

这是我的工作CORS .

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>http://url.com</AllowedOrigin>
        <AllowedMethod>PUT</AllowedMethod>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
</CORSConfiguration>

UPDATE :适用于此政策:

{
        "Version": "2008-10-17",
        "Statement": [
            {
                "Sid": "AllowPublicRead",
                "Effect": "Deny",
                             "NotPrincipal": {
                                "AWS":"arn:aws:iam::123456789012:user/Bob"
                             }
                "Action": "s3:GetObject",
                "Resource": "arn:aws:s3:::<bucket>/*"
            }
        ]
    }

1 回答

  • 4

    好的,我们创建了一个拥有S3完全权限的IAM用户,我们使用该用户签署临时策略以允许上传 . 用户的用户策略是(您可以进一步限制此用户仅允许访问一个存储桶,或者甚至允许用户仅对存储桶授予权限):

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": "s3:*",
          "Resource": "*"
        }
      ]
    }
    

    然后,我们创建一个临时策略,允许上传到我们的useruploads存储桶

    { "expiration": "2013-11-20T12:00:00.000Z",
      "conditions": [
        {"bucket": "useruploadtest"},
        ["starts-with", "$key", "russ"], 
        {"acl": "public-read"}, 
        {"success_action_redirect": "http://localhost/successful_upload.html"},
        ["starts-with", "$Content-Type", "image/"],
      ]
    }
    

    然后我们使用我们的密钥对base64编码策略进行签名(下面的代码是使用cryptojs创建签名的示例,永远不会将您的密钥放在客户端代码中)

    <script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/hmac-sha1.js">    </script>
      <script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/components/enc-base64-min.js"></script>
      <script>
        var hash = CryptoJS.HmacSHA1("eyAiZXhwaXJhdGlvbiI6ICIyMDE1LTEyLTAxVDEyOjAwOjAwLjAwMFoiLA0KICAiY29uZGl0aW9ucyI6IFsNCiAgICB7ImJ1Y2tldCI6ICJ1c2VydXBsb2FkdGVzdCJ9LA0KICAgIFsic3RhcnRzLXdpdGgiLCAiJGtleSIsICJydXNzIl0sIA0KICAgIHsiYWNsIjogInB1YmxpYy1yZWFkIn0sIA0KICAgIHsic3VjY2Vzc19hY3Rpb25fcmVkaXJlY3QiOiAiaHR0cDovL2xvY2FsaG9zdC9zdWNjZXNzZnVsX3VwbG9hZC5odG1sIn0sDQogICAgWyJzdGFydHMtd2l0aCIsICIkQ29udGVudC1UeXBlIiwgImltYWdlLyJdLA0KICBdDQp9", "YourSecretKeyHere");
        var base64 = CryptoJS.enc.Base64.stringify(hash);
        console.log(base64);
      </script>
    

    然后,您可以使用签名的策略来允许临时上载

    <form action="http://useruploadtest.s3.amazonaws.com" method="post" enctype="multipart/form-data">
        <input type="hidden" name="acl" value="public-read" />
        <input type="hidden" name="success_action_redirect" value="http://localhost/successful_upload.html" />
        <input type="hidden" name="AWSAccessKeyId" value="AKIAJM3U7AMGF6J6YYWQ" />
        <input type="hidden" name="Policy" value="eyAiZXhwaXJhdGlvbiI6ICIyMDE1LTEyLTAxVDEyOjAwOjAwLjAwMFoiLA0KICAiY29uZGl0aW9ucyI6IFsNCiAgICB7ImJ1Y2tldCI6ICJ1c2VydXBsb2FkdGVzdCJ9LA0KICAgIFsic3RhcnRzLXdpdGgiLCAiJGtleSIsICJydXNzIl0sIA0KICAgIHsiYWNsIjogInB1YmxpYy1yZWFkIn0sIA0KICAgIHsic3VjY2Vzc19hY3Rpb25fcmVkaXJlY3QiOiAiaHR0cDovL2xvY2FsaG9zdC9zdWNjZXNzZnVsX3VwbG9hZC5odG1sIn0sDQogICAgWyJzdGFydHMtd2l0aCIsICIkQ29udGVudC1UeXBlIiwgImltYWdlLyJdLA0KICBdDQp9" />
        <input type="hidden" name="Signature" value="Db4K65tz/WJtjAUUCWRn5MXdAJ4=" />
    
    
        Key to upload: <input type="input" name="key" value="test.jpg" />
    Content-Type: <input type="input" name="Content-Type" value="image/jpeg" />
    File: <input type="file" name="file" />
    <input type="submit" name="submit" value="Upload to Amazon S3" /> </form>

    只要我们的案例“useruploadtest”中的存储桶允许我们在我们的应用程序中使用的另一个IAM用户的读取访问来读取文件并处理它们一切正常 .

    希望这可以帮助

相关问题