在过去几个月间,我一直在关注Red Hat Enterprise Linux和CentOS上的KVM虚拟化,并且最近开始关注KVM安全性。我用一些戴尔PowerEdge服务器、EqualLogic iSCSI存储和若干Linux虚拟机(VM)在我的实验室进行了小规模的部署。尽管在实验室环境中安全并非是关注的重点,不过我还是了解到了与KVM虚拟化安全有关的一些有趣的事情,想要在这里与大家分享。

虚拟化环境中的安全性可被分为三个不同的组成部分:虚拟化管理程序(物理服务器)安全性、虚拟机安全性和远程管理安全性。因为虚拟化管理程序和虚拟机安全性非一篇博文的篇幅所能涵盖,我只做一些简短介绍,把重点放在介绍有哪几种方法能够提供安全的远程管理。

虚拟化管理程序安全性

虚拟化管理程序安全性涉及限制对虚拟化主机的访问,这一点上应该与非虚拟化的主机没有什么区别。可以使用常用的工具来保护KVM主机的安全,包括iptables和SELinux。您可以实施更多的措施,例如将虚拟机网络流量与虚拟化管理程序的网络流量隔离开来,从而降低虚拟化管理程序遭受外部袭击的几率。虚拟化管理程序安全性至关重要,因为如果虚拟化管理程序的安全得不到保障,运行其上的所有虚拟机的安全都得不到保障。

虚拟机安全性

虚拟机安全不仅包括确保在虚拟机上运行的操作系统的安全(与物理主机没有什么不同),还确保来自虚拟化管理程序内部的虚拟机映像的安全。因为通过本地存储或远程存储上的虚拟化管理程序均可访问虚拟机映像,应当采取措施,像确保其他任何敏感数据那样确保虚拟机映像的安全。提供不同的选项,包括虚拟机映像加密和sVirt服务。

远程管理安全性

远程管理涉及对KVM主机上的虚拟资源(存储和虚拟机)进行远程管理。当您想要将虚拟环境管理工作委派给其他用户,而又不授予对方KVM虚拟化管理程序登入访问权时,远程管理非常有用。

libvirtd daemon负责管理KVM主机上所有的虚拟资源,并且有‘virsh’和‘virt-manager’等客户端工具能与它远程互动。在接下来的一节中,我将介绍安全连接至libvirtd的两种简便方法:SSH通道(SSH Tunnels),以及简单鉴权和安全层(Simple Authentication and Security Layer,SASL )。

SSH 通道:此方法使用SSH 来远程连接至虚拟化管理程序,并且不需要预先进行任何配置。对于能够使用虚拟资源的用户,它要求具备虚拟化管理程序上的SSH登录证书,默认情况下只有“根”(root)能够做到这一点,不过也可以改变,使非根账户也可采用。

例如,您可以从远程管理客户端运行:

# virsh -c qemu+ssh://root@kvmhost.dell.com/system list
    root@kvmhost.dell.com's password:
Id Name                 State
----------------------------------
  1 vm1                 running
  2 vm2                 shut off
# virsh -c qemu+ssh://root@kvmhost.dell.com/system start vm2
    root@kvmhost.dell.com's password:
  Domain vm2 started
# virsh -c qemu+ssh://root@kvmhost.dell.com/system list
    root@kvmhost.dell.com's password:
Id Name                 State
----------------------------------
  1 vm1                 running
  2 vm2                 running

SASL:此方法提供安全的验证和数据加密。在其最简单的实施中,创建单独的用户证书数据库来验证libvirtd daemon。此方法有一大优势,即非登录用户ID可用于管理KVM主机上的虚拟化资源。

要配置KVM主机以使用SASL,请执行以下操作:

1. 编辑 /etc/libvirt/libvirtd.conf 并更改:

listen_tls = 0             # Disable the listen_tls flag
   listen_tcp = 1            # Enable the listen_tcp flag
   auth_tcp = “sasl”    # Set the authentication scheme

2. 编辑 /etc/sysconfig/libvirtd 并取消此行的批注,以使libvirtd听取TCP/IP连接:

LIBVIRTD_ARGS=”--listen”

3. 在KVM主机上,打开防火墙端口16509/TCP:

# iptables -A INPUT -p tcp -m tcp --dport 16509 -j ACCEPT
   # service iptables save

4. 重启libvirtd daemon以使变更生效:

# service libvirtd restart

5. 最后,将用户添加到用户数据库。在这一例子中,我们正在将用户 ‘admin’ 添加到 ‘libvirt’ SASL数据库:

# saslpasswd2 –c –a libvirt admin
   Password:
   Again (for verification):

6. 现在SASL已配置完毕,您可以安全地连接至KVM虚拟化管理程序:

# virsh -c qemu+tcp://kvmhost.dell.com/system list
   Please enter your authentication name: admin
   Please enter your password:
   Id Name                 State
   ----------------------------------
     1 vm1                 running
     2 vm2                 running

SSH 通道和SASL可用于运行任何virsh命令。有关可用选项的完整列表,请参阅virsh手册页面。