Como fornecer acesso a apenas uma instância aos usuários no Google Compute Engine?

Como fornecer acesso a apenas uma instância aos usuários no Google Compute Engine?

Estou tentando encontrar uma solução para fornecer a um trabalhador externo acesso a uma instância em nosso projeto, mas não a todos os recursos.

Eu fiz algumas pesquisas e encontrei dois métodos sobre como fazer isso.

A primeira seria fornecer ao contratante uma chave privada para fazer ssh na instância selecionada.

Mas eu gostaria de tentar usar o outro método que é atribuir a função de usuário da conta de serviço ao contratante.

Pelo que entendi com contas de serviço. Eles são declarados como um recurso e uma identidade. Eu teria que criar uma nova instância em uma conta de serviço recém-criada com permissões definidas limitadas.

[conta de serviço] >>> permissões >>> [instâncias]

[usuário] >>> função de usuário da conta de serviço >>> [conta de serviço]

então acho que a função de usuário da conta de serviço é como um proxy para a conta de serviço. Tentei atribuir permissões à conta de serviço e atribuí a um usuário a função de usuário da conta de serviço. Eu pensaria que depois disso o usuário teria as permissões atribuídas à conta de serviço. Mas infelizmente esse não é o caso e gostaria de alguma ajuda.

Responder1

Usar uma chave privada como você sugeriu seria a solução ideal aqui, pois é a única maneira de garantir que seu contratante não tenha acesso a outras instâncias ou informações sobre o status do seu projeto. No entanto, o que você descreveu (SSH em uma máquina usando uma conta de serviço)pode ser feito, e realmente,contas de serviço são uma identidade e um recurso.

Se você atribuir a um usuário a Service Account Userfunção de uma conta de serviço com as permissões necessárias para SSH em uma máquina, isso permitirá que o usuário faça exatamente isso. Tenha em mente, entretanto, que o conjunto mínimo de permissões que esta conta de serviço exigiria para que isso funcionasse permitiria que a conta de serviço (e, consequentemente, o usuário também) fizesse SSH em qualquer instância do Compute. Isso por si só é um indicador de que isso não lhe dará a granularidade que você parece desejar.

Para que o cenário que você imaginou seja possível, você precisa fazer o seguinte:

  1. Crie uma conta de serviço e atribua a ela a Service Account Userfunção e 4 permissões granulares, compute.instances.get, compute.instances.setMetadata, compute.projects.gete compute.zoneOperations.get(você provavelmente deve criar uma função personalizada para essas permissões). Isso pode ser feito na seção IAM e administração doConsole;
  2. Dê ao próprio usuário algum tipo de permissão para o projeto através doConsole ou gcloud. Eu sugeriria dar o Compute Viewerpapel;
  3. Instrua o usuário ainstale o SDK do Google Cloude inicialize-o com suas credenciais;
  4. Faça com que o usuário faça SSH na instância apropriada usando gcloud compute ssh SERVICE_ACCOUNT_USERNAME@INSTANCE_IP_OR_HOSTNAME --zone ZONE_OF_INSTANCE.

Eu sugiro que o usuário faça SSH na máquina de destino por meio do Cloud Shell, pois isso evitaria ter que executar a etapa 3 completamente. Não se esqueça também das regras de firewall, pois os IPs públicos atribuídos ao Cloud Shell não parecem se enquadrar nos intervalos comuns de IP públicos do Google.

Não se surpreenda se você vir uma mensagem como Updating project ssh metadata...failed. Isso era esperado, pois a conta de serviço só tem permissões para adicionar chaves SSH aos metadados das instâncias.

informação relacionada