Restringir o acesso a máquinas virtuais KVM para usuários específicos

4

No meu servidor, tenho uma máquina virtual KVM chamada "cards2". Foi criado executando (como root):

# virt-install --connect qemu:///system --virt-type kvm --name cards2 --ram 2048 --disk /var/kvm/cards2.qcow,size=3 --vcpus=8 --cdrom /var/kvm/debian-8.5.0-amd64-netinst.iso --vnc --os-type linux --network network=default

A imagem tem permissões:

# ls -l /var/kvm/cards2.qcow 
-rwxr-xr-x 1 libvirt-qemu libvirt-qemu 3221225472 Aug 17 18:49 /var/kvm/cards2.qcow

No entanto, notei que qualquer qualquer usuário com acesso SSH é capaz de obter acesso à VM executando:

virt-viewer --connect qemu+ssh://[email protected]/system vmname

(Note que este comando é executado remotamente , não no servidor. Isto conecta-se ao hipervisor com conexão URI qemu+ssh://[email protected] por tunelamento via SSH)

O usuário username é apenas um membro do grupo username . Quando o SSH está entrando com a conta username , a lista de máquinas virtuais aparece vazia:

$ virsh list --all
 Id    Name                           State
----------------------------------------------------

E eu também não consigo conectar usando um soquete ao executar o seguinte sobre o SSH:

$ virsh --connect qemu:///system list --all
error: Failed to connect socket to '/var/run/libvirt/libvirt-sock': Permission denied

Eu também tentei remover permissões para todos os arquivos /usr/bin/vir* para usuários que não estão no grupo kvm :

# chown root:kvm /usr/bin/vir*
# chmod o-rx /usr/bin/vir*
# ls /usr/bin/vir* -l
-rwxr-x--- 1 root kvm  321120 Jul  1 04:46 /usr/bin/virsh
-rwxr-x--- 1 root kvm   32184 Dec  7  2013 /usr/bin/virt-alignment-scan
-rwxr-x--- 1 root kvm   28128 Dec  7  2013 /usr/bin/virt-cat
-rwxr-x--- 1 root kvm    9774 Sep 29  2014 /usr/bin/virt-clone
-rwxr-x--- 1 root kvm   10277 Sep 29  2014 /usr/bin/virt-convert
-rwxr-x--- 1 root kvm     806 Dec  7  2013 /usr/bin/virt-copy-in
-rwxr-x--- 1 root kvm     808 Dec  7  2013 /usr/bin/virt-copy-out
-rwxr-x--- 1 root kvm   54584 Dec  7  2013 /usr/bin/virt-df
-rwxr-x--- 1 root kvm   33312 Dec  7  2013 /usr/bin/virt-edit
-rwxr-x--- 1 root kvm   54536 Dec  7  2013 /usr/bin/virt-filesystems
-rwxr-x--- 1 root kvm   30112 Dec  7  2013 /usr/bin/virt-format
-rwxr-x--- 1 root kvm   14656 Jul  1 04:46 /usr/bin/virt-host-validate
-rwxr-x--- 1 root kvm    7944 Sep 29  2014 /usr/bin/virt-image
-rwxr-x--- 1 root kvm   44696 Dec  7  2013 /usr/bin/virt-inspector
-rwxr-x--- 1 root kvm   36992 Sep 29  2014 /usr/bin/virt-install
-rwxr-x--- 1 root kvm    5338 Dec  7  2013 /usr/bin/virt-list-filesystems
-rwxr-x--- 1 root kvm    6686 Dec  7  2013 /usr/bin/virt-list-partitions
-rwxr-x--- 1 root kvm   53816 Dec  7  2013 /usr/bin/virt-ls
-rwxr-x--- 1 root kvm   18641 Dec  7  2013 /usr/bin/virt-make-fs
-rwxr-x--- 1 root kvm    9600 Jul  1 04:46 /usr/bin/virt-pki-validate
-rwxr-x--- 1 root kvm   36264 Dec  7  2013 /usr/bin/virt-rescue
-rwxr-x--- 1 root kvm 1322488 Dec  7  2013 /usr/bin/virt-resize
-rwxr-x--- 1 root kvm 1231256 Dec  7  2013 /usr/bin/virt-sparsify
-rwxr-x--- 1 root kvm 1289592 Dec  7  2013 /usr/bin/virt-sysprep
-rwxr-x--- 1 root kvm    8949 Dec  7  2013 /usr/bin/virt-tar
-rwxr-x--- 1 root kvm     804 Dec  7  2013 /usr/bin/virt-tar-in
-rwxr-x--- 1 root kvm     806 Dec  7  2013 /usr/bin/virt-tar-out
-rwxr-x--- 1 root kvm      55 Jul 12  2012 /usr/bin/virtualenv
-rwxr-x--- 1 root kvm  132400 May 28  2012 /usr/bin/virt-viewer
-rwxr-x--- 1 root kvm   23886 Dec  7  2013 /usr/bin/virt-win-reg
-rwxr-x--- 1 root kvm    3531 Jul  1 04:46 /usr/bin/virt-xml-validate

E mesmo que agora eu não consiga acessar nenhum desses comandos através de uma conexão SSH regular, ainda posso abrir a VM executando virt-viewer remotamente (como acima) no túnel SSH.

Então, como posso fazer com que apenas contas de usuários específicas tenham acesso às VMs?

Editar:

Veja o que aparece no meu /var/log/libvirt/qemu/cards2.log quando a VM é iniciada, caso isso indique alguma coisa:

LC_ALL=C PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin QEMU_AUDIO_DRV=none /usr/bin/kvm -S -M pc-1.1 -enable-kvm -m 2048 -smp 8,sockets=8,cores=1,threads=1 -name cards2 -uuid 70905b35-9df3-71c9-d5e9-f804a2826055 -no-user-config -nodefaults -chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/cards2.monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc -no-shutdown -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2 -drive file=/var/kvm/cards2.qcow,if=none,id=drive-ide0-0-0,format=raw -device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 -drive if=none,id=drive-ide0-1-0,readonly=on,format=raw -device ide-cd,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0 -netdev tap,fd=23,id=hostnet0 -device rtl8139,netdev=hostnet0,id=net0,mac=52:54:00:c6:14:68,bus=pci.0,addr=0x3 -chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0 -vnc 127.0.0.1:3 -vga cirrus -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x4

Editar 2:

Em outra observação, isso parece ser apenas um problema para virt-viewer e não para virsh .

Por exemplo, aqui estão alguns comandos sendo executados no cliente remoto:

$ virsh --connect qemu+ssh://[email protected]/system
error: failed to connect to the hypervisor
error: End of file while reading data: nc: unix connect failed: Permission denied: Input/output error

$ virsh --connect qemu+ssh://[email protected]/system
Welcome to virsh, the virtualization interactive terminal.

Type:  'help' for help with commands
       'quit' to quit
    
por Mike 18.08.2016 / 01:13

3 respostas

3

K eu entendi. O virt-viewer não interage com o libvirtd - ele se conecta através do ssh ao host e configura um encapsulamento para permitir acesso às exibições virtuais baseadas em VNC de suas VMs (127.0.0.1:5903 no meu caso). Isso é difícil de corrigir com o firewall do VNC em 127.0.0.1. Caso contrário, os usuários regulares normalmente estarão livres para estabelecer conexões TCP com o host local. Eu não tenho ideia de como você poderia permitir apenas root, talvez haja um jeito.

Talvez o selinux faça isso?

Linux: Permitir / restringir permissões de vinculação de IP pelo usuário

Portanto, o mais fácil seria definir uma senha VNC. Você poderia fazer coisas como restringir o encaminhamento e o X11forwarding no SSH, mas isso pode não ser 100% seguro e causar um problema para raiz também. E os usuários ainda poderiam acessar o 127.0.0.1/vnc depois de logados.

Atualizar

De acordo com Mike (outra resposta) e Michael Hampton (comentários), você pode usar o TLS para se comunicar com o VNC, em vez de uma senha, para obter segurança decente se as senhas não forem boas o suficiente para você. Adereços para ambos, eu não tinha ideia.

link

e

link

    
por 18.08.2016 / 05:18
1

Como a resposta de Ryan diz acima, "o virt-viewer não interage com o libvirtd". O libvirtd eo VNC (ao qual o virt-viewer se conecta) têm métodos de autenticação separados separados . VNC pode ser protegido com

  • Autenticação de senha única
  • Autenticação SASL
  • x509 certificados
  • Certificados de combinação e um dos dois primeiros

Senhas únicas

Se estiver usando uma única senha, ela pode ser uma senha global armazenada no arquivo /etc/libvirt/qemu.conf ou você pode adicionar uma senha específica da VM na configuração da VM:

<graphics type='vnc' port='-1' autoport='yes' passwd='PASSWORD'/>

Note que essas senhas devem ser armazenadas em texto simples.

Autenticação SASL

Isso permite várias combinações de nome de usuário e senha para cada VM. As senhas também são criptografadas, ao contrário de senhas únicas, que são armazenadas em texto simples. Para obter instruções, consulte veja aqui .

certificados x509

Esta é, na verdade, a parte que acredito responde diretamente à pergunta (no entanto, eu não a testei). Com isso, você pode limitar qual usuário pode se conectar à instância do VNC, autenticando-se com certificados armazenados no servidor. Para revogar permissões para um usuário ou grupo específico, basta definir as permissões do arquivo de certificado de cliente do sistema para não ser legível por esse usuário. Você também pode gerar certificados por usuário e revogar o acesso.

Infelizmente, é relativamente difícil de configurar. Envolve primeiro a criação de uma CA raiz no servidor , Gerar x509 certificados cliente / servidor , configurar o servidor , configurando o cliente e testando a configuração e, em seguida, restringindo o acesso .

    
por 20.08.2016 / 01:25
1

Você tentou usar o polkit para restringir o acesso dos usuários? Eu também queria fazer isso, então terminei com esse resultado:

  1. Nomeie a vm como nome de usuário * vmname
  2. agora no arquivo de regras do polkit edite a regra como abaixo

    function myFunction(username, virtualmachine) {
        var arr = virtualmachine.split("*");
        if(arr[0]==username){
            return true;
        }
        else{
            return false;
        }
    }
    // Allow passwordless connection to qemu:///system
    polkit.addRule(function(action, subject) {
        if (action.id == "org.libvirt.unix.manage")
        {
            return polkit.Result.YES;
        }
    });
    // Give full access to 'vm'
    polkit.addRule(function(action, subject) {
        if (action.id.indexOf("org.libvirt.api.domain.") == 0 ) {
            if (action.lookup("connect_driver") == 'QEMU' &&  myFunction(subject.user, action.lookup("domain_name"))) {
                polkit.log("vm=" + action.lookup("domain_name") + "action =>"+myFunction(subject.user, action.lookup("domain_name")));
                polkit.log("subject=" + subject);
                polkit.log("ok");
                return polkit.Result.YES;
            } else {
                return polkit.Result.NO;
            }
        }
    });
    
  3. agora apenas o usuário correspondente só poderá ver a própria VM.

aproveite

    
por 22.04.2017 / 19:41