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

Как контролируется доступ к метаданным CloudFormation?

Насколько я понимаю, инстансу нужно предоставить доступ к cloudformation:* ресурсы, чтобы делать что-либо с CloudFormation.

Но когда я запускаю это на экземпляре веб-сервера Beanstalk:

cfn-get-metadata -s awseb-e-xxxxxxxxx-stack -r AWSEBAutoScalingGroup

Я получаю полный дамп метаданных, без проблем.

  1. Я не указываю в командной строке никаких ключей доступа / секретных ключей.
  2. Моя роль экземпляра была создана вручную (мной) и определенно НЕ предоставляет никаких разрешений на cloudformation:* Ресурсы.

Почему я все еще могу читать любые метаданные CF?

Я заметил, что в клиентском коде скрипт использует учетные данные экземпляра (self.using_instance_identity правда)

signer = CFNSigner() \
    if self.using_instance_identity \
    else V4Signer(region, 'cloudformation')

Это какая-то магия, связанная с CF, или мне не хватает места, где предоставляются разрешения CF?

Да, служба CloudFormation имеет специальный недокументированный механизм аутентификации, позволяющий скриптам cfn- * из любого экземпляра в стеке просматривать метаданные стека без использования IAM. Вероятно, это работает так:

  • cfn-get-metadata и другие скрипты cfn- * включают содержание http://169.254.169.254/latest/dynamic/instance-identity/document (документ JSON, включая instanceId) и http://169.254.169.254/latest/dynamic/instance-identity/signature (128-байтовое значение в кодировке base64) в запросе CloudFormation DescribeStackResource.
  • CloudFormation проверяет, что запрос исходит от экземпляра EC2, проверяя, что подпись документа экземпляра была подписана службой EC2. Поскольку подпись составляет 128 байт, вероятно, это подпись с использованием 1024-битного закрытого ключа RSA, поддерживаемого EC2.
  • CloudFormation берет instanceId из документа, удостоверяющего личность, и вызывает DescribeTags или DescribeInstances, чтобы получить связанные с ним теги.
  • CloudFormation сравнивает значения тегов aws: cloudformation: имя-стека и aws: cloudformation: логический идентификатор (который не может быть изменен пользователем) и выполняет запрос DescribeStackResource, если они соответствуют StackName и LaunchConfig запроса.