libvirt kvm

    技术2024-06-21  76

    总览

    Libvirt已被广泛用于在Linux®中管理虚拟化环境。 它提供了多种功能,包括来宾生命周期管理,资源分配,使用cgroup的资源管理以及通过SELinux的安全实施等。 libvirt执行的所有这些操作都处理分配给来宾或从来宾释放的主机资源。

    从版本0.9.0开始,libvirt能够与主机上的Linux审核子系统进行通信,以发布有关多个操作的记录。 这是一项重要功能,可让系统管理员,审核员甚至其他应用程序访问虚拟环境中更改的详细历史记录,包括来宾生命周期操作以及来宾的主机资源分配的更改。

    Linux审计子系统能够处理来自不同来源的多种事件,而不仅仅是从libvirt发出的与虚拟化相关的事件。 审核系统通常用于跟踪文件更改,来自SELinux或AppAmor的安全性拒绝以及系统调用。 从审核虚拟机的角度来看,这些不同类型的事件可以包含有用的信息。

    例如,SELinux策略可能会禁止访问分配给来宾的资源,这将生成AVC(访问向量缓存)拒绝记录。 尽管该事件不是由libvirt发出的,但它与来宾绑定。 同样,许多事件可能与来宾有关,其中包括内核或驻留在用户空间中的程序生成的异常事件。

    在下一部分中,快速查看审核系统如何工作,libvirt如何与之交互以及如何从审核日志中获取与来宾相关的信息。

    审核基础

    Linux内核负责生成大多数审核事件,例如系统调用事件,文件监视事件和安全事件。 但是用户应用程序也可以生成事件。

    Linux审核系统的核心组件是内核。 其他组件生成的所有事件都首先发送到内核。 在内核中,应用了一系列规则来决定是否丢弃事件。 图1显示了组成Linux审核系统的组件。

    图1.审核系统组件

    可以使用auditctl命令更改内核中的审核规则。 一些具有特殊功能的应用程序,例如libvirt守护程序,被认为是受信任的应用程序,能够将审核事件发送到内核。 应用规则后,内核将事件发送到audit守护程序。 然后, audit守护程序将记录写入磁盘,并可能使用auditspd守护程序调度自定义操作。

    其他组件(ausearch,aureport,aulast和auvirt)是用户空间工具,用于解析审核日志并以更简单的形式显示其信息。 auvirt工具专门设计用于呈现与虚拟化相关的事件和相关事件。

    需要注意的重要一件事是审核事件和审核记录之间的区别。 审核事件是由用户或某些应用程序发起的可以审核的操作,例如:文件打开是可以审核的事件。 此外,审核记录仅包含与事件的一个方面有关的信息。 因此,事件可以跨越审核日志中的一个或多个记录。 考虑到打开文件的示例,该事件可以生成一条记录,其中包含有关被调用的open syscall的信息,以及一条记录中有关所访问的文件的信息(有关示例,请参见清单1 )。

    清单1.打开文件事件的审核记录(为清楚起见而包装)
    type=SYSCALL msg=audit(1328292445.908:40194): arch=c000003e syscall=2 success=yes exit=3 a0=7fffe3d2e85c a1=941 a2=1b6 a3=7fffe3d2c570 items=3 ppid=26377 pid=26677 auid=500 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts8 ses=1 comm="touch" exe="/bin/touch" subj=unconfined_u:unconfined_r:unconfined_t:s0 key=(null) type=CWD msg=audit(1328292445.908:40194): cwd="/home/mhcerri" type=PATH msg=audit(1328292445.908:40194): item=0 name="/tmp/file" inode=1196 dev=fd:01 mode=0100775 ouid=500 ogid=501 rdev=00:00 obj=unconfined_u:object_r:user_tmp_t:s0

    请注意,每个记录具有不同的类型,并且所有三个记录都具有相同的“ 1328292445.908:40194”字符串。 这是事件标识符。 冒号(:)之前的前两个数字是事件时间戳,第一个是以秒为单位的UNIX®时间,第二个是毫秒值。 第三个数字是生成的序列号。 还要注意,审核记录中使用的格式并不简单,因为审核系统具有一些工具来帮助您可视化审核日志。

    Libvirt和审核

    Libvirt基本上会生成三种不同类型的记录。 它们都有一个共同的记录,即“ uuid”字段。 这是一个通用唯一标识符,用于标识libvirt发布的所有记录中的来宾。 libvirt使用的记录类型为:

    VIRT_CONTROL:在虚拟机生命周期的每个步骤中生成。 它在来宾启动或停止时生成,并且包含诸如操作原因和来宾名称之类的字段。 VIRT_MACHINE_ID:libvirt尝试为访客分配安全标签时生成。 将QEMU与sVirt一起使用时,此记录包含QEMU进程的安全标签和附加到客户机的磁盘的安全标签。 VIRT_RESOURCE:当来宾的资源分配发生更改时生成,例如,当从来宾中卸下磁盘或将新的网络设备连接到该磁盘时。

    奥维尔特

    auvirt工具在审计日志中搜索libvirt生成的记录,以显示虚拟机会话的列表。 它还查看其他一些事件,例如主机关闭,与来宾相关的AVC拒绝以及与QEMU进程相关的异常事件。 清单2是auvirt输出的示例。 第一个字段是客人的姓名。 第二个是启动来宾的用户。 第三个是来宾运行的时间范围。 请注意,在示例中,执行“ Arch”失败,并且另一个仍在运行。

    清单2. Auvirt输出
    # auvirt Fedora root Tue Jan 24 16:28 - 16:28 (00:00) Fedora root Wed Jan 25 10:31 - 10:34 (00:02) CentOS root Wed Jan 25 10:34 - 13:50 (03:16) Fedora root Wed Jan 25 13:51 - 13:54 (00:03) Fedora root Wed Jan 25 13:54 - 13:55 (00:00) Arch root Wed Jan 25 13:55 - failed Arch root Wed Jan 25 13:56

    可以使用以下选项将输出限制为特定时间范围:

    --start <date> [<time>] :为所考虑的时间段定义一个开始 --end <date> [<time>] :为所考虑的时间段定义结束

    如果省略了<time> ,则该工具的默认起点为“ 00:00:00”,结束时默认为“ 23:59:59”。

    清单3.按时间过滤auvirt输出
    # auvirt --start 01/25/2012 12:00:00 --end 01/25/2012 Fedora root Wed Jan 25 13:51 - 13:54 (00:03) Fedora root Wed Jan 25 13:54 - 13:55 (00:00) Arch root Wed Jan 25 13:55 - failed Arch root Wed Jan 25 13:56

    也可以将结果限制为仅一位客人。 可以使用来宾的名称或来宾的UUID指定来宾。 默认情况下,该工具不显示UUID,以使输出保持简单,但是您可以使用--show-uuid选项将其包括在输出中。

    清单4.使用名称和UUID按来宾过滤来宾的auvirt输出(为清楚起见已包装)
    # auvirt --vm Fedora Fedora root Tue Jan 24 16:28 - 16:28 (00:00) Fedora root Wed Jan 25 10:31 - 10:34 (00:02) Fedora root Wed Jan 25 13:51 - 13:54 (00:03) Fedora root Wed Jan 25 13:54 - 13:55 (00:00) # auvirt --show-uuid --uuid cabf9532-99f1-3756-930f-59e8f19d4144 Arch cabf9532-99f1-3756-930f-59e8f19d4144 root Wed Jan 25 13:55 - failed Arch cabf9532-99f1-3756-930f-59e8f19d4144 root Wed Jan 25 13:56

    默认情况下,auvirt显示简化的输出。 要显示所有与虚拟化相关的事件,可以指定选项--all-events 。 使用此选项,auvirt将显示每个开始和停止事件,资源分配以及相关事件的记录。 清单5显示了使用--all-events选项的示例。

    清单5.详细的auvirt输出(为清晰起见,已编辑,请参见下载部分以获取此输出的完整版本)
    # auvirt --vm CentOS --all-events down root Wed Jan 25 08:34 res CentOS root Wed Jan 25 10:34 - 13:50 (03:16) cgroup allow major rw pty [...] avc CentOS root Wed Jan 25 10:34 relabelto denied libvirtd CentOS.img system_u:object_r:svirt_image_t:s0:c6,c883 [...] res CentOS root Wed Jan 25 10:34 - 13:50 (03:16) disk start /var/lib/libvirt/images/CentOS.img res CentOS root Wed Jan 25 10:34 - 13:50 (03:16) net start 52:54:00:DB:AE:B4 res CentOS root Wed Jan 25 10:34 - 13:50 (03:16) mem start 1048576 res CentOS root Wed Jan 25 10:34 - 13:50 (03:16) vcpu start 1 start CentOS root Wed Jan 25 10:34 - 13:50 (03:16) [...] stop CentOS root Wed Jan 25 13:50

    第一个字段指示事件类型,该事件类型可以具有以下值:开始,停止,res,avc,异常和关闭(用于主机关闭)。

    资源分配和AVC记录还有其他字段,可提供有关它们的详细信息。 资源分配的其他字段是:

    资源类型:描述可以分配给客户机的资源的不同类型,例如磁盘,虚拟CPU,内存和网络设备等。 此外,可以将libvirt设置为使用Cgroup限制每个来宾使用的资源,并且也将其记录为资源事件。 该字段的可能值为:vcpu,mem,disk,net和cgroup。 原因:指示哪个操作导致了资源分配事件。 例如,可以在客户机启动或运行时将磁盘分配给客户机,在这种情况下,原因值可以分别是“ start”或“ attach”。 对于Cgroup事件,原因字段指示是允许还是拒绝资源,并且其值可以为“允许”或“拒绝”。 资源:是分配给来宾的资源。 这是磁盘资源,兆字节(内存),网络设备的MAC地址以及虚拟CPU的VCPU数量的路径。 对于Cgroups事件,此值由三个部分组成:类型,ACL和资源。

    不会禁止来宾执行auvirt报告的AVC事件,而是拒绝主机中另一个进程执行来宾对来宾资源的访问。 AVC事件的其他字段是:

    操作:是该进程执行的被拒绝的操作。 一些示例是:读取,写入,打开,重新标记为,重新标记为。 运算结果:通常拒绝。 程序:尝试执行拒绝的操作的进程的程序名称。 目标:拒绝操作的目标。 例如,如果主机内部的进程尝试访问来宾的磁盘映像文件,而SELinux拒绝了其访问,则此字段将包含磁盘映像文件名。 上下文:用于relabelto和relabelfrom操作,多一个字段包括指示相关的安全上下文:对于目标上下文relabelto和用于源上下文relabelfrom 。

    访问原始数据

    Auvirt提供了用户友好的输出,不一定包含审计日志中的所有事件信息。 有时,这些附加信息可能很有用,需要访问原始数据才能获得更详细的信息。 Auvirt具有选项--proof可用于显示用于产生在输出每个记录审计事件标识符。

    清单6. Auvirt证明选项
    # auvirt --vm Fedora -ts 01/23/2012 00:00 -te 01/23/2012 17:30 --proof Fedora root Mon Jan 23 17:02 - 17:27 (00:24) Proof: 1327345338.087:41631, 1327346831.548:41702

    清单6显示了auvirt的示例,其中显示了用于创建记录的开始和停止事件标识符。 使用此信息,您可以使用ausearch工具从审核日志中提取原始记录(请参见清单7 )。

    清单7.使用ausearch获取原始记录(为清楚起见而包装)
    # ausearch -a 41631 --start 01/23/2012 17:02:00 --end 01/23/2012 17:27:59 ---- time->Mon Jan 23 17:02:18 2012 type=VIRT_CONTROL msg=audit(1327345338.087:41631): user pid=2433 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:initrc_t:s0 msg='virt=kvm op=start reason=booted vm="Fedora" uuid=7bcae45c-c179-6cea-a185-c7abe50520c7: exe="/usr/sbin/libvirtd" hostname=? addr=? terminal=? res=success'

    本示例使用-a选项,该选项将输出限制为具有给定序列号的记录,以及--start和--end选项,其作用与--end选项相同。 请注意,原始记录包含其他信息,例如原因,可执行文件名称和pid。

    走得更远

    鉴于云计算的日益普及,虚拟化已成为一项杰出的技术。 清楚了解虚拟化环境中发生的事情变得越来越重要。 此外,在与某些行业部门(例如政府或金融部门)打交道时,审计可能是一项强制性要求。 本文概述了可用于过滤与虚拟化相关的主机审核事件的审核工具。 使用这些工具,通过考虑在来宾和主机上都发生的来宾事件,可以为来宾获得更完整的审核跟踪。


    翻译自: https://www.ibm.com/developerworks/linux/library/l-kvm-libvirt-audit/index.html

    相关资源:jdk-8u281-windows-x64.exe
    Processed: 0.046, SQL: 9