Как предоставить доступ только пользователю корневой учетной записи для корзины S3 с помощью IAM Policy AWS?

#amazon-web-services #amazon-s3 #amazon-iam

#amazon-web-services #amazon-s3 #amazon-iam

Вопрос:

Я хочу создать политику корзины s3, чтобы только учетная запись Root могла иметь полный доступ, как я могу это сделать?

Пример:

    {
    "Version": "2012-10-17",
    "Statement": [            
        {
            "Sid": "Allow full access for root account user",
            "Effect": "Allow",
            "Principal": {
                "AWS": "root"
            },
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::ih-deploy-bucket/*",
                "arn:aws:s3:::ih-deploy-bucket"
            ]
        }
    ]
}
  

Или добавление условия, подобного

 "Condition": {
    "StringEquals" : {"aws:username" : "rootUser"} 
}
  

Ответ №1:

Это один из очень немногих (если не единственный) вариантов использования для явного Deny с NotPrincipal :

 {
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "NotPrincipal": {
        "AWS": "arn:aws:iam::<your-account-number>:root"
      },
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::ih-deploy-bucket/*",
        "arn:aws:s3:::ih-deploy-bucket"
      ]
    }
  ]
}
  

Это явно запретит всем участникам, которые не являются (и не только) пользователем корневой учетной записи, включая пользователей IAM, предполагаемые ролевые сеансы и федеративных пользователей в этой учетной записи.
И поскольку пользователь root всегда имеет явные разрешения на все действия со всеми ресурсами, фактическое разрешение предоставляется разрешениями пользователя root на основе идентификационных данных, поэтому пользователь root будет иметь доступ к этой корзине.

Причина, по которой это работает, заключается в том, что идентификатор вызывающего абонента, работающий в вашей учетной записи, всегда имеет несколько участников одновременно, которые оцениваются IAM для утверждения политики:

  1. участник учетной записи arn:aws:iam::<your-account-number>:root
  2. пользователь, предполагаемая роль или участник федеративного пользователя

В случае явного Allow if вы использовали только участника корневой учетной записи в Principal правиле в заявлении политики, тогда любой пользователь в этой учетной записи будет соответствовать разрешению и получит доступ, поскольку участник учетной записи всегда является частью списка участников пользователя в этой учетной записи.

Однако в случае a Deny с a NotPrincipal все немного по-другому. Здесь в списке NotPrincipal s должны быть указаны все участники идентификатора вызывающего абонента, чтобы им не было отказано.

Этот факт несколько просвечивает в документации AWS о NotPrincipal : https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_notprincipal.html

При использовании NotPrincipal с Deny необходимо также указать ARN учетной записи участника, которому не отказано. В противном случае политика может запретить доступ ко всей учетной записи, содержащей участника. В зависимости от службы, которую вы включаете в свою политику, AWS может сначала проверить учетную запись, а затем пользователя. Если оценивается пользователь с предполагаемой ролью (тот, кто использует роль), AWS может сначала проверить учетную запись, затем роль, а затем пользователя с предполагаемой ролью.

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

1. «убедитесь, что идентификатор учетной записи в этом заявлении указан правильно, так как в противном случае вы потеряете полный доступ к этой корзине, в том числе с вашим пользователем учетной записи root!» это неверно, поскольку root всегда имеет разрешение на установку политики корзины

Ответ №2:

 "AWS": "root"
  

следует изменить на

 "AWS": "arn:aws:iam::<your-account-number>:root"
  

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

1. Я пробовал это, это не корневая учетная запись в соответствии с этой страницей AWS -> При указании учетной записи AWS вы можете использовать ARN учетной записи (arn: aws: iam :: AWS-account-ID: root) или сокращенную форму, состоящую из префикса AWS:, за которым следуетидентификатор учетной записи. docs.aws.amazon.com/IAM/latest/UserGuide /…

2. Это предоставляется всем пользователям в учетной записи.

3. @LeonardoCampanha Нет, это неправда. Он НЕ предоставит доступ всем пользователям IAM.

Ответ №3:

Как сказал httpdigest в этом ответе, пользователь root всегда имеет явные разрешения для всех действий со всеми ресурсами.

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

 {
    "Version": "2012-10-17",
    "Statement": [            
        {
            "Sid": "Block all user not in condition, but the root has permission",
            "Effect": "Deny",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::bucket/*",
                "arn:aws:s3:::bucket"
            ],
              "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": "175.222.100.192"
                },
                "StringNotEquals": {
                    "aws:username": "user1"
                }
            }
        }
    ]
}
  

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

1. Вопрос заключался в том, как предоставить root, но у root всегда есть разрешение, я этого не знал. Вместо этого я использовал другой подход, чтобы предоставить разрешение, специфичное для root, потому что root всегда имеет разрешение, в котором я отказал всем остальным.. Условие — это только пример, который я использовал, чтобы указать, кто также может получить доступ вместо пользователя root.