SELinux 및 docker: /tmp/.X11-unix의 X unix 소켓에 대한 액세스를 허용합니다.

SELinux 및 docker: /tmp/.X11-unix의 X unix 소켓에 대한 액세스를 허용합니다.

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_tX unix 소켓에 액세스할 수 있습니다. 컨테이너에서 SELinux를 비활성화할 필요가 전혀 없습니다.

내가 아는 한도커 정책 소스, 태그는 container_runtime_t예상보다 많은 권한을 허용합니다.

나는 여전히 좀 더 엄격한 해결책을 기대하고 있습니다.

관련 정보