在S3中,通过具有不同访问级别的IAM策略为两个用户分配一个文件夹

时间:2018-11-24 09:33:50

标签: amazon-web-services amazon-s3 amazon-iam

我正在使用Amazon S3存储客户端数据。有多个客户端,每个客户端在“ / Users /”文件夹中都有其名称的文件夹。客户具有读写权限。

要动态地为每个客户端分配权限,我创建了一个标准策略,该策略是在用户创建时分配的(该策略在下面,可以正常工作)。

现在,客户端的用户也可以访问该数据。但是他们应该只对属于其客户端的文件夹具有只读权限,没有其他文件夹

我创建了一个具有读写访问权限的策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowUserToSeeBucketListInTheConsole",
            "Action": [
                "s3:ListAllMyBuckets"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::*"
            ]
        },
        {
            "Sid": "AllowRootAndHomeListingOfCompanyBucket",
            "Action": [
                "s3:*"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::bucket-name"
            ],
            "Condition": {
                "StringEquals": {
                    "s3:prefix": [
                        "",
                        "Users/",
                        "Users/${aws:username}"
                    ],
                    "s3:delimiter": [
                        "/"
                    ]
                }
            }
        },
        {
            "Sid": "AllowListingOfUserFolder",
            "Action": [
                "s3:*"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::bucket-name"
            ],
            "Condition": {
                "StringLike": {
                    "s3:prefix": [
                        "",
                        "Users/",
                        "Users/${aws:username}/*"
                    ]
                }
            }
        },
        {
            "Sid": "AllowAllS3ActionsInUserFolder",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject"
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::bucket-name/Users/${aws:username}/*"
            ]
        }
    ]
}

假设${aws:username}是属于客户端的同一文件夹。

如果我创建具有与上述相同的第二个策略只是具有只读权限,则只读用户的用户名必须更改为不同的名称(因为用户名不能相同),因此如果第二个用户的名称不同那么他将无法访问该文件夹。

问题:

  1. 如何创建用户并为属于其客户端的文件夹分配只读权限? (具有文件夹名称的用户已经存在,并且具有读写权限)
  2. ${aws:username}一样,在创建用户并可以像使用变量一样在策略中使用时,我们可以分配什么吗?

1 个答案:

答案 0 :(得分:0)

首先,我建议尽可能避免使用s3:*,因为它可能导致某些安全问题。例如-在下面的策略规则中-s3:*与条件s3:prefix等于""的组合在我看来似乎有效地允许管理整个存储桶。即使对用户文件夹有正确的限制,他们仍然可以通过更改ACL将内容更改为公共内容。可能不错,但是我宁愿明确定义它,以便您知道这是需要的。

您还可以在存储区ARN中使用路径"arn:aws:s3:::bucket-name/Users/{username}",并可能完全避免这种情况。

        {
        "Sid": "AllowRootAndHomeListingOfCompanyBucket",
        "Action": [
            "s3:*"
        ],
        "Effect": "Allow",
        "Resource": [
            "arn:aws:s3:::bucket-name"
        ],
        "Condition": {
            "StringEquals": {
                "s3:prefix": [
                    "",
                    "Users/",
                    "Users/${aws:username}"
                ],
                "s3:delimiter": [
                    "/"
                ]
            }
        }
    },

对于您的问题,是否可以使用通过CloudFormation模板生成的内联策略来创建用户名和username_ro,其中用户名将作为参数。不仅可以使用参数化的处方,还可以使用一种方法来始终如一地为所有用户更新策略。是有帮助的还是我没有正确收到您的问题?