SELinux, Nginx e fcgiWrap: como permitir acesso ao soquete fcgiWrap?

SELinux, Nginx e fcgiWrap: como permitir acesso ao soquete fcgiWrap?

Estou no Fedora 31 (kernel Linux 5.4.13, Nginx 1.16.1, fcgiwrap 1.1.0) rodando com SELinux no modo de aplicação (política: direcionado 3.14.4-44.fc31).

Minha caixa hospeda um servidor controlado por Nginx. Parte disso depende de scripts Perl. O Nginx foi configurado para entregar a execução CGI através do FastCGI com fcgiwrap (conexão através de um soquete Unix /var/run/fcgiwrap/[e-mail protegido]).

Tudo foi testado no modo "Permissivo". Em seguida, foi alterado para o modo "Aplicar". Recebi vários AVCs que poderiam ser tratados alterando booleanos ou criando políticas personalizadas, conforme sugerido pelos comentários de auditoria.

No entanto, um AVC não pode ser abordado. Diário diz:

 type=AVC msg=audit(1580046727.459:548): avc:  denied  { connectto } for  pid=4619 comm="nginx" path="/run/fcgiwrap/fcgiwrap-0.sock" scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:system_r:unconfined_service_t:s0 tclass=unix_stream_socket permissive=0

A política personalizada contém o seguinte:

module nginx 1.0;

require {
    type httpd_t;
    type soundd_port_t;
    type http_port_t;
    type tor_port_t;
    type unconfined_service_t;
    type httpd_user_content_t;
    class tcp_socket { name_bind name_connect };
    class file { getattr read };
    class unix_stream_socket connectto;
}

#============= httpd_t ==============

#!!!! This avc is allowed in the current policy
allow httpd_t http_port_t:tcp_socket name_connect;

#!!!! This avc is allowed in the current policy
allow httpd_t httpd_user_content_t:file { getattr read };
allow httpd_t soundd_port_t:tcp_socket name_bind;

#!!!! This avc is allowed in the current policy
allow httpd_t tor_port_t:tcp_socket name_connect;
allow httpd_t unconfined_service_t:unix_stream_socket connectto;

Como pode ser visto nos comentários gerados automaticamente, esta política personalizada não tem efeito porque já está incluída na política global.

Depois de adicionar este módulo, nada muda. Ainda recebo alertas AVC sugerindo a mesma correção.

Se eu reverter para "Permissivo" ou se definir o domíniohttpdno modo permissivo, os scripts CGI são executados e recebo a saída esperada.

ls -Z /var/run/fcgiwrap/fcgiwrap-0.sockretorna:

system_u:object_r:httpd_var_run_t:s0 /var/run/fcgiwrap/fcgiwrap-0.sock

Não consegui descobrir onde o rótulo httpd_var_run_tfoi usado e se um booleano controlava o acesso a esse tipo de arquivo (sou um novato na configuração do SELinux).

Como posso conceder acesso ao soquete no modo "Enforcing"?

EDITAR 2020-01-27

Parece que já existe uma regra de transição no móduloapachepara:

allow httpd_t unconfined_service_t:unix_stream_socket connectto;

mas é ineficaz ou outro módulo (qual?) está bloqueando. A solução temporária é colocar o domíniohttpdno modo permissivo, mas não gosto porque agora qualquer servidor web pode fazer qualquer coisa.

Alguma ideia de por que a transição foi negada?

Responder1

Não verifiquei ou testei isso adequadamente - na verdade, tenho certeza de que isso por si só não funcionará.

Presumo que a criação do caminho /var/run/fcgiwraptenha o tipo de diretório unconfined_service_te não tenho certeza se esse é realmente o caso.

No entanto, isso deve ajudá-lo a começar.

policy_module(nginx_local, 31.0.0)

require {
  type httpd_t;
  type unconfined_service_t;
}

stream_connect_pattern(httpd_t, unconfined_service_t, unconfined_service_t, unconfined_service_t)

Quanto aos problemas de rede, você pode querer apenas ativar o booleano, httpd_can_network_connecto que já deve silenciar alguns deles. A menos que você queira ser específico sobre isso.

Nas circunstâncias melhores e ideais, seria ideal criar uma política específica para seus processos fcgi, mas isso é uma tarefa muito mais difícil, portanto, fazer com que o nginx interaja apenas com serviços não confinados - embora menos seguros - é muito mais fácil.

informação relacionada