問題の結論
Sambaの下に共有ローカルフォルダがありますが、qemu(ユーザーセッションを介して)がvirtio-9pを介してそのフォルダにアクセスできるようにしようとすると、エラー(SELinux avc)が発生します。 SELinuxが無効になっていてもうまくいきますが、うまくいきたいです。そしてSELinux。助けてください。
背景
Fedoraホストにsambaとvirt-manager / qemuをインストールしました。どちらも互いに独立してうまく機能します(たとえば、sambaディレクトリとvmディレクトリは同じドライブにない場合でもまったく異なるパスです)。
私が作業している新しいプロジェクトでは、virt-manager / qemuとSamba(およびdocker / podmanも利用可能)が現在Sambaで共有している既存のホストフォルダにアクセスできるようにしながら、アクセスを制限する方法を探したいと思います。可能なほど良いです。プロトコルを介して共有にアクセスするsmb://
と、2つが同じホストにある場合でも、ネットワークのオーバーヘッドによってわずかなI / Oレイテンシが発生することがわかります。これを行うには、smb://
プロトコルを完全に回避し、VMにvirtio-9pなどを使用して共有ホストフォルダにローカルにアクセスさせたいと思います。また、明確に言えば、これはローカルにマウントされたリモートSamba共有ではなく、私のLAN上の他のコンピュータと共有されるローカルフォルダです。
一部Red Hat ドキュメント、私の仮想マシンがコンテキストでファイルにアクセスできるようにすることができるブール値を見つけましたsamba_share_t
。
virt_use_samba 仮想マシンがCIFSファイルにアクセスできるようにします。
以前はSambaファイルのコンテキストを使用してフォルダを構成していたため:
# setsebool -P samba_export_all_ro=1;
# setsebool -P samba_export_all_rw=1;
# setsebool -P samba_share_fusefs=1;
# sambaShare=/media/d/shared
# semanage fcontext --add --type "samba_share_t" "${sambaShare}(/.*)?"
# sudo restorecon -R "${sambaShare}";
Samba側では、すべてがうまく機能し、問題なく読み書きできます。
今日、私はVMが同じことをするだろうと考えて新しいブールを設定しました。
# setsebool -P virt_use_samba=1
# getsebool -a | grep -P '(smb|cifs|samba|virt_|emu).*on$'
samba_export_all_ro --> on
samba_export_all_rw --> on
samba_share_fusefs --> on
virt_sandbox_use_all_caps --> on
virt_sandbox_use_audit --> on
virt_use_nfs --> on
virt_use_samba --> on
virt_use_usb --> on
xend_run_qemu --> on
しかし、まだエラーが発生します。このホストにはすでにWindows仮想マシンがあるため、プロトコルを介してsmb://
Samba共有にアクセスできます。以前virt_use_samba
この変数を設定します。仮想マシンがプロトコルにアクセスすることを意図しているかどうかはわかりませんが、仮想マシンがファイルsamba_share_t
コンテキストを使用してフォルダにアクセスできるようにしたい場合、Windowsは他の操作を実行しますが、何らかの理由でそうではありません。私のために働くことは、うまくいくか、もう使われていないか、まったく異なることをする場合です。これを排除するために変数を設定した後、システムを再起動しましたが、違いはありませんでした。
一時使用時に設定が機能していることをテストしましたsetenforce 0
。 VM設定を使用してファイルシステムを追加し、VMにマウントして問題なく書き込むこともできます。ただし、SELinuxを再びオンにすると、仮想マシンを起動できなくなります。エラーが発生して再起動する前に、virtio-9pファイルシステムエントリを削除する必要があります。
エラーと構成の詳細
システム
# inxi -Sz
System:
Kernel: 6.6.6-100.fc38.x86_64 arch: x86_64 bits: 64 Console: pty pts/0
Distro: Fedora release 38 (Thirty Eight)
# dnf list installed selinux-policy
Installed Packages
selinux-policy.noarch 38.30-1.fc38 @updates
qemu:///session
また、root(例:)の代わりにユーザー(例:)でvirt-manager / qemuを実行していますqemu:///system
(違いがある場合)。私はこれをgsettings
次のように設定しました。
gsettings set org.virt-manager.virt-manager.connections uris "['qemu:///session']";
gsettings set org.virt-manager.virt-manager.connections autoconnect "['qemu:///session']";
virtio-9pの設定
*注:実際にはvirt-manager GUIを介して手動で設定しましたが、これは生成されたxmlです。私がしている実際のプロセスは(virt-managerで)VMダイアログを開き、詳細タブに移動し、左下にある「ハードウェアの追加」ボタン>ファイルシステム>ドライバ= virtio-9pを選択し、ソースとターゲットのパス>完了ボタン。その後、仮想マシンが起動したら、次のコマンドを使用してマウントします。mount -t 9p -o trans=virtio "${virtualPath}" "${guestMountPoint}"
ここで、virtualPathは以下のxmlで定義されているターゲットパス、guestMountPointはゲストOSのパス(たとえば/media/shared
)です。
<filesystem type="mount" accessmode="mapped">
<source dir="/media/d/shared"/>
<target dir="/virtio-9p/shared"/>
</filesystem>
virt-managerメッセージボックスにエラーが発生しました:
Unable to complete install: 'internal error: qemu unexpectedly closed the monitor: 2023-12-17T04:07:05.237139Z qemu-system-x86_64: -device {"driver":"virtio-9p-pci","id":"fs1","fsdev":"fsdev-fs1","mount_tag":"/virtio-9p/shared","bus":"pci.2","addr":"0x0"}: cannot initialize fsdev 'fsdev-fs1': failed to open '/media/d/shared': Permission denied'
Traceback (most recent call last):
File "/usr/share/virt-manager/virtManager/asyncjob.py", line 72, in cb_wrapper
callback(asyncjob, *args, **kwargs)
File "/usr/share/virt-manager/virtManager/createvm.py", line 2008, in _do_async_install
installer.start_install(guest, meter=meter)
File "/usr/share/virt-manager/virtinst/install/installer.py", line 695, in start_install
domain = self._create_guest(
^^^^^^^^^^^^^^^^^^^
File "/usr/share/virt-manager/virtinst/install/installer.py", line 637, in _create_guest
domain = self.conn.createXML(initial_xml or final_xml, 0)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib64/python3.11/site-packages/libvirt.py", line 4481, in createXML
raise libvirtError('virDomainCreateXML() failed')
libvirt.libvirtError: internal error: qemu unexpectedly closed the monitor: 2023-12-17T04:07:05.237139Z qemu-system-x86_64: -device {"driver":"virtio-9p-pci","id":"fs1","fsdev":"fsdev-fs1","mount_tag":"/virtio-9p/shared","bus":"pci.2","addr":"0x0"}: cannot initialize fsdev 'fsdev-fs1': failed to open '/media/d/shared': Permission denied
SELinuxエラー:
# ausearch -m avc -ts boot
----
time->Sat Dec 16 23:07:05 2023
type=AVC msg=audit(1702786025.235:319): avc: denied { read } for pid=4221 comm="qemu-system-x86" name="shared" dev="dm-4" ino=83951617 scontext=unconfined_u:unconfined_r:svirt_t:s0:c98,c936 tcontext=unconfined_u:object_r:samba_share_t:s0 tclass=dir permissive=0
質問:
問題は、私の仮想マシンにアクセス権がないことを理解していますsamba_share_t
。これまでに行った研究によると、利用可能ないくつかのオプションがあるようです。
ルールを変更することができるかもしれないというヒントをオンラインで見たことがありますが、実際にそうするコマンド/チュートリアルはまったく見たことがありません(たとえば、「既存のファイル形式に不足しているアクセスルールを追加する」など)。この議論)。たとえば、qemu/svirt_t/etc が "samba_share_t" ファイルのコンテキストにアクセスできるようにするなど、既存の SELinux ルールセットを変更すると仮定すると、誰かがこれを行う方法の簡単な例を示すことができますか?あるいは、思ったより複雑な場合は、簡単な10,000フィートの概要とリンクでもいただきありがとうございます。。私はまだSELinuxを学んでおり、正式な教育を受けていません。したがって、有料RH知識ポータルにアクセスできず、公開RH文書が常に最も明確ではないことに注意してください。私が一つ見つけたGentoo WikiのSELinuxページ次にしてみるつもりはここです(どの部分に集中すべきかわからないし、読む内容も多くて、まずここに聞いてみたかったです)。
私はディレクトリ内のファイルコンテキストを変更し
public_context_rw_t
、アクセスを許可するようにselinuxブールを設定できることをオンラインで見ました。私の考えでは、私に必要なようですsetsebool -P smbd_anon_write=1
(またはおそらくsetsebool -P allow_smbd_anon_write 1
? )Sambaがこのコンテキストにアクセスできるようにします。しかし、私が見つけたすべての例は、httpdなどのより広く使用されているサービスに関するものであり、qemu / virt-manager(またはdocker / podman)に設定する必要があるブール名が何であるかわかりません。getsebool -a
出力に名前などの内容は表示されません。私はまた、この方法を使用することが他のサービスでもフォルダにアクセスできるようにするように見えるので、少し躊躇します。このアプローチを取ると仮定すると、qemuとdocker / podmanに対してどのブール値を設定する必要がありますか?私は他の深刻なオプションで開いています(たとえば、ソリューションとして「SELinuxをオフにする」には興味がありません)。
ソリューションに他の関連情報が必要な場合はお知らせください。