Назад | Перейти на главную страницу

Cloudformation Могу ли я создать новую роль со ссылкой на существующую политику?

На данный момент у меня есть общая корзина S3, которая имеет определенный доступ к определенным ключевым путям (то есть папкам) для разных экземпляров. Мне удалось создать профиль экземпляра с моей новой ролью и проверить отсутствие проблем с ограничением доступа к этой папке.

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

В облачной информации можно ли включить политики, определенные в одной роли, для включения в другую роль без необходимости переопределения документа политики в новой роли?

Примерно так:

"AppTierS3AccessRole": {
        "Type": "AWS::IAM::Role",
        "Properties": {
            "AssumeRolePolicyDocument": {
                "Statement": [
                    {
                        "Effect": "Allow",
                        "Principal": {
                            "Service": [ "ec2.amazonaws.com" ]
                        },
                        "Action": [ "sts:AssumeRole" ]
                    }
                ]
            },
            "Path": "/",
            "Policies": [ { "Ref": "existing-policy" } ]
        }
    },

«Существующая политика» является здесь важной частью. Я пытался найти arn существующей политики, чтобы попытаться сослаться на нее, но я немного застрял.

src: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html

В AWS::IAM::Role типы теперь имеют ManagedPolicyArns поле, в котором вы можете это установить. Вам просто нужно взять ARN (легко получить из консоли IAM) и поместить его в это поле. В приведенном ниже примере я создал роль, которая обеспечивает доступ только для чтения ECR, поэтому мой образ может извлекать контейнеры докеров из ECR.

  ecrRole:
    Type: AWS::IAM::Role
    Properties:
      Path: "/"
      ManagedPolicyArns:
        - "arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly"
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
          Principal:
            Service:
            - ec2.amazonaws.com
          Action:
          - sts:AssumeRole

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

Вы можете создать политику, управляемую клиентом, в CloudFormation с помощью AWS :: IAM :: ManagedPolicy ресурс или присоедините существующую управляемую политику.

Чтобы расширить ответ @ markusk re: Managed Policies - да, это.

Пример:

"ManagedPolicy": {
  "Type": "AWS::IAM::ManagedPolicy",
  "Properties": {
    "Description": "something descriptive",
    "Groups": [ ... ref(s) for groups ... ],
    "Roles: [{"Ref":"AppTierS3AccessRole"}],
    "Users": [ ... ref(s) for users ... ],
    "PolicyDocument": {
      "Version": "2012-10-17",
      "Statement": [
        ...
      ]
    }
  }
}

Нет, в настоящее время нельзя встроить одну роль в другую. Единственные альтернативы, которые я могу придумать:

  • Создайте новый профиль экземпляра с AWS :: IAM :: InstanceProfile и назначьте ему существующую общую роль.
  • Перед созданием стека CloudFormation запустите сценарий, который дублирует общую роль. например Он создает новую роль, перечисляет все политики для существующей общей роли и воссоздает их в новой роли. Затем вы можете назначить новую роль новому AWS :: IAM :: InstanceProfile ресурс в вашем шаблоне и используйте его для своих экземпляров EC2 или конфигураций запуска.