A função do IAM está alternando um host do EC2 sem usar o “source_profile”

1

Eu tenho um host do EC2 Ubuntu, onde tenho uma única conta de usuário responsável por executar diferentes tarefas em momentos diferentes. Cada tarefa requer permissões específicas representadas por uma função correspondente do IAM (eu as chamo de "funções de perfil"). A ideia é conceder a esse usuário uma permissão para assumir essas funções, quando necessário.

Por enquanto, a configuração ~/.aws/credentials é a seguinte:

[default]
aws_access_key_id = XXX
aws_secret_access_key = YYY

[profile1]
role_arn = arn:aws:iam::XXXXXXXXXX:role/role-for-profile1
source_profile = default

[profile2]
role_arn = arn:aws:iam::XXXXXXXXXX:role/role-for-profile2
source_profile = default

...

[profileN]
role_arn = arn:aws:iam::XXXXXXXXXX:role/role-for-profileN
source_profile = default

O usuário em default profile tem uma única permissão: para assumir qualquer função que comece com role-for-profile . O JSON da política é o seguinte:

{
  "Version": "2012-10-17",
  "Statement": [
    {
        "Sid": "Stmt1494333413000",
        "Effect": "Allow",
        "Action": [
            "sts:AssumeRole"
        ],
        "Resource": [
            "arn:aws:iam::XXXXXXXXXX:role/role-for-profile*"
        ]
    }
  ]
}

Assim, qualquer aplicativo que precise acessar serviços específicos da AWS para executar uma tarefa específica (não importa se usa módulos AWS CLI, Boto ou Ansible, ou qualquer outro) pode apenas especificar um nome de perfil e assumir o requisito função de perfil de forma transparente.

Agora, minha preocupação é: como isso está sendo executado em um host do EC2, não preciso colocar explicitamente nenhuma credencial nesse host. Em teoria, eu poderia anexar a função "mestre" do IAM diretamente ao host do EC2, em vez de criar um usuário, concedendo a permissão de troca de função e explicitamente colocando suas credenciais em default profile.

No entanto, não consigo fazer isso, pois o parâmetro source_profile é obrigatório. Alguém tem uma ideia, como eu poderia autorizar o host do EC2 assumir papéis sem dar credenciais? Em outras palavras, quero que o host autentique por princípio "algo que eu sou" (uma instância do EC2 com uma determinada função do IAM), não "algo que eu conheço" (chave de acesso e chave secreta fornecidas explicitamente por um usuário do IAM). p>

UPDATE. Encontrou algumas solicitações de recursos - parece que isso ainda não é suportado: (

UPDATE2. Parece que preciso esclarecer o propósito dessa configuração. Eu tenho scripts diferentes que são executados nos mesmos hosts (podem estar em paralelo). Cada script requer um conjunto específico de permissões. O que eu quero alcançar é que cada script tenha apenas este conjunto de permissões, e não mais que isso. Na minha opinião, a melhor maneira de conseguir isso é a seguinte:

  1. No nível do host, não há permissões, exceto uma permissão para assumir várias funções específicas.
  2. Quando um script começa a funcionar, ele precisa assumir uma função correspondente para obter as permissões necessárias.
  3. Ao mesmo tempo, não quero colocar o papel ARN no script. Em vez disso, gostaria de definir vários perfis em ~/.aws/credentials , cada um definido para assumir uma função específica.

Não tenho problemas com os dois primeiros itens. No entanto, a implementação do terceiro requer que eu crie um perfil "padrão" que outros perfis usarão como referência, e esse perfil "padrão" por algum motivo precisa ter as credenciais de um usuário. O que eu gostaria é de me referir à função anexada à instância do EC2, onde todas essas coisas estão sendo executadas.

    
por Vlad Nikiforov 12.05.2017 / 13:22

3 respostas

1

Eu tenho tentado resolver o mesmo problema. A coisa mais próxima que consegui encontrar é a essência: link

Ele usa o comando aws sts assume-role para obter um conjunto temporário de credenciais (expira em 60 minutos por padrão). Supus que você pudesse usar esse script para obter credenciais temporárias para a função atribuída às instâncias do EC2 e atualizar a chave de acesso da AWS e a chave secreta da AWS para o perfil "padrão". Como as credenciais temporárias expiram a cada hora, você precisaria de um cron job para atualizá-las regularmente.

Uma espécie de hack feio, mas até que seja suportado, acho que tem uma boa chance de trabalhar.

    
por 21.06.2017 / 16:44
1

O AWS permite atribuir apenas uma função a uma instância do EC2. Essa função deve ter todas as permissões que a instância do EC2 pode precisar assumir. Referência .

Você pode alterar funções atribuídas a uma instância usando a linha de comando, mas não é algo que você queira fazer regularmente, em tempo de execução.

    
por 12.05.2017 / 19:56
0

Anexe a função "padrão" como a função principal da instância. este evita a necessidade de credenciais no seu perfil padrão.

Crie perfis não padrão com credenciais para as outras funções.

    
por 21.06.2017 / 22:30