svirt とは
KVM の仮想マシンプロセスには、svirt_t タイプが設定されて、仮想マシンプロセスからホスト上の不要なリソースへのアクセスは禁止される。しかしながら、すべての仮想マシンプロセスは、同じ svirt_t タイプなので、これだけでは、仮想マシン間の分離が行われない。
そこで、libvirt は、KVM に関連するプロセスやファイルに MCS (Multi Category Security) のカテゴリラベルを付与することにより、仮想マシン間の分離も実現する。
# ps -eZ | grep qemu-kvm system_u:system_r:svirt_t:s0:c210,c691 3874 ? 00:00:47 qemu-kvm # ls -lZ /var/lib/libvirt/images/ -rw-------. qemu qemu system_u:object_r:svirt_image_t:s0:c210,c691 rhel60-nat.img # ps -eZ | grep libvirt system_u:system_r:virtd_t:s0-s0:c0.c1023 1866 ? 00:00:43 libvirtd
上記の例では、仮想マシンプロセス qemu-kvm は、カテゴリが "c210,c691" なので、同じカテゴリのディスクイメージファイル rhel60-nat.img にアクセスできるが、他のカテゴリーのファイルにはアクセスできない。管理デーモンである libvirtd は、c0 〜 c1023 の全カテゴリに属するので、すべての仮想マシンを操作できる。
※ ファイルのカテゴリが "c210,c691" のように複数セットされている場合は、同じカテゴリすべてを持つプロセスからしかアクセスができない。カテゴリは c0 - c1023 の 1024 個しかないが、2個くみあわせることで、より多くのプロセスの分離を実現している。
svirt がカテゴリ設定するエレメント
RHEL6 のマニュアルから転載
タイプ | SID | 説明 |
---|---|---|
Virtual Machine Processes | system_u:system_r:svirt_t:MCS1 | MCS1 is a randomly selected MCS field. Currently approximately 500,000 labels are supported. |
Virtual Machine Image | system_u:object_r:svirt_image_t:MCS1 | Only svirt_t processes with the same MCS fields are able to read/write these image files and devices. |
Virtual Machine Shared Read/Write Content | system_u:object_r:svirt_image_t:s0 | All svirt_t processes are allowed to write to the svirt_image_t:s0 files and devices. |
Virtual Machine Shared Shared Read Only content | system_u:object_r:svirt_content_t:s0 | All svirt_t processes are able to read files/devices with this label. |
Virtual Machine Image | system_u:object_r:virt_content_t:s0 | System default label used when an image exits. No svirt_t virtual processes are allowed to read files/devices with this label. |