AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 797526
Accepted
Mike
Mike
Asked: 2016-08-18 15:13:49 +0800 CST2016-08-18 15:13:49 +0800 CST 2016-08-18 15:13:49 +0800 CST

限制特定用户访问 KVM 虚拟机

  • 772

在我的服务器上,我有一个名为“cards2”的 KVM 虚拟机。它是通过执行(以 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 访问权限的用户都可以通过执行以下命令来访问 VM:

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

(注意,此命令是远程qemu+ssh://[email protected]执行的,而不是在服务器上执行的。这通过 SSH 隧道连接到具有连接 URI 的管理程序)

用户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

/usr/bin/vir*我还尝试为不在组中的用户删除所有文件的权限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

即使现在我无法通过常规 SSH 连接访问这些命令中的任何一个,我仍然可以通过virt-viewerSSH 隧道远程执行(如上)来启动 VM。

那么,我怎样才能做到只有特定的用户帐户才能访问虚拟机呢?

编辑:

以下是我/var/log/libvirt/qemu/cards2.log启动 VM 时出现的内容,以防有任何指示:

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 -驱动文件=/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 ,地址=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
linux kvm-virtualization ssh permissions libvirt
  • 3 3 个回答
  • 7260 Views

3 个回答

  • Voted
  1. Best Answer
    Ryan Babchishin
    2016-08-18T19:18:54+08:002016-08-18T19:18:54+08:00

    KI明白了。virt-viewer 不与 libvirtd 交互 - 它通过 ssh 连接到主机并设置隧道以允许访问基于 VNC 的 VM 虚拟显示器(在我的情况下为 127.0.0.1:5903)。如果没有在 127.0.0.1 上设置防火墙 VNC,这很难解决。否则,普通用户通常可以自由地与 localhost 建立 TCP 连接。我不知道你怎么能只允许root,也许有办法。

    也许 selinux 会这样做?

    Linux:允许/限制用户的 IP 绑定权限

    因此,最简单的做法是设置 VNC 密码。您可以在 SSH 中执行限制转发和 X11forwarding 之类的操作,但这可能不是 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
  2. Mike
    2016-08-20T15:25:06+08:002016-08-20T15:25:06+08:00

    正如瑞安的回答上面所说,“virt-viewer 不与 libvirtd 交互”。libvirtd 和 VNC(virt-viewer 连接到的)具有完全独立的身份验证方法。VNC 可以通过

    • 单一密码认证
    • SASL 身份验证
    • x509 证书
    • 组合证书和前两个之一

    单一密码

    如果使用单个密码,它可以是存储在/etc/libvirt/qemu.conf文件中的全局密码,也可以在 VM 配置中添加特定于 VM 的密码:

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

    请注意,这些密码必须以纯文本形式存储。

    SASL 身份验证

    这允许每个 VM 有多个用户名和密码组合。与以纯文本形式存储的单个密码不同,密码也经过哈希处理。有关说明,请参见此处。

    x509 证书

    这实际上是我认为直接回答问题的部分(但我没有测试过)。有了这个,您可以通过使用存储在服务器上的证书进行身份验证来限制哪些用户可以连接到 VNC 实例。要撤销特定用户或组的权限,只需将系统范围的客户端证书文件的权限设置为该用户不可读。您还可以为每个用户生成证书并撤销访问权限。

    不幸的是,设置起来相对困难。它包括首先在服务器上创建根 CA、生成 x509 客户端/服务器证书、配置服务器、配置客户端和测试设置,然后限制访问。

    • 1
  3. Dravigon
    2017-04-23T09:41:47+08:002017-04-23T09:41:47+08:00

    您是否尝试使用 polkit 来限制用户的访问?我也想这样做,所以我得到了这个结果:

    1. 将虚拟机命名为username*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. 现在只有相应的用户才能看到虚拟机本身。

    请享用

    • 1

相关问题

  • 多操作系统环境的首选电子邮件客户端

  • 你最喜欢的 Linux 发行版是什么?[关闭]

  • 更改 PHP 的默认配置设置?

  • 保护新的 Ubuntu 服务器 [关闭]

  • (软)Ubuntu 7.10 上的 RAID 6,我应该迁移到 8.10 吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve