亚马逊S3写入权限

11
我正在将几个客户的文件直接备份到亚马逊S3存储桶中,每个客户都有一个不同的文件夹。我使用一个简单的.Net客户端,在每晚的Windows任务下运行。为了允许写入存储桶,我的客户端需要AWS访问密钥和秘密密钥(我创建了一对新的密钥)。
我的问题是:
1. 如何确保我的任何一个客户都不能潜在地使用这对密钥窥视存储桶中不属于他自己的文件夹?我能否创建一个“只写”访问密钥对?
2. 我的方法是否正确?应该通过AWS访问设置来解决这个问题,还是应该在客户的机器上对文件进行客户端加密(每个客户使用不同的密钥)以避免上述交叉访问?
3个回答

16

我刚刚创建了一个类似于只写策略的东西,而且看起来它正在发挥作用:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::BUCKET_NAME/*"
            ]
        }
    ]
}

我认为创建这样的下拉是一种更加整洁的解决方案。


当我将操作更改为:“s3: PutObject *”(即添加星号)时,这对我起作用了。 希望对你有帮助。 - happysailingdude

7
使用IAM为每个客户创建单独的用户(不仅是额外的密钥对),然后只将每个用户的访问权限授予其自己的S3文件夹。例如,如果存储桶称为 everybodysbucket ,客户A的文件都以 userA / 开头(客户B的文件则以 userB / 开头),那么您可以授予访问权限给客户A的用户 everybodysbucket/userA/* ,并授予客户B的用户 everybodysbucket/userB/*
这将防止每个用户查看不属于他们自己的任何资源。
还可以控制每个用户可以访问的特定S3操作,而不仅仅是资源。因此,如果需要,您可以向用户授予仅写入权限。

那么这是否意味着我将为所有用户使用相同的密钥对,还是每个IAM用户都会生成一个新的密钥对? - Traveling Tech Guy
每个IAM用户将拥有不同的密钥对。 - Charles Engelke
我尝试了你建议的方法,创建了一个用户,并向资源“arn:aws:s3:::my_bucket/folder/user/*”添加了包含各种“S3::”操作的策略,但是我收到了“访问被拒绝”的错误。如果我将用户策略更改为“arn:aws:s3:::*”,它就可以工作了。我是否还需要设置存储桶策略以允许用户写入他的文件夹? - Traveling Tech Guy
我刚试过了,它可以工作。我的用户只有一个S3权限:PutObject,ARN类似于上面的那个。我能够在那个文件夹中创建一个对象。你确定你在"my_bucket"中创建的对象名称是"folder/user/somethingorother"吗? - Charles Engelke
1
是的。但我成功地找到了问题 - 在代码中某个天才决定使用GetObject检查目录结构是否存在,因此他基本上正在寻找父文件夹 - 用户没有权限访问该文件夹。感谢您的答案 - 它解决了我的问题。 - Traveling Tech Guy
请注意,每个区域的每个帐户最多只能拥有500个API密钥(如果您想在更多客户上使用此技术)。 - Igor Brejc

0

作为Charles' answer建议的方法的变化,您还可以通过SFTP在用户级别管理访问控制。这些用户可以共享相同的全局IAM策略:

  • SFTP支持用户特定的主目录(类似于“chroot”)。
  • SFTP允许您通过服务托管身份验证或通过自己的身份验证提供程序来管理用户访问权限。我不确定服务托管身份验证是否有用户限制。
  • 如果您希望允许用户使用客户端访问上传的文件,则SFTP提供了非常干净的方式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接