如何允许启用 SELinux 的特定 docker 容器访问特定的 X unix 套接字?我更喜欢带有设置的解决方案docker run --security-opt
。
在 fedora 25 上,我发现 docker 守护进程--selinux-enabled
默认运行。--volume
拒绝从主机访问共享文件。设置标志即可允许访问z
。例子:--volume $HOME:$HOME:rw,z
。到目前为止,这适用于常规文件。
比较原子博客:将卷与 Docker 一起使用可能会导致 SELinux 出现问题
该z
标志不足以允许连接到 X unix 套接字。
目前找到的解决方案:
- 使用 docker run 选项禁用特定容器的 SELinux 限制
--security-opt label=disable
。优点:这很简单,工作正常,而且我不需要更改主机上的 SELinux 策略。相反:SELinux 对这一容器的保护根本被禁用。 (目前为止最好的解决方案) - 设置 docker 运行选项
--ipc=host
。优点:简单、有效、SELinux 保持启用状态,无需更改策略。反对:禁用 IPC 命名空间,从而引发另一个安全问题并降低容器隔离。 - 使用建议的
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。
据我了解docker 策略来源,标签container_runtime_t
允许很多特权,比预期的要多得多。
我仍然希望有一个更严格的解决方案。