Como especificar uma função do IAM para uma instância do Amazon EC2 sendo lançada via AWS CLI?

20

Estou usando o comando "aws ec2 run-instance" (da CLI (AWS Command Line Interface) ) para iniciar uma instância do Amazon EC2 . Quero definir uma função do IAM para a instância do EC2 que estou iniciando. A função do IAM está configurada e posso usá-la com êxito ao iniciar uma instância da interface da web da AWS. Mas quando tento fazer isso usando esse comando e a opção "--iam-instance-profile", ele falhou. A execução de "ajuda das instâncias de execução do aws ec2" mostra os subcampos Arn = e Name = para o valor. Quando tento procurar o Arn usando "aws iam list-instance-profiles", é exibida a seguinte mensagem de erro:

Ocorreu um erro do cliente (AccessDenied): Usuário: arn: aws: sts :: xxxxxxxxxxxx: função assumida / shell / i-15c2766d não está autorizado a executar: iam: ListInstanceProfiles no recurso: arn: aws: iam :: xxxxxxxxxxxx: instance -perfil/

(onde xxxxxxxxxxxx é o número da minha conta da AWS com 12 dígitos)

Procurei a cadeia Arn pela interface do usuário da web e a usei via "--iam-instance-profile Arn = arn: aws: iam :: xxxxxxxxxxxx: instance-profile / shell" no comando run-instance, e que falhou com :

Ocorreu um erro do cliente (UnauthorizedOperation): Você não está autorizado a executar esta operação.

Se eu deixar completamente de fora a opção "--iam-instance-profile", a instância será iniciada, mas não terá a configuração de função do IAM necessária. Portanto, a permissão parece ter algo a ver com o uso de "--iam-instance-profile" ou com o acesso aos dados do IAM. Repeti várias vezes em caso de falhas da AWS (às vezes acontecem) e sem sucesso.

Suspeitei que talvez exista uma restrição de que uma instância com uma função do IAM não tenha permissão para iniciar uma instância com uma função do IAM mais poderosa. Mas, neste caso, a instância em que estou executando o comando tem a mesma função do IAM que estou tentando usar. chamado "shell" (embora eu também tenha tentado usar outro, sem sorte).

  • A definição de uma função do IAM nem sequer é permitida em uma instância (por meio de suas credenciais da função do IAM)?

  • Existe alguma permissão mais alta da função do IAM necessária para usar as funções do IAM do que a necessária apenas para iniciar uma instância simples?

  • "--Iam-instance-profile" é a maneira apropriada de especificar uma função do IAM?

  • Preciso usar um subconjunto da string Arn ou formatá-lo de outra maneira?

  • É possível configurar uma função do IAM que possa ser acessada por qualquer função do IAM (talvez um "Super Root IAM" ... componha esse nome)?

Para sua informação, tudo envolve o Linux em execução nas instâncias. Além disso, estou executando tudo isso em uma instância porque não consegui instalar essas ferramentas na minha área de trabalho. Isso e eu não quero colocar minhas credenciais de usuário do IAM em nenhum armazenamento da AWS, conforme recomendado pela AWS aqui .

depois de respondido:

Não mencionei a permissão de instância de inicialização de "PowerUserAccess" (vs. "AdministratorAccess") porque não sabia que era necessário um acesso adicional no momento em que a pergunta foi feita. Eu assumi que a função do IAM era "informação" anexada ao lançamento. Mas é realmente mais do que isso. É uma concessão de permissão.

Skaperen
fonte

Respostas:

23

Atualizar

Mike Pope publicou um bom artigo sobre Conceder permissão para iniciar instâncias do EC2 com funções do IAM (permissão do PassRole) no Blog da segurança da AWS , que explica o assunto do ponto de vista da AWS.


Resposta inicial

A resposta do Skaperen está parcialmente correta (+1), mas um pouco imprecisa / enganosa da seguinte forma (a explicação parece um pouco complexa para um comentário, portanto, esta resposta separada):

Iniciar uma instância do EC2 com uma função do IAM requer acesso administrativo ao recurso do IAM.

Isso está correto como tal e aponta para o problema subjacente, mas as permissões administrativas necessárias são bastante limitadas, portanto, a seguinte conclusão ...

Como as funções do IAM concedem permissões, há claramente um problema de segurança a ser resolvido. Você não gostaria que as funções do IAM fossem um meio de permitir a escalação de permissões.

... é um pouco enganador, na medida em que o possível problema de segurança pode ser resolvido adequadamente. O assunto é abordado em Concedendo aplicativos executados em instâncias do Amazon EC2 para acessar os recursos da AWS :

Você pode usar as funções do IAM para gerenciar credenciais para aplicativos executados nas instâncias do Amazon EC2. Quando você usa funções, não precisa distribuir credenciais da AWS para instâncias do Amazon EC2. Em vez disso, você pode criar uma função com as permissões que os aplicativos precisarão quando executados no Amazon EC2 e fizer chamadas para outros recursos da AWS. Quando os desenvolvedores iniciam uma instância do Amazon EC2, eles podem especificar a função que você criou para associar à instância. Os aplicativos executados na instância podem usar as credenciais da função para assinar solicitações.

Agora, no caso de uso em questão, os desenvolvedores mencionados [que] lançam uma instância do Amazon EC2 são, de fato, instâncias do EC2, o que parece gerar o problema de segurança que a Skaperen descreveu. Esse não é realmente o caso, conforme ilustrado pela política de exemplo na seção Permissões necessárias para o uso de funções com o Amazon EC2 :

{
   "Version": "2012-10-17",
   "Statement": [{
      "Effect":"Allow",
      "Action":"iam:PassRole",
      "Resource":"*"
    },
    {
      "Effect":"Allow",
      "Action":"iam:ListInstanceProfiles",
      "Resource":"*"
    },
    {
      "Effect":"Allow",
      "Action":"ec2:*",
      "Resource":"*"
    }]
}

De iam:PassRolefato, essa é a única permissão necessária do IAM e, embora tecnicamente de natureza administrativa, não seja tão abrangente assim, é claro que a política de exemplo acima ainda permitirá escalar permissões por meio de listagem e, por sua vez, passando por qualquer função disponível, mas isso pode ser evitado especificando apenas as funções desejadas / seguras para passar para o caso de uso em questão - isso é descrito na seção Restringindo quais funções podem ser passadas para instâncias do Amazon EC2 (usando PassRole) :

Você pode usar a permissão PassRole para impedir que os usuários passem uma função para o Amazon EC2 que tenha mais permissões do que as que já foram concedidas e, em seguida, execute os aplicativos com privilégios elevados para essa função. Na política de função, permita a ação PassRole e especifique um recurso (como arn: aws: iam :: 111122223333: role / ec2Roles / *) para indicar que apenas uma função ou conjunto de funções específico pode ser passado para uma instância do Amazon EC2 .

A política de exemplo respectiva ilustra exatamente o caso de uso em questão, concede permissão para iniciar uma instância com uma função usando a API do Amazon EC2 :

{
  "Version": "2012-10-17",
  "Statement": [{
      "Effect":"Allow",
      "Action":"ec2:RunInstances",
      "Resource":"*"
    },
    {
      "Effect":"Allow",
      "Action":"iam:PassRole",
      "Resource":"arn:aws:iam::123456789012:role/Get-pics"
    }]
}
Steffen Opel
fonte
Obrigado pela informação sobre iam: PassRole. Isso é mais detalhes do que eu havia aprendido antes, mostra muito mais do que pode ser feito configurando as permissões como esta.
Skaperen
1

Iniciar uma instância do EC2 com uma função do IAM requer acesso administrativo ao recurso do IAM. Isso se aplica mesmo se a nova instância tiver exatamente a mesma função que a instância que está executando o lançamento. A instância da qual eu estava iniciando tinha permissão "PowerUserAccess", que permitia iniciar uma instância, mas não o acesso à função do IAM. Depois que eu avancei a permissão na instância de lançamento para "AdministratorAccess", funcionou.

Como as funções do IAM concedem permissões, há claramente um problema de segurança a ser resolvido. Você não gostaria que as funções do IAM fossem um meio de permitir a escalação de permissões. Mas isso também significa que, para conceder qualquer função do IAM, a instância de inicialização deve ter "AdministratorAccess" ou estar usando chaves de acesso / segredo do usuário (com essa permissão) de dentro da instância (não recomendado), o que permitiria conceder qualquer função do IAM.

Ser capaz de iniciar uma instância com a mesma permissão (a mesma função do IAM) mantida pela instância que executou o lançamento seria útil, mas o EC2 ou o IAM não possuem esse nível de granularidade ou os meios para verificar com segurança esse .

Skaperen
fonte
11
Você analisou / descreveu corretamente o problema subjacente (+1), mas suas conclusões são um pouco imprecisas / enganosas - adicionei uma resposta separada para explicar corretamente como o possível problema de segurança é tratado pelo IAM.
Steffen Opel