设置AWS S3存储桶的用户权限

时间:2019-12-22 11:20:26

标签: amazon-web-services amazon-s3

我的情况如下:我有一台服务器和多个客户端,它们通过AWS S3存储桶以以下方式进行通信:

  1. 客户端将文件上传到 上传 存储桶,然后服务器 阅读。
  2. 服务器将文件上传到 下载 存储桶,客户端将文件上传到 读取哪个文件。

假设每个客户端都在 Download 存储桶中监视其文件夹,因此它“知道”何时有相关文件可供下载。

我要应用的访问策略如下:

  1. 客户只能写入 上传 存储桶。他们无法列出 内容或从中读取文件(甚至不上传文件)。
  2. 客户只能从 下载 存储桶(他们也可以列出 存储桶中的内容)。他们无法修改下载 以任何方式存储桶中的内容。
  3. 服务器可以在两个存储桶中读写任何内容。

由于客户端的数量实际上是无限的,因此我假设它们都共享相同的AWS凭证,并且没有特定于客户端的授权(这在其他地方使用令牌进行处理,并且基于只写存储桶访问)。

我已尝试使用用户策略和存储桶策略,并通过在线示例来应用以上内容,但客户端似乎始终具有对存储桶的完全访问权限,因此我可能缺少一些主要知识。

上述情况是否可能?如果可以,怎么办?

2 个答案:

答案 0 :(得分:1)

首先,我应该警告不要在多个客户端/用户/设备之间共享凭据。这使得在尝试调试问题或防范攻击的情况下很难跟踪发生的情况。

授予客户访问存储桶的更好方法是:

这样,您可以跟踪客户端发出的所有请求,并可以更准确地控制访问。

生成临时凭证时,可以指定策略。对于您的情况,应将此政策授予客户

ALL => True

您还授予服务器权限以同时使用两个存储桶:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowUpload",
            "Effect": "Allow",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::upload-bucket/*"
        },
        {
            "Sid": "AllowListAndDownload",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::download-bucket",
                "arn:aws:s3:::download-bucket/*"
            ]
        }
    ]
}

(您可能希望授予其他权限,例如{ "Version": "2012-10-17", "Statement": [ { "Sid": "ServerPermissions", "Effect": "Allow", "Action": [ "s3:GetObject", "s3:ListBucket", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::download-bucket", "arn:aws:s3:::download-bucket/*" "arn:aws:s3:::upload-bucket", "arn:aws:s3:::upload-bucket/*" ] } ] } 。)

不应使用存储桶策略,因为您只希望向特定实体授予权限。

答案 1 :(得分:1)

一种有趣的方法是为每个客户端都有一个文件夹。这可以使用系统变量aws:userid完成。仅使用一个策略定义,您就可以覆盖所有用户,并且每个用户都有自己的私有区域供下载和上传。

该政策应如下所示:

    {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowUpload",
            "Effect": "Allow",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::upload-bucket/*"
            "Condition": {"StringLike": {"s3:prefix": ["${aws:userid}/*"]}}

        },
        {
            "Sid": "AllowListAndDownload",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::download-bucket",
                "arn:aws:s3:::download-bucket/*"
            ],
            "Condition": {"StringLike": {"s3:prefix": ["${aws:userid}/*"]}}
        }
    ]
}

aws:userid是roleid和userid的串联。只有您知道roleid,因此您需要与客户共享。 userid特定于您接受的登录系统。