めもめも

このブログに記載の内容は個人の見解であり、必ずしも所属組織の立場、戦略、意見を代表するものではありません。

SELinux 入門 (4) - svirt

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.