利用 libvirt 和 Linux 审计子系统跟踪 KVM 客户机

来源:互联网 发布:复古休闲鞋知乎 编辑:程序博客网 时间:2024/04/29 21:03

在虚拟环境中审计和过滤客户机和主机事件

Marcelo H. Cerri, 软件工程师, IBM
Marcelo Cerri 的照片
Marcelo Cerri 是位于巴西 IBM Linux Technology Center 的软件工程师,他是 Security Development 团队的成员,从事云和虚拟化相关项目的工作。他的背景还包括开发云计算平台和电信记账系统。

简介: Libvirt 是一种重要工具,用于管理 Linux 主机上的虚拟化环境。对执行 libvirt 期间主机上发生的事件进行审计跟踪通常是实现监视、遵从性、讨论和其他目所需要的。本文将介绍如何在主机上使用 Linux 审计子系统跟踪 执行的操作,以及如何将这些事件与其他主机事件关联起来,从而对 libvirt 执行的变更提供一致且综合的视图。

发布日期: 2012 年 6 月 25 日
级别: 中级 原创语言: 英文
访问情况 : 7842 次浏览
评论:  (查看 | 添加评论 - 登录)

平均分 1 星 共 1 个评分 平均分 (1个评分)
为本文评分

概述

Libvirt 被广泛应用于管理 Linux® 上的虚拟化环境。它提供了各种丰富的功能,包括客户机生命周期管理、资源分配、资源管理(使用 cgroups),以及通过 SELinux 实现安全强制 (security enforcement) 等。所有这些操作均是由 libvirt 执行,主要处理被分配给客户机或从客户机释放的主机资源。

从 0.9.0 版本开始,libvirt 就能够与主机上的 Linux 审计子系统通信,发出有关若干操作的记录。这是一项重要特性,允许系统管理员、审计员,甚至其他应用程序访问虚拟化环境中详细的变更历史,包括客户机生命周期操作,以及主机资源到客户机的分配变化。

Linux 审计子系统能够处理来自不同来源的许多种操作,而不仅仅是 libvirt 发出的与虚拟化有关的事件。审计系统常用于跟踪文件变更、来自 SELinux 或 AppAmor 的安全拒绝 (security denial),以及系统调用。这些不同的事件包含对虚拟机审计有用的信息。

例如,SELinux 策略可能禁止访问某个分配给客户机的资源,这将生成一个 AVC (Access Vector Cache) 拒绝记录。尽管该事件不是由 libvirt 发出,但是它与一个客户机关联。类似地,许多事件都可以与客户机关联,其中包含由内核或用户空间内的程序生成的异常事件。

在下一节中,我们将快速了解审计系统如何工作,libvirt 如何与之交互,以及如何从审计日志获取与客户机相关的信息。

审计基础知识

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

Linux 审计系统的核心组件就是内核。由其他组件生成的所有事件首先将被发送给内核。在内核中,将应用一系列规则来决定是否应当丢弃某个事件。图 1 展示了构成 Linux 审计系统的组件。


图 1. 审计系统组件
审计子系统的组件图

内核中的审计规则可以通过 auditctl 命令修改。一些具有特殊功能的应用程序,如 libvirt daemon,被认为是可信任的应用程序,能够向内核发送审计事件。在应用了规则后,内核向audit daemon 发送审计事件。然后 audit daemon 将记录写入到磁盘,并使用 auditspd daemon 分配定制操作。

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

需要注意审计事件和审计记录之间的区别。审计事件是由受审计的用户或应用程序所发起的一个操作,例如:文件打开事件就是一个可以受审计的事件。此外,审计记录包含仅与事件的某个方面有关的信息。因此,一个事件可能跨越审计日志中的一个或多个记录。以文件打开为例,该事件可以生成两条记录,一条记录包含与被调用的开放 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 和 Audit

Libvirt 实际上生成三种类型的记录。它们都包含一条通用记录,“uuid” 字段。这是一个 Universal Unique Identifier,标识所有记录中 libvirt 发出的客户机。libvirt 使用的记录类型为:

  • VIRT_CONTROL:在虚拟机生命周期的每个阶段生成。它将在客户机启动或停止时生成,并且包含运行原因和客户机名称等字段。
  • VIRT_MACHINE_ID:它是在 libvirt 尝试向客户机分配安全标签时生成的。在对 QEMU 使用 sVirt 时,该记录将包含 QEMU 流程的安全标签和分配给客户机的磁盘安全标签。
  • VIRT_RESOURCE:该类型的记录在客户机的资源分配出现变化时生成,例如,当从客户机中移除磁盘,或向客户机连接一个新的网络设备。

Auvirt

auvirt 工具将搜索审计日志,查找由 libvirt 生成的记录,展示虚拟机会话列表。它还查找其他一些事件,如主机宕机、与客户机有关的 AVC 拒绝事件,以及与 QEMU 有关的异常事件。清单 2 展示了一个 auvirt 输出例子。第一个字段为客户机名称。第二个为启动客户机的用户。第三个为客户机运行的时间范围。注意,示例中 “Arch” 的执行已失败,而另一个仍然保持运行。


清单 2. Auvirt 输出
# auvirtFedora                 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 - failedArch                   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/2012Fedora                  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 - failedArch                    root        Wed Jan 25 13:56

也可以将结果限制到一个客户机。该客户机可以通过客户机名称或客户机的 UUID 指定。默认情况下,为了保持输出简单,工具不会显示 UUID,但是您可以通过 --show-uuid 选项在输出中包含它。


清单 4. 按客户机名称和 UUID 过滤 auvirt 输出(使用独立区域显示以清晰呈现)
# auvirt --vm FedoraFedora                  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 - failedArch                    cabf9532-99f1-3756-930f-59e8f19d4144    root  Wed Jan 25 13:56

默认情况下,auvirt 将显示一个简化的输出。要展示所有与虚拟化有关的事件,可以使用 --all-events 选项。使用该选项后,auvirt 将展示每个起始和结束事件、资源分配和相关事件的记录。清单 5 展示了使用 --all-events 选项的例子。


清单 5. 详细的 auvirt 输出(为了清晰显示进行了编辑,参见下载部分获得完整的输出)
# auvirt --vm CentOS --all-eventsdown                            root            Wed Jan 25 08:34res   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.imgres   CentOS                    root            Wed Jan 25 10:34 - 13:50  (03:16) net             start           52:54:00:DB:AE:B4res   CentOS                    root            Wed Jan 25 10:34 - 13:50  (03:16) mem             start           1048576res   CentOS                    root            Wed Jan 25 10:34 - 13:50  (03:16) vcpu            start           1start CentOS                    root            Wed Jan 25 10:34 - 13:50  (03:16)[...]stop  CentOS                    root            Wed Jan 25 13:50

第一个字段表示事件类型,包含以下值:start、stop、res、avc、anom 和 down(表示主机宕机)。

资源分配和 AVC 记录包含额外的字段,提供相关的信息。资源分配中的额外字段包括:

  • 资源类型:描述可分配给客户机的不同的资源类型,如磁盘、虚拟 CPU、内存和网络设备等。此外,libvirt 可以通过 Cgroups 设置为限制每个客户机使用的资源,这也被记录为一个资源事件。该字段的可能值包括:vcpu、mem、disk、net 和 cgroup。
  • 原因:表示哪个操作引起资源分配事件。例如,当客户机启动或运行时,可以将一个磁盘分配给客户机,对于这些情况,原因值可以为 “start” 或 “attach”。对于 Cgroups 事件,原因字段表示是否允许或拒绝某个资源,它的值可以为 “allow” 或 “deny”。
  • 资源:指分配给客户机的资源。路径用于磁盘资源,兆字节用于内存,MAC 地址用于网络设备,VCPU 数量用于虚拟 CPU。对于 Cgroups 事件,该值由三个部分组成:类型、ACL 和资源。

auvirt 报告的 AVC 事件表示客户机执行的访问没有被拒绝,而主机中另一个进程对客户机资源进行的访问被拒绝。AVC 事件包含的额外字段包括:

  • 操作:指流程执行的操作被拒绝。例子包括:read、write、open、relabelto 和 relabelfrom。
  • 操作结果:通常为拒绝。
  • 程序:尝试执行拒绝操作的流程的程序名。
  • 目标:拒绝操作的目标。例如,如果主机内部的一个流程试图访问客户机的磁盘映像文件,并且访问被 SELinux 拒绝,那么该字段将包含磁盘映像文件名。
  • 上下文:对于 relabeltorelabelfrom 操作,额外又包含了字段,表示相关的安全上下文:relabelto 的目标上下文和relabelfrom 的源上下文。

访问原始数据

Auvirt 提供了用户友好的输出,不必包含审计日志中的所有事件信息。有时,这些额外的信息可能有用,需要访问原始数据来获得更详细的信息。Auvirt 包含 --proof 选项,可用于显示审计事件标识符(用于生成输出中的每条记录)。


清单 6. Auvirt --proof 选项
# 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 选项,它们与 auvirt 选项的工作方式相同。注意,原始记录包含了额外的信息,如原因、可执行文件名称和 pid。


结束语

云计算正在变得越来越普及,虚拟化开始成为一项主流技术。清晰地理解虚拟化环境中发生的变化变得愈加重要。此外,对于某些特定的行业,如政府和金融,审计也成为一项必须满足的要求。本文介绍了可用于过滤与虚拟化相关的主机审计事件的审计工具。通过使用这些事件,您可以了解到主机和客户机上发生的客户机事件,从而获得更加全面的客户机审计跟踪。


参考资料

学习

  • 查看 Linux Audit 网站,以下载最新版本。

  • 访问 Libvirt 网站,获得最新消息并了解有关 libvirt 的更多内容。

  • 在 “Guide to the Secure Configuration of Red Hat Enterprise Linux 5”(National Security Agency,2010 年 9 月)中,了解更多 Red Hat Enterprise Linux (RHEL) 5 操作系统的安全配置建议。第 2.6.2 小节描述了如何配置和使用 Linux 审计子系统。

  • developerWorks 中国网站开源技术专区 提供了有关开源工具和使用开源技术的丰富信息。

  • developerWorks 中国网站 Web 开发专区 专门提供各种基于 Web 解决方案的文章。

  • 查看 developerWorks 演示中心,那里提供了从初学者的产品安装和配置演示,到面向有经验开发人员的高级功能。

  • developerWorks Linux 专区 寻找为 Linux 开发人员(包括Linux 新手入门)准备的更多参考资料,查阅我们最受欢迎的文章和教程

  • 在 developerWorks 上查阅所有 Linux 技巧Linux 教程

  • 随时关注 developerWorks 技术活动网络广播

获得产品和技术

  • 以最适合您的方式 IBM 产品评估试用版软件:下载产品试用版、在线试用产品、在云环境中使用产品,或在 IBM SOA 人员沙箱 中学习如何高效地实现面向服务的架构。

讨论

  • 加入 Linux Audit 邮件列表,讨论或获取与 Linux 审计子系统相关问题的答案。

  • 加入 developerWorks 中文社区,developerWorks 社区是一个面向全球 IT 专业人员,可以提供博客、书签、wiki、群组、联系、共享和协作等社区功能的专业社交网络社区。

  • 加入 IBM 软件下载与技术交流群组,参与在线交流。

关于作者

Marcelo Cerri 的照片

Marcelo Cerri 是位于巴西 IBM Linux Technology Center 的软件工程师,他是 Security Development 团队的成员,从事云和虚拟化相关项目的工作。

原创粉丝点击