Configurando autenticação na máquina virtual

3

Estou criando um sistema semelhante a um provedor de computação em nuvem usando as ligações pyvirt libvirt.

Gostaria de dar aos usuários a capacidade de especificar uma imagem de máquina virtual personalizada, de maneira semelhante à AWS.

Gostaria de gerar pares de chaves SSH e configurar a VM para autenticação de chave pública.

Qual é o melhor método para fazer isso? Quais requisitos devo impor na imagem da VM especificada pelo usuário para que isso funcione?

Eu estava pensando em uma conta root sem senha para permitir que meu software fosse logado e configurar o que precisava, mas isso deixa um intervalo de tempo (curto) durante o qual todos poderiam fazer login como root. Existem melhores soluções? Posso editar a imagem da máquina virtual antes de iniciá-la?

Na prática, preciso fazer o login para poder fazer o login na máquina e executar alguns comandos antes de fornecê-lo ao usuário.

Editar:

Alguns detalhes adicionais:

  1. Eu sei sobre o Eucalyptus, o Cloudstack e o Openstack. Essa implementação é para um ambiente / requisitos muito específicos (clusters HPC, agendamento de tarefas em lote) e não permite executá-los.
  2. Na verdade, não ligo (ou, para o propósito desta questão, não é relevante) de onde vem o par de chaves, só quero saber como o provedor de serviços pode acessar a máquina, exigindo menos configuração possível na imagem da VM na parte do usuário; ErikA respondeu a isso sugerindo um par de chaves específico do serviço. Justo. Existem outras soluções?
  3. O usuário final não precisa ter acesso à nova máquina virtual, ele executará trabalhos nele por meio de SLURM (embora ele pudesse acessá-lo se quisesse, eu não me importo).
  4. O provedor cuida de:
    1. Alocando e gerando novos domínios (máquinas virtuais)
    2. Gerando o daemon do SLURM (que não precisa acontecer na inicialização, mas em um determinado momento, portanto, a necessidade de o provedor poder acessar a máquina)
por GaretJax 07.07.2011 / 22:07

2 respostas

0

Eu resolvi da seguinte maneira:

Como eu precisava do endereço IP atribuído à VM, e como o libvirt não oferece meios para recuperá-lo (ao contrário de VMWare, que oferece o conjunto de ferramentas VMWare para tais operações), terminei de configurar uma serial ( no guest) para o canal tcp (no host) entre a VM e o Host, usando o suporte a dispositivos virtuais da .

Um script de shell simples no convidado aguarda até que um endereço IP seja atribuído a uma determinada interface e o grave no dispositivo serial. Quando o servidor TCP instalado no host recebe o endereço IP, ele envia de volta a chave pública, que o script no convidado lê (novamente, a partir da porta serial) e grava novamente no arquivo authorized_keys correto.

Esta solução pode ser usada sem a parte de troca de IP, com apenas o convidado lendo a chave da porta serial na inicialização. As vantagens dessa solução são que o sistema operacional convidado não precisa ser personalizado com uma determinada chave (portanto, diferentes pares de chaves podem ser usados para diferentes "partições" do sistema) e que ele pode gerenciar onde colocá-lo; a desvantagem é que o convidado precisa estar configurado para executar o script.

Outra solução seria montar a imagem do disco antes da inicialização da VM usando algo como libguestfs , copiar a chave pública, desmontá-la e inicialize o convidado. Essa solução é preferível ao TCP < - > SerialPort, mas como precisei do endereço IP, continuei o contrário.

A terceira solução, como sugerido por ErikA em seu primeiro comentário, seria deixar o usuário criar a imagem fazendo toda a configuração, dando a ela sua chave pública. Esta é provavelmente a melhor (mais limpa e mais elegante) solução para o caso mais genérico.

    
por 15.07.2011 / 11:28
2

Talvez você deva tentar não reinventar a roda. Existem muitos frameworks por aí que farão exatamente o que você quer ... e até mesmo os gratuitos / de código aberto. Tente olhar cloudstack ou eucalipto para dois desses ambientes.

    
por 07.07.2011 / 23:39