SELinux e docker: permite acesso ao soquete X unix em /tmp/.X11-unix

4

Como permitir o acesso a um determinado soquete unix X para um contêiner docker específico com o SELinux ativado? Eu prefiro uma solução com uma configuração de docker run --security-opt .

No fedora 25, encontrei o daemon do docker rodando com --selinux-enabled por padrão. O acesso aos arquivos compartilhados do host com --volume é negado. O acesso pode ser permitido definindo o sinalizador z . Exemplo: --volume $HOME:$HOME:rw,z . Isso funciona para arquivos regulares até o momento.

Compare o blog da atomic: Usando volumes com o Docker pode causar problemas com o SELinux

O sinalizador z não é suficiente para permitir conexões com um soquete X unix.

Soluções encontradas até agora:

  • desativando as restrições do SELinux para o contêiner específico com a opção de execução do docker --security-opt label=disable . Pro: Isso é fácil, funciona bem e eu não preciso alterar as políticas do SELinux no host. Contra: As proteções do SELinux para este contêiner estão desativadas. (Até agora, a melhor solução)
  • Configuração da opção de execução do docker --ipc=host . Pro: simples, funciona, o SELinux permanece ativado, nenhuma mudança de política é necessária. Contra: Desativa o namespace do IPC, abrindo outro problema de segurança e reduzindo o isolamento do contêiner.
  • Criando uma política do SELinux com ausearch -c 'xfce4-about' --raw | audit2allow -M my-xfce4about sugerido. O módulo criado é citado abaixo. Pro: funciona. Contra: Todos os contêineres têm acesso a todos os soquetes unix X para sempre, e eu tenho que alterar as políticas do SELinux. (Até agora, a pior solução).

Estou procurando uma solução que atenda a esse critério:

  • Permitir um acesso específico ao contêiner a um soquete X unix específico. (Vários aplicativos no mesmo contêiner são possíveis).
  • Não altere a política do SELinux no host.

Soluções menores aceitáveis que posso imaginar:

  • alterando os atributos de arquivo do soquete X unix particular para permitir acesso arbitrário ao contêiner.
  • permitindo soquetes X arbitrários, mas apenas para um contêiner específico.

Espero por uma solução que possa ser feita com docker run --security-opt .

Módulo sugerido pelo 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;

Exemplo de AVC: Um aplicativo de contêiner (aqui: xfce4-about ) tenta acessar um soquete x do unix /tmp/.X11-unix/X100 . O arquivo de soquete é compartilhado com --volume=/tmp/.X11-unix/X100:/tmp/.X11-unix/X100:rw,z . Eu recebo este aviso do 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
    
por mviereck 17.08.2017 / 20:53

1 resposta

1

Eu encontrei uma solução parcial: a opção de execução do docker --security-opt label=type:container_runtime_t permite acesso a soquetes X unix. Não é necessário desativar o SELinux no contêiner.

Pelo que entendi na fonte da política do docker , o marcador container_runtime_t permite muitos privilégios, muito mais do que o pretendido.

Eu ainda espero por uma solução mais restritiva.

    
por 22.08.2017 / 22:44