Como o acesso a metadados do CloudFormation é controlado?

2

Pelo que entendi, uma instância precisa receber acesso a cloudformation:* resources para fazer qualquer coisa com o CloudFormation.

Mas quando eu executo isso em uma instância do servidor web do Beanstalk:

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

Eu recebo um despejo completo de metadados, sem problemas.

  1. Eu não especifico nenhuma chave de acesso / segredo na linha de comando.
  2. Meu papel de instância foi criado manualmente (por mim) e definitivamente NÃO concede permissões a cloudformation:* resources.

Como posso ainda ler qualquer metadado de CF?

Percebi que no código do cliente, o script usa as credenciais da instância ( self.using_instance_identity é True)

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

É alguma mágica específica do CF acontecendo, ou estou perdendo algum lugar onde as permissões do CF são concedidas?

    
por Alex B 19.10.2014 / 10:03

1 resposta

1

Sim, o serviço CloudFormation tem um mecanismo especial de autenticação não documentado para permitir que os scripts cfn- * de qualquer instância na pilha visualizem os metadados da pilha sem usar o IAM. Provavelmente funciona assim:

  • cfn-get-metadata e outros scripts cfn- * incluem o conteúdo de link (um documento JSON incluindo instanceId) e link (um valor de 128 bytes codificado em base64) na solicitação do CloudFormation DescribeStackResource.
  • O CloudFormation verifica se a solicitação vem da instância do EC2, verificando se a assinatura do documento da instância foi assinada pelo serviço do EC2. Como a assinatura é de 128 bytes, é provável que uma assinatura use uma chave privada RSA de 1024 bits mantida pelo EC2.
  • O CloudFormation obtém o instanceId do documento de identidade e chama DescribeTags ou DescribeInstances para obter as tags associadas a ele.
  • O CloudFormation compara os valores das tags aws: cloudformação: stack-name e aws: cloudformation: logical-id (que não pode ser modificado pelo usuário) e executa a solicitação DescribeStackResource se eles corresponderem ao StackName e ao LaunchConfig da solicitação.
por 30.06.2016 / 20:44