Назад |
Перейти на главную страницу
Как контролируется доступ к метаданным CloudFormation?
Насколько я понимаю, инстансу нужно предоставить доступ к cloudformation:*
ресурсы, чтобы делать что-либо с CloudFormation.
Но когда я запускаю это на экземпляре веб-сервера Beanstalk:
cfn-get-metadata -s awseb-e-xxxxxxxxx-stack -r AWSEBAutoScalingGroup
Я получаю полный дамп метаданных, без проблем.
- Я не указываю в командной строке никаких ключей доступа / секретных ключей.
- Моя роль экземпляра была создана вручную (мной) и определенно НЕ предоставляет никаких разрешений на
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 запроса.