SELinuxはqemu / libvirtがISOにアクセスするのを防ぎます。

SELinuxはqemu / libvirtがISOにアクセスするのを防ぎます。

libvirtがデフォルトのlibvirtディレクトリの外側のイメージとISOファイルにアクセスできるように、selinuxを取得できません。もっと残念なことは、audit.logに失敗したエントリがあるにもかかわらず、audit2allowとsetroubleshooterには問題が見つからないことです。

type=VIRT_CONTROL msg=audit(1576848063.439:6601): pid=1265 uid=0 auid=4294967295 ses=4294967295 \
subj=system_u:system_r:virtd_t:s0-s0:c0.c1023 msg='virt=kvm op=start reason=booted vm="Unifi" uuid=37eed7bf-a37f-4d49-86c2-b9a6bb8682c3 \
vm-pid=-1 exe="/usr/sbin/libvirtd" hostname=? addr=? terminal=? res=failed'UID="root" AUID="unset"

ビデオ

-rw-------+ 1 root root system_u:object_r:svirt_image_t:s0            53695545344 Dec 20 08:31 unifi.qcow2

国際標準化機構

-rw-rwxr--+  1 qemu    qemu system_u:object_r:virt_content_t:s0                   851443712 Sep 29  2018  ubuntu-18.04.1-live-server-amd64.iso

私のfile_contexts.localファイルには次のエントリが含まれていますが、訓練を受けていない人の目には問題ありません。

/data/libvirt(/.*)?    system_u:object_r:svirt_image_t:s0
/data/archive/ISO(/.*)?    system_u:object_r:svirt_image_t:s0

アイデア?

編集2(ABが要求した更新):

デバッグされたSELinux出力を有効にします。

type=AVC msg=audit(1577807557.017:10195): avc:  denied  { search } for  pid=13605 comm="qemu-kvm" name="/" dev="dm-8" ino=2 scontext=system_u:system_r:svirt_t:s0:c682,c798 tcontext=system_u:object_r:container_file_t:s0:c132,c155 tclass=dir permissive=0
    Was caused by:

#Constraint rule:

#   mlsconstrain dir { ioctl read lock search } ((h1 dom h2 -Fail-)  or (t1 != mcs_constrained_type -Fail-) ); Constraint DENIED

#   Possible cause is the source level (s0:c682,c798) and target level (s0:c132,c155) are different.

Audit2allow -i /var/log/audit/audit.log -m qemu-kvm

module qemu-kvm 1.0;

require {
    type initrc_t;
    type container_file_t;
    type setroubleshootd_t;
    type NetworkManager_t;
    type svirt_t;
    type system_dbusd_t;
    class process { noatsecure rlimitinh siginh };
    class dir search;
    class capability net_admin;
}

#============= NetworkManager_t ==============
allow NetworkManager_t initrc_t:process { noatsecure rlimitinh siginh };

#============= svirt_t ==============

#!!!! This avc is a constraint violation.  You would need to modify the attributes of either the source or target types to allow this access.
#Constraint rule: 
#   mlsconstrain dir { ioctl read lock search } ((h1 dom h2 -Fail-)  or (t1 != mcs_constrained_type -Fail-) ); Constraint DENIED

#   Possible cause is the source level (s0:c682,c798) and target level (s0:c132,c155) are different.
allow svirt_t container_file_t:dir search;

#============= system_dbusd_t ==============
allow system_dbusd_t self:capability net_admin;
allow system_dbusd_t setroubleshootd_t:process { noatsecure rlimitinh siginh };

編集:これは私が受け取ったエラーです。ラベルが正しく表示され、qemuのファイル権限がrwxに設定されています。

Error starting domain: internal error: process exited while connecting to monitor: 2019-12-20T15:34:53.600905Z qemu-kvm: -drive file=/data/archive/ISO/ubuntu-18.04.1-live-server-amd64.iso,format=raw,if=none,id=drive-sata0-0-0,media=cdrom,readonly=on: Could not open '/data/archive/ISO/ubuntu-18.04.1-live-server-amd64.iso': Permission denied

Traceback (most recent call last):
  File "/usr/share/virt-manager/virtManager/asyncjob.py", line 75, in cb_wrapper
    callback(asyncjob, *args, **kwargs)
  File "/usr/share/virt-manager/virtManager/asyncjob.py", line 111, in tmpcb
    callback(*args, **kwargs)
  File "/usr/share/virt-manager/virtManager/object/libvirtobject.py", line 66, in newfn
    ret = fn(self, *args, **kwargs)
  File "/usr/share/virt-manager/virtManager/object/domain.py", line 1279, in startup
    self._backend.create()
  File "/usr/lib/python3/dist-packages/libvirt.py", line 1080, in create
    if ret == -1: raise libvirtError ('virDomainCreate() failed', dom=self)
libvirt.libvirtError: internal error: process exited while connecting to monitor: 2019-12-20T15:34:53.600905Z qemu-kvm: -drive file=/data/archive/ISO/ubuntu-18.04.1-live-server-amd64.iso,format=raw,if=none,id=drive-sata0-0-0,media=cdrom,readonly=on: Could not open '/data/archive/ISO/ubuntu-18.04.1-live-server-amd64.iso': Permission denied

ファイル権限

getfacl /data/libvirt/images
getfacl: Removing leading '/' from absolute path names
# file: data/libvirt/images
# owner: qemu
# group: qemu
# flags: ss-
user::rwx
group::rwx
other::--x
default:user::rwx
default:user:qemu:rwx
default:group::rwx
default:group:qemu:rwx
default:mask::rwx
default:other::--x

答え1

標準SELinuxトラブルシューティングプロセス:

  1. 問題は再現できますか?その場合は2に進みます。
  2. 許可モードで動作できますか?その場合は3に進みます。
  3. SELinuxはイベントを記録しますか?ausearch -m avc,user_avc,selinux_err -i。その場合は、これを説明し、/またはaudit2whyがあなたのために説明するようにしてください。それ以外の場合は4に進みます。
  4. 実行してsemodule -DBSELinuxを冗長にし、問題を再現して3に戻ります。

SELinux がブロックされると、SELinux が記録されます。ソリューションを実装する前に問題を説明できるように、事故記録が必要です。

SELinuxイベントログを提供していないので、現在は推測しかできません。それ可能カスタムマウントポイントのラベルに関連付けられています/data。 libvirtが巡回できない場合、/data画像に到達できません。

答え2

この情報を見つけるのに必要な情報を提供してくれたdac.overrideとABに感謝します。

最上位ディレクトリ "/data" を調べるとラベルが表示されます。

system_u:object_r:container_file_t:s0:c132,c155

これは、「/data/libvirt」ディレクトリを含むサブディレクトリにも表示されます。これは、「/data」ディレクトリをバックアップするために毎日実行されるコンテナが原因で発生します。コンテナは次のコマンドを使用してこのディレクトリをマウントします。

-v /data:/data:ro,Z

これは生産コンテナの作業中に起こった習慣です。に変更

-v /data:/data:ro,z

libvirt をブロックせずにバックアップを実行できるようにします。今、私たちは次のラベルを取得します。

system_u:object_r:container_file_t:s0

これはベストプラクティスではない可能性が高いです。それでも私のプライベートサーバーには十分です。他のすべてのコンテナとサービスは別々の仮想マシンで実行され、ホストはホストにすぎません。

答え3

に関連するエラーがある場合は、新規インストールする場合は、audit.log次のものを使用できます。audit2allow正しい SELinux 設定が自動的に作成されます。私は個人的に新しくインストールしたときにのみこのプログラムを実行します。注意しないと、承認されていないソフトウェアSELinux例外が許可される可能性があるためです。

  1. SELinuxがモードで実行されていることを確認してくださいPermissive
  2. 拒否が/var/log/audit.logに記録されていることを確認してください。何もない場合は、semodule -DB問題のあるプログラムを再実行し、実行するとログが生成されます。完了したら、実行してsemodule -B詳細なロギングを無効にします。
  3. 実行audit2allow -w -a- 人間が読める形式で何がブロックされているかを示します。
  4. audit2allow -a拒否されたアクセスを許可するタイプ適用規則を表示するには、実行してください。
  5. 上記の出力に同意すると、実行してaudit2allow -a -M newrulesカスタムモジュールを作成します。このオプションは、次のように指定された名前を使用して、現在の作業ディレクトリに-Mタイプ強制ファイル(.te)を生成します。-M
  6. モジュールを取り付けるには、以下を実行します。semodule -i newrules.pp
  7. SELinuxをEnforcingテスト機能に設定します。

onlyアプリケーションが不要な場合はSELinuxをバイパスすることができますので、構築している新しいサーバーでそれを実行することをお勧めします。これは本番サーバーでは危険です。何度も言及した場合は、audit2allowRed Hatのマニュアルに記載されているとおりに使用できます。grep公式ドキュメントについてはaudit2allowリンクをご覧ください。

答え4

仮想マシンが読み取り/書き込みコンテンツを共有できるようにするには、イメージフォルダに適切なラベルを付ける必要があります。タグには型が必要です。svirt_image_t:s0

semanage fcontext -a -t svirt_image_t "/data/libvirt/images(/.*)?"
restorecon -vR /data/libvirt/images

インストールした場合、contextオプションとして追加:

mount ... /data/libvirt/images -o context="system_u:object_r:svirt_image_t:s0"
// keep default for user and role, but type is important:    ^--------------^ 

SELinux は VM/QEMU/virt-manager から ISO アクセスを許可するようになりました。

関連情報