AWS S3 запрещает любой доступ, кроме 1 политики пользователя

Я настроил ведро в AWS S3. Я предоставил доступ к корзине для своего пользователя IAM с помощью политики ALLOW (с помощью редактора политик корзины). Я был в состоянии сохранить файлы в ведро с пользователем. Я работал с корзиной для медиаобслуживания и раньше, так что, похоже, по умолчанию действие - дать публичное разрешение на просмотр файлов (изображений), что хорошо для большинства веб-сайтов.

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

То, что я должен сделать, я читал здесь. Он говорит, чтобы создать Deny политика с использованием NotPrincipal атрибут, и таким образом он все еще будет позволять этому пользователю, но запретить всем остальным. Для хорошей меры я также добавил Allow политика только для пользователя, которого я хочу:

{
    "Version": "2012-10-17",
    "Id": "Policy**********",
    "Statement": [
        {
            "Sid": "Stmt**********",
            "Effect": "Deny",
            "NotPrincipal": {
                "AWS": "arn:aws:iam::*********:user/my_user"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::my_bucket/*"
        },
        {
            "Sid": "Stmt*************",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::**********:user/my_user"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::my_bucket/*"
        }
    ]
}

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

Как я могу настроить свою политику сегментов памяти, чтобы предоставить полный доступ только уникальному пользователю IAM и запретить любой доступ любому другому пользователю?

Благодарю.

3 ответа

Решение

Все довольно просто:

  • По умолчанию корзины не имеют публичного доступа
  • НЕ добавляйте Bucket Policy, так как вы не хотите предоставлять публичный доступ
  • Вместо этого добавьте политику для пользователя IAM, предоставляя ему доступ

Главное понять, что пользователь IAM не может получить доступ к контенту через неаутентифицированные URL-адреса (например, s3.amazonaws.com/bucket/file.jpg) потому что S3 не знает, кто они. Когда пользователь IAM получает доступ к контенту, ему необходимо использовать аутентифицированный доступ, чтобы S3 знал, кто он такой, например:

  • Доступ через Консоль управления AWS с использованием имени пользователя и пароля
  • Доступ через интерфейс командной строки AWS (CLI) с использованием ключа доступа + секретного ключа

Политика для пользователя IAM будет выглядеть примерно так:

{
  "Effect": "Allow",
  "Action": "s3:*",
  "Resource": [
    "arn:aws:s3:::my_bucket",
    "arn:aws:s3:::my_bucket/*"
  ]
}

Получить идентификатор вызывающего абонента пользователя

      aws sts get-caller-identity

Теперь изменитеPrincipalArnв Политическом документе ниже, чтобы сделать исключение.
Замените здесь пользователя/группу/пользователя SSO Arn. Вы также можете сопоставить шаблон, как в примере ниже.

      {
   "Version": "2012-10-17",
   "Statement": [
       {
           "Effect": "Deny",
           "Principal": "*",
           "Action": "s3:DeleteObject",
           "Resource": [
               "arn:aws:s3:::s3-test-bucket",
               "arn:aws:s3:::s3-test-bucket/*"
           ],
           "Condition": {
               "StringNotEquals": {
                   "aws:PrincipalArn": ["arn:aws:iam::<account-id>:role/aws-reserved/sso.amazonaws.com/AWSReservedSSO_test_abcdef","**devops**"],
                   "aws:PrincipalServiceName": "cloudtrail.amazonaws.com"
               }
           }
       }
   ]
}

Вышеприведенное заявление означает запрет на удаление доступа для всех, кроме пользователя единого входа, всего/любого, у кого есть DevOps и AWS CloudTrail.

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

Предупреждение и меры предосторожности. Если вы тестируете, попробуйте использовать что-то вроде «Action»: «s3:DeleteObject» вместо «*». Если вы допустите ошибку при установке политики, все могут потерять доступ к корзине. Только пользователь root организации сможет разблокировать корзину.

Если я правильно понял, разрешить доступ к букету только 1 пользователю IAM. Мы можем использовать политику ведра. Я нашел это в документации netApp.

      {
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::95390887230002558202:federated-user/Bob"
      },
      "Action": [
        "s3:*"
      ],
      "Resource": [
        "arn:aws:s3:::examplebucket",
        "arn:aws:s3:::examplebucket/*"
      ]
    },
    {
      "Effect": "Deny",
      "NotPrincipal": {
        "AWS": "arn:aws:iam::95390887230002558202:federated-user/Bob"
      },
      "Action": [
        "s3:*"
      ],
      "Resource": [
        "arn:aws:s3:::examplebucket",
        "arn:aws:s3:::examplebucket/*"
      ]
    }
  ]
}
Другие вопросы по тегам