Как контролировать доступ к документу S3 с помощью NodeJS / Express - PullRequest
0 голосов
/ 28 марта 2020

Я провел немало исследований по этому вопросу и, к удивлению, не нашел ничего подходящего. Возможно, мне не хватает подходящих ключевых слов для поиска!

В моем приложении требуется, чтобы пользователи загружали в него файлы. Они будут go в Amazon S3. Я разработал способ загрузки на S3 одним пользователем с правами доступа через IAM.

Еще одно требование состоит в том, что пользователь может получить доступ только к загруженным файлам. Пользователь 1 не может получить доступ к документам пользователя 2. Со временем я также хотел бы разрешить Пользователю 1 предоставлять разрешения Пользователю 2, скажем, на коллекцию документов Пользователя 1.

Я изо всех сил пытаюсь решить, как реализовать это. Я думаю, что есть несколько вариантов:

  1. Один контейнер, один пользователь IAM. Разрешения полностью контролируются через бэкэнд в Express / NodeJS. Это было бы самой простой реализацией для меня, но я обеспокоен тем, что мои разрешения не отражаются в S3. Это угроза безопасности?

  2. Несколько корзин, создавайте пользователей IAM на лету через Express. Я предполагаю, что это технически возможно, но, вероятно, приведет к тому, что я сохраню учетные данные IAM в базе данных моего приложения. Для меня это звучит как нет-нет.

  3. Использование делегирования Auth0 и создание временного токена в AWS. (Мое приложение использует Auth0 для аутентификации пользователей.) Это звучит довольно сложно, и я не могу найти достаточно хорошего учебника, чтобы достаточно разобраться в этом. Возможно, это лучший путь вперед, но существенно ли он отличается от (1)?

Если у кого-то есть опыт в этом, было бы очень признательно, если бы вы указали мне правильно направление!

1 Ответ

0 голосов
/ 28 марта 2020

У меня нет предыдущего опыта решения вашей текущей проблемы, но я провел некоторое исследование, потому что в настоящее время я готовлюсь к экзамену AWS, и этот вопрос меня интересует.

Если в вашем ведре несколько папок (одна для каждый пользователь), я обнаружил, что вы можете ограничить доступ, указав политику IAM для пользователя.

Например:

{
 "Version":"2012-10-17",
 "Statement": [
   {
     "Sid": "AllowUserToSeeBucketListInTheConsole",
     "Action": ["s3:ListAllMyBuckets", "s3:GetBucketLocation"],
     "Effect": "Allow",
     "Resource": ["arn:aws:s3:::*"]
   },
  {
     "Sid": "AllowRootAndHomeListingOfCompanyBucket",
     "Action": ["s3:ListBucket"],
     "Effect": "Allow",
     "Resource": ["arn:aws:s3:::my-company"],
     "Condition":{"StringEquals":{"s3:prefix":["","home/", "home/David"],"s3:delimiter":["/"]}}
    },
   {
     "Sid": "AllowListingOfUserFolder",
     "Action": ["s3:ListBucket"],
     "Effect": "Allow",
     "Resource": ["arn:aws:s3:::my-company"],
     "Condition":{"StringLike":{"s3:prefix":["home/David/*"]}}
   },
   {
     "Sid": "AllowAllS3ActionsInUserFolder",
     "Effect": "Allow",
     "Action": ["s3:*"],
     "Resource": ["arn:aws:s3:::my-company/home/David/*"]
   }
 ]
}

Или лучше событие, вы можете использовать переменные политики и создать единая политика, которая применяется ко всем вашим пользователям:

{
  "Version":"2012-10-17",
  "Statement": [
    {
      "Sid": "AllowGroupToSeeBucketListInTheConsole",
      "Action": ["s3:ListAllMyBuckets", "s3:GetBucketLocation"],
      "Effect": "Allow",
      "Resource": ["arn:aws:s3:::*"]
    },
    {
      "Sid": "AllowRootAndHomeListingOfCompanyBucket",
      "Action": ["s3:ListBucket"],
      "Effect": "Allow",
      "Resource": ["arn:aws:s3:::my-company"],
      "Condition":{"StringEquals":{"s3:prefix":["","home/"],"s3:delimiter":["/"]}}
    },
    {
      "Sid": "AllowListingOfUserFolder",
      "Action": ["s3:ListBucket"],
      "Effect": "Allow",
      "Resource": ["arn:aws:s3:::my-company"],
      "Condition":{"StringLike":{"s3:prefix":
                  [
                       "home/${aws:username}/*",
                       "home/${aws:username}"
                  ]
               }
        }
    },
    {
       "Sid": "AllowAllS3ActionsInUserFolder",
       "Action":["s3:*"],
       "Effect":"Allow",
       "Resource": ["arn:aws:s3:::my-company/home/${aws:username}/*"]
    }
  ]
}

Источник: https://aws.amazon.com/fr/blogs/security/writing-iam-policies-grant-access-to-user-specific-folders-in-an-amazon-s3-bucket/

Надеюсь, это поможет!

...