fedora – SELinux和docker:允许访问/tmp/.X11-unix中的X unix套接字

如何在启用SELinux的情况下允许访问特定Docker容器的特定X unix套接字?
我更喜欢使用docker run -security-opt设置的解决方案.

在fedora 25上,我发现docker守护进程运行时默认启用了–selinux.
使用–volume从主机访问共享文件被拒绝.可以允许访问设置标志z.示例: – volume $HOME:$HOME:rw,z.到目前为止,这适用于常规文件.

比较原子博客:Using Volumes with Docker can Cause Problems with SELinux

z标志不足以允许连接到X unix套接字.

到目前为止发现的解

>使用docker run选项禁用特定容器的SELinux限制–security-opt label = disable.亲:这很简单,工作正常,我不需要在主机上更改SELinux策略. Contra:对这一个容器的SELinux保护完全禁用. (到目前为止,最好的解决方案)
>设置docker run选项–ipc = host. Pro:简单,有效,SELinux保持启用状态,无需更改策略. Contra:禁用IPC命名空间,从而打开另一个安全问题并减少容器隔离.
>使用建议的ausearch -c’xfce4-about’-raw |创建SELinux策略audit2allow -M my-xfce4about.创建的模块如下所述.亲:它有效. Contra:所有容器都可以永久访问所有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
最佳答案
我发现了一个部分解决方案:docker run选项–security-opt label = type:container_runtime_t允许访问X unix套接字.
根本不需要在容器中禁用SELinux.

根据我在docker policy source中的理解,标签container_runtime_t允许许多特权,远远超过预期.

我仍然希望有一个更严格的解决方案.

转载注明原文:fedora – SELinux和docker:允许访问/tmp/.X11-unix中的X unix套接字 - 代码日志