web-dev-qa-db-ja.com

SELinuxおよびdocker:/tmp/.X11-unixのX UNIXソケットへのアクセスを許可

SELinuxが有効になっている特定のDockerコンテナーの特定のX UNIXソケットへのアクセスを許可するにはどうすればよいですか?私はdocker run --security-optの設定のソリューションを好みます。

Fedora 25で、デフォルトで--selinux-enabledで実行されているdockerデーモンを見つけました。 --volumeを使用したホストからの共有ファイルへのアクセスは拒否されます。フラグzを設定してアクセスを許可できます。例:--volume $HOME:$HOME:rw,z。これは、これまでのところ通常のファイルで機能します。

アトミックブログを比較: Dockerでボリュームを使用すると、SELinuxで問題が発生する可能性があります

zフラグは、Xunixソケットへの接続を許可するのに十分ではありません。

これまでに見つかったソリューション:

  • docker runオプション--security-opt label=disableを使用して、特定のコンテナーのSELinux制限を無効にします。プロ:これは簡単で、問題なく機能します。ホストでSELinuxポリシーを変更する必要はありません。対照的に、この1つのコンテナーのSELinux保護はまったく無効になっています。 (これまでのところ、最良の解決策)
  • Docker runオプション--ipc=Hostを設定しています。プロ:シンプルで機能し、SELinuxは有効なままで、ポリシーを変更する必要はありません。反対:IPCネームスペースを無効にするため、別のセキュリティ問題が発生し、コンテナの分離が減少します。
  • 提案されたausearch -c 'xfce4-about' --raw | audit2allow -M my-xfce4aboutを使用してSELinuxポリシーを作成します。作成したモジュールを以下に示します。プロ:それはうまくいきます。反対:すべてのコンテナがすべてのX UNIXソケットに永久にアクセスできるため、SELinuxポリシーを変更する必要があります。 (これまでのところ、最悪の解決策)。

私はこの基準を満たす解決策を探しています:

  • 1つの特定のコンテナが1つの特定のX UNIXソケットにアクセスできるようにします。 (同じコンテナで複数のアプリケーションが可能です)。
  • ホストのSELinuxポリシーを変更しないでください。

私が想像できる許容できるマイナーな解決策:

  • 特定のXUNIXソケットのファイル属性を変更して、任意のコンテナアクセスを許可します。
  • 任意のXソケットを許可しますが、1つの特定のコンテナにのみ許可します。

docker run --security-optでできる解決策を期待しています。


SELinuxによって提案されたモジュール:

module my-xfce4about 1.0;
require {
    type container_t;
    type xserver_t;
    class unix_stream_socket connectto;
}
#============= container_t ==============

#!!!! The file '/tmp/.X11-unix/X0' is mislabeled on your system.  
#!!!! Fix with $ restorecon -R -v /tmp/.X11-unix/X0
allow container_t xserver_t:unix_stream_socket connectto;

AVCの例:コンテナアプリケーション(ここではxfce4-about)は、Xunixソケット/tmp/.X11-unix/X100にアクセスしようとします。ソケットファイルは--volume=/tmp/.X11-unix/X100:/tmp/.X11-unix/X100:rw,zと共有されます。次のSELinux警告が表示されます。

SELinux is preventing xfce4-about from connectto access on 
the unix_stream_socket /tmp/.X11-unix/X100.

*****  Plugin catchall (100. confidence) suggests   **************************
If sie denken, dass es xfce4-about standardmäßig erlaubt sein sollte,
connectto Zugriff auf X100 unix_stream_socket zu erhalten.
Then sie sollten dies als Fehler melden.
Um diesen Zugriff zu erlauben, können Sie ein lokales Richtlinien-Modul erstellen.
Do allow this access for now by executing:
# ausearch -c 'xfce4-about' --raw | audit2allow -M my-xfce4about
# semodule -X 300 -i my-xfce4about.pp

Additional Information:
Source Context                system_u:system_r:container_t:s0:c231,c522
Target Context                unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1 023
Target Objects                /tmp/.X11-unix/X100 [ unix_stream_socket ]
Source                        xfce4-about
Source Path                   xfce4-about
Port                          <Unbekannt>
Host                          localhost.localdomain
Source RPM Packages           
Target RPM Packages           
Policy RPM                    selinux-policy-3.13.1-225.19.fc25.noarch
Selinux Enabled               True
Policy Type                   targeted
Enforcing Mode                Enforcing
Host Name                     localhost.localdomain
Platform                      Linux localhost.localdomain
                          4.11.12-200.fc25.x86_64 #1 SMP Fri Jul 21 16:41:43
                          UTC 2017 x86_64 x86_64
Alert Count                   1
First Seen                    2017-08-17 20:08:13 CEST
Last Seen                     2017-08-17 20:08:13 CEST
Local ID                      b73182b3-ce4f-4507-a821-ad12ae2bc690

Raw Audit Messages
type=AVC msg=audit(1502993293.76:374): avc:  denied  { connectto } for pid=5435
comm="xfce4-about" path="/tmp/.X11-unix/X100"       
scontext=system_u:system_r:container_t:s0:c231,c522 
tcontext=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 
tclass=unix_stream_socket permissive=0

Hash: xfce4-about,container_t,unconfined_t,unix_stream_socket,connectto
4
mviereck

私は部分的な解決策を見つけました:docker run option --security-opt label=type:container_runtime_tはX unixソケットへのアクセスを許可します。コンテナーでSELinuxを無効にする必要はまったくありません。

docker policy source で理解していることから、ラベルcontainer_runtime_tは、意図したよりも多くの特権を許可します。

私はまだより制限的な解決策を望んでいます。

1
mviereck