web-dev-qa-db-ja.com

KVM仮想マシンへのアクセスを特定のユーザーに制限する

サーバーにKVM「cards2」と呼ばれる仮想マシンがあります。これは(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

画像には権限があります:

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

ただし、SSHアクセス権のあるanyユーザーがVMを実行することでアクセスできることがわかりました。

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

(このコマンドは、サーバーではなくリモートで実行されます。これは、SSHを介したトンネリングによって接続URI qemu+ssh://[email protected]でハイパーバイザーに接続します)

ユーザーusernameは、usernameグループのメンバーにすぎません。 usernameアカウントを使用してSSH接続すると、仮想マシンのリストが空に表示されます。

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

また、SSH経由で次のコマンドを実行すると、ソケットを使用して接続できません。

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

また、kvmグループに属していないユーザーに対して、すべての/usr/bin/vir*ファイルへのアクセス許可を削除してみました。

# 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

そして、今は通常のSSH接続でこれらのコマンドのいずれにもアクセスできませんが、SSH経由でvirt-viewerをリモートで(上記のように)実行することで、VMを起動できます。トンネル。

では、特定のユーザーアカウントのみがVMにアクセスできるようにするにはどうすればよいですか?

編集:

VMが開始されたときに、/var/log/libvirt/qemu/cards2.logに表示される内容は次のとおりです。

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 -namecards2 -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-デバイス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

編集2:

別のメモでは、これはvirt-viewerの問題であり、virshの問題ではないようです。

たとえば、リモートクライアントで実行されているいくつかのコマンドを次に示します。

$ 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
4
Mike

Kわかった。 virt-viewerはlibvirtdと対話しません-sshを介してホストに接続し、トンネルを設定して、VMのVNCベースの仮想ディスプレイ(私の場合は127.0.0.1:5903)にアクセスできるようにします。これは、127.0.0.1でのファイアウォールVNC以外では修正が困難です。それ以外の場合、通常のユーザーは通常、TCP localhostへの接続を自由に行うことができます。どうすればrootだけを許可できるかわかりません。

たぶんselinuxはそれをしますか?

Linux:ユーザーによるIPバインド許可の許可/制限

だから、最も簡単なことは、VNCパスワードを設定することです。SSHでの転送の制限やX11の転送などを実行できますが、100%になるとは限りません。安全で、rootにも問題を引き起こす可能性があります。また、ユーザーはログイン後も127.0.0.1/vncにアクセスできます。

更新

Mike(他の回答)とMichael Hampton(コメント)によると、パスワードではなくTLSを使用してVNCと通信できるため、パスワードが十分でない場合は、かなりまともなセキュリティが得られます。それらの両方の小道具、私は知りませんでした。

http://wiki.libvirt.org/page/VNCTLSSetup

そして

https://www.suse.com/documentation/sles11/book_kvm/data/sec_l​​ibvirt_connect_remote.html#sec_l​​ibvirt_connect_remote_tls

4
Ryan Babchishin

Ryanの回答 は上記のように、「virt-viewerはlibvirtdと相互作用しません」。 libvirtdとVNC(virt-viewerの接続先)には完全に 個別の認証方法 があります。 VNCは

  • 単一パスワード認証
  • SASL認証
  • x509証明書
  • 組み合わせ証明書と最初の2つのうちの1つ

単一のパスワード

単一のパスワードを使用する場合は、/etc/libvirt/qemu.confファイルに保存されているグローバルパスワードか、VM構成にVM固有のパスワードを追加できます。

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

これらのパスワードはプレーンテキストで保存する必要があることに注意してください。

SASL認証

これにより、VMごとに複数のユーザー名とパスワードの組み合わせが可能になります。プレーンテキストで保存される単一のパスワードとは異なり、パスワードもハッシュされます。手順については こちらをご覧ください

x509証明書

これは実際には私が信じている部分が直接質問に答えます(ただし、私はテストしていません)。これにより、サーバーに保存されている証明書で認証することで、VNCインスタンスに接続できるユーザーを制限できます。特定のユーザーまたはグループの権限を取り消すには、システム全体のクライアント証明書ファイルの権限をそのユーザーが読み取れないように設定するだけです。ユーザーごとの証明書を生成し、アクセスを取り消すこともできます。

残念ながら、セットアップは比較的困難です。最初に サーバーにルートCAを作成するx509クライアント/サーバー証明書の生成サーバーの構成クライアントの構成そして設定をテストする 、そして アクセスを制限する

1
Mike

ユーザーのアクセスを制限するためにpolkitを使用してみましたか?私もこれをやりたかったので、この結果になりました:

  1. VMにsername * vmnameという名前を付けます
  2. polkitルールファイルで、ルールを以下のように編集します

    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. これで、対応するユーザーのみがvm自体を表示できます。

楽しい

1
dravigon