SELinuxがアクティブな特定のドッカーコンテナが特定のX unixソケットにアクセスできるようにする方法は?私は設定のあるソリューションを好みますdocker run --security-opt
。
Fedora 25では、dockerデーモンがデフォルト--selinux-enabled
で実行されることがわかりました。--volume
ホストの共有ファイルへのアクセスを拒否します。アクセスを許可するフラグを設定しますz
。例: --volume $HOME:$HOME:rw,z
。これまでは通常のファイルで動作します。
Atomicブログの比較:Dockerでボリュームを使用すると、SELinuxに問題が発生する可能性があります。
このz
フラグは、X unixソケットへの接続を許可するのに十分ではありません。
これまでに見つけたソリューション:
- 特定のコンテナのSELinux制限を無効にするには、docker runオプションを使用してください
--security-opt label=disable
。利点:これはシンプルでうまく機能し、ホスト上のSELinuxポリシーを変更する必要はありません。逆に、このコンテナに対するSELinux保護はまったく無効になっています。 (今まで最高のソリューション) - docker実行オプションを設定します
--ipc=host
。利点:シンプルで効果的で、SELinuxは引き続きアクティブであり、ポリシーの変更は不要です。反対:IPC名前空間を無効にして別のセキュリティ問題を引き起こし、コンテナの分離を減らします。 - 以下に提案されている.quoteを使用して
ausearch -c 'xfce4-about' --raw | audit2allow -M my-xfce4about
モジュールを作成します。利点:効果的です。欠点:すべてのコンテナはすべてのX Unixソケットに永久にアクセスできるため、SELinuxポリシーを変更する必要があります。 (今までの最悪の解決策)。
私は次の基準を満たすソリューションを探しています。
- 特定のコンテナが特定のX Unixソケットにアクセスできるようにします。 (複数のアプリケーションが同じコンテナにある可能性があります。)
- ホストのSELinuxポリシーを変更しないでください。
私が想像できる小さな許容可能なソリューションは次のとおりです。
- 任意のコンテナアクセスを許可するように、特定のX Unixソケットのファイルプロパティを変更します。
- すべてのXソケットを許可しますが、特定のコンテナ内でのみ許可されます。
可能な解決策があることを願っています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
)はX unixソケットにアクセスしようとします/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
答え1
部分的な解決策が見つかりました。 docker runオプションを使用すると、--security-opt label=type:container_runtime_t
X unixソケットにアクセスできます。コンテナでSELinuxを無効にする必要はありません。
私が知る限りドッカーポリシーソース、タグはcontainer_runtime_t
予想よりも多くの権限を許可します。
私はまだ少し厳しい解決策を期待しています。