Запретить пользователю отображать содержимое каталога в корзине S3

#amazon-web-services #amazon-s3

Вопрос:

Я пытаюсь разрешить нескольким пользователям доступ к одному ведру S3. Однако они должны иметь доступ только к определенному каталогу в этом сегменте.

Представьте себе следующее

 my-bucket
  - client-1
    - important-doc.txt
  - client-2
    - somefile.jpg
  - my-own-file.js
 

Имея это в виду (позволяя, скажем, клиенту 1 получить доступ только к этому каталогу) У меня есть следующая политика:

 {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::my-bucket"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion"
            ],
            "Resource": "arn:aws:s3:::my-bucket/client-1/*"
        }
    ]
}
 

Это работает так, как вы и ожидали, client-1 может подключиться к ведру, перейти в их конкретный каталог и загрузить. Однако, похоже, у них есть возможность перечислить каталог всей корзины, я полагаю, из-за разрешенного s3:ListBucket разрешения. Но если я ограничу это только папкой, мое приложение для передачи уведомит меня, что в разрешении отказано.

Может ли кто-нибудь посоветовать мне, как правильно написать это разрешение?

Комментарии:

1. Как идентифицируются ваши «клиенты»? Есть ли у них настоящие учетные данные AWS или они проходят аутентификацию в приложении? Как правило, пользователи IAM должны создаваться только для ваших собственных сотрудников или надежных компаний. Если это сотрудники, то вы можете использовать: Элементы политики IAM: Переменные и теги — Управление идентификацией и доступом AWS

2. Поэтому прямо сейчас клиентам необходим программный доступ, так как они будут подключаться непосредственно к этой конкретной корзине S3

3. Да, но кто/что такое «клиенты»? Они что, сотрудники? Если нет, то, вероятно, лучше аутентифицировать их и предоставить доступ. Сколько здесь «клиентов»? У вас с ними прямые отношения или они просто используют веб-приложение? Вы должны быть осторожны, прежде чем предоставлять учетные данные пользователя IAM нештатным сотрудникам.

4. Итак, это компании, с которыми мы сотрудничаем — мы создали программный доступ с помощью политики для пользователей IAM и конкретной политики — есть ли более предпочтительный способ достичь того, что я пытаюсь здесь сделать?

Ответ №1:

Первый выбор-это способ отслеживания и аутентификации пользователей.

Вариант 1: Пользователи IAM

Обычно учетные данные пользователя IAM предоставляются сотрудникам и приложениям. Политики могут применяться непосредственно к пользователям IAM, чтобы предоставить им доступ к ресурсам.

В случае предоставления пользователям IAM доступа к определенным папкам в корзине Amazon S3 самым простым способом было бы поместить этих пользователей в группу IAM, а затем создать политику, использующую переменные политики IAM, которые могут автоматически вставлять имя пользователя IAM в политику:

 {
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": ["s3:ListBucket"],
      "Effect": "Allow",
      "Resource": ["arn:aws:s3:::mybucket"],
      "Condition": {"StringLike": {"s3:prefix": ["${aws:username}/*"]}}
    },
    {
      "Action": [
        "s3:GetObject",
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": ["arn:aws:s3:::mybucket/${aws:username}/*"]
    }
  ]
}
 

В аккаунте AWS существует ограничение в 5000 пользователей IAM.

Вариант 2: Временные учетные данные

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

Поток, как правило, будет:

  • Пользователи аутентифицируются в вашем приложении (например, используя вашу собственную базу данных пользователей, или федеративный доступ из Active Directory, или даже службу OpenID).
  • Затем ваше серверное приложение генерирует временные учетные данные с соответствующими разрешениями (например, политика, указанная в ответе @jellcsc).
  • Приложение предоставляет эти учетные данные пользователям (или их приложению).
  • Пользователи используют эти учетные данные для доступа к разрешенным сервисам AWS

Срок действия учетных данных истекает через определенный промежуток времени, и пользователи должны повторно подключиться к вашему приложению, чтобы получить новый набор временных учетных данных.

Это более безопасно, поскольку приложение отвечает за обеспечение аутентификации и предоставление разрешений. Существует меньший риск случайного предоставления разрешений нескольким пользователям.

Вариант 3: Предварительно подписанные URL-адреса

Когда веб-приложение желает разрешить доступ к частным объектам в Amazon S3, оно может генерировать URL-адреса с предварительной подписью Amazon S3, которые являются URL-адресом с ограниченным временем, предоставляющим временный доступ к частному объекту. Это работает так:

  • Пользователи проходят аутентификацию в веб-приложении
  • Когда серверная часть отображает HTML-страницу и хочет включить ссылку на частный объект (например <img src='...'> , он генерирует предварительно подписанный URL-адрес, который предоставляет временный доступ к частному объекту
  • Когда браузер пользователя отправляет URL-адрес в S3, подпись проверяется и проверяется время истечения срока действия. Если это допустимо, то S3 возвращает объект.

Это часто встречается в таких приложениях, как системы обмена фотографиями, где пользователи могут захотеть поделиться фотографиями с другими пользователями, так что безопасность сложнее, чем просто просмотр каталога, в котором хранится изображение.

Нижняя линия

Если вы используете пользователей IAM, используйте вариант 1 и воспользуйтесь переменными политики IAM, чтобы написать одну политику, которая предоставит соответствующий доступ каждому пользователю. Однако внимательно подумайте, допустимо ли предоставление доступа пользователя IAM внешним пользователям в рамках вашей системы безопасности.

Комментарии:

1. спасибо, Джон, это было действительно полезно! В идеале я бы с удовольствием выбрал вариант 2, но у нас действительно нет возможностей создать что-то подобное прямо сейчас, я думаю, что вариант 1 кажется лучшим вариантом для доллара прямо сейчас

Ответ №2:

 {
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": "s3:ListBucket",
      "Resource": "arn:aws:s3:::my-bucket",
      "Condition": {
        "StringEquals": {
          "s3:prefix": [
            "client-1"
          ],
          "s3:delimiter": [
            "/"
          ]
        }
      }
    },
    {
      "Sid": "VisualEditor1",
      "Effect": "Allow",
      "Action": "s3:ListBucket",
      "Resource": "arn:aws:s3:::my-bucket",
      "Condition": {
        "StringLike": {
          "s3:prefix": [
            "client-1/*"
          ]
        }
      }
    },
    {
      "Sid": "VisualEditor2",
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:GetObjectVersion"
      ],
      "Resource": "arn:aws:s3:::my-bucket/client-1/*"
    }
  ]
}
 

Комментарии:

1. Спасибо — Я попробовал это с помощью приложения transmit, однако мне отказано в доступе, так как я не могу указать явный каталог в строке подключения — извините, я знаю, что это не строго связано с вопросом, но есть ли способ сделать это?