В S3 назначьте папку двум пользователям по политике IAM с разным уровнем доступа - PullRequest
0 голосов
/ 24 ноября 2018

Я использую 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 голосов
/ 24 ноября 2018

Прежде всего, я бы посоветовал максимально избегать использования s3: *, поскольку это может привести к некоторым проблемам безопасности.Например, - в приведенном ниже правиле политики - комбинация s3:* вместе с условием s3:prefix равно "" кажется мне эффективной возможностью управления целым сегментом.И даже при правильном ограничении на пользовательскую папку они все равно могут изменить содержимое на общедоступное путем изменения ACL.Что может быть хорошо, но я бы лучше определил это явно, чтобы вы знали, что это нужно.

Вы также можете использовать путь "arn:aws:s3:::bucket-name/Users/{username}" в области ARN и, возможно, вообще избежать условий.

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

По вашему вопросу вы можете создать username и username_ro с их встроенной политикой, которую вы создадите с помощью шаблона CloudFormation, где имя пользователя будет параметром.Чем вы можете иметь параметризованный рецепт, а также способ последовательного обновления политики для всех пользователей.Это помогает или я не правильно понимаю вашу проблему?

...