CentOS 7 - Diretórios criados através do VSFTPD não herdam os contextos do SELinux

8

Nossa empresa tem um servidor web com o CentOS 7 e nossos clientes gerenciam seus sites através do FTP (vsftpd). O SELinux está em modo de execução.

A questão é que os dados criados / uploadad através do VSFTPD não herdam o contexto apropriado do SELinux. Deixe-me explicar.

Por exemplo, para sites do WordPress, o servidor já possui algumas regras que podem ser vistas usando semanage fcontext -l |grep '/var/www' , que são:

/var/www/html(/.*)?/uploads(/.*)?                  all files          system_u:object_r:httpd_sys_rw_content_t:s0
/var/www/html(/.*)?/wp-content(/.*)?               all files          system_u:object_r:httpd_sys_rw_content_t:s0

Assim, quando copio um site WordPress, digamos que de outro servidor para um diretório em /var/www/html/ por SSH, as pastas wp-content/ e wp-content/uploads/ têm o contexto de segurança httpd_sys_rw_content_t adequado. Entretanto, quando essas pastas são criadas através do FTP, o contexto que elas obtêm é httpd_sys_content_t (no rw ). Isso significa que os sites que nossos clientes enviam para o servidor não podem gravar nesses diretórios, mesmo que eles forneçam permissões de gravação ao usuário / grupo do apache, para que o admin do WordPress não funcione. Então, quando eles fazem o upload de um site, eles precisam solicitar nosso suporte para consertar isso, o que é um desperdício de tempo para todos os envolvidos.

Digamos que o cliente tenha feito o upload do site em httpdocs , se, por meio do SSH, eu mv httpdocs/ httpdocs.2/ && cp -pr httpdocs.2/ httpdocs/ && rm httpdocs.2/ -fr o problema for resolvido, não há nada de errado com os dados.

Também posso fazer restorecon -Rv httpdocs/ para corrigir o problema.

Então, a pergunta é: Como posso ter os diretórios criados / enviados através do VSFTPD herdando os contextos apropriados do SELinux assim como eles são herdados quando os diretórios são criados / enviados através do SSH?

    
por Juan Pablo Barrios 02.04.2016 / 00:17

1 resposta

6

Há uma diferença entre a rotulagem padrão que ocorre no tempo de execução e a política de pós-rotulagem baseada em expressão regular que se aplica ao servidor.

O que você está anotando aqui:

/var/www/html(/.*)?/uploads(/.*)?                  all files          system_u:object_r:httpd_sys_rw_content_t:s0
/var/www/html(/.*)?/wp-content(/.*)?               all files         system_u:object_r:httpd_sys_rw_content_t:s0

É a política de rotulagem de postagem.

O que você discute no seu problema realmente está relacionado à política de tempo de execução.

Quando uma entrada é criada em um diretório usando o SELinux, as regras que governam o rótulo que o arquivo ou diretório acaba sendo não são ditadas pelas expressões regulares que você cita, mas outras regras como segue (acredito que esta é a ordem correta, mas pode ter perdeu alguma coisa).

  1. Existe uma regra explícita denominada type_transition .
  2. Existe uma regra explícita não nomeada type_transition .
  3. Herdar o mesmo contexto que o diretório pai.
  4. Aplique o default_context .

So, when I copy a WordPress site let's say from another server into a directory in /var/www/html/ by SSH, the folders wp-content/ and wp-content/uploads/ have the proper httpd_sys_rw_content_t security context.

Então, sim, isso é feito, mas não pelo motivo que você pensa. Certamente não por causa da política de rotulagem.

Isso ocorre porque existe uma regra específica denominada type_transition que fornece esse comportamento.

$ sesearch -C -T -s unconfined_t -t httpd_sys_content_t -c dir

Found 4 named file transition filename_trans:
type_transition unconfined_t httpd_sys_content_t : dir httpd_sys_rw_content_t "wp-content"; 
type_transition unconfined_t httpd_sys_content_t : dir httpd_sys_rw_content_t "smarty"; 
type_transition unconfined_t httpd_sys_content_t : dir httpd_sys_rw_content_t "uploads"; 
type_transition unconfined_t httpd_sys_content_t : dir httpd_sys_rw_content_t "upgrade"; 

Isso está basicamente dizendo.

  • Se você é unconfined_t e
  • Se você estiver executando uma ação no tipo de destino httpd_sys_content_t e
  • Se a classe da nova entrada for um diretório e
  • Se o nome da nova entrada for "uploads" , então
  • O novo tipo é httpd_sys_rw_content_t

A razão pela qual isso funciona para o SSHD é porque depois de efetuar login você está recebendo o contexto de origem de unconfined_t para o qual esta regra se aplica.

Isso não funciona para o serviço FTP porque o contexto de origem deste serviço é provavelmente ftpd_t , o qual não possui regras correspondentes.

Como tal, você precisaria modificar a política para alterar o comportamento do SELinux para também honrar as regras de arquivo nomeadas que você vê nas outras entradas para o FTP também.

No Fedora 23, pelo menos, existe uma interface para permitir isso, um módulo de políticas como este faria isso.

policy_module(local_ftpd, 7.2.0)

require {
  type ftpd_t;
}

apache_filetrans_named_content(ftpd_t)

Você pode carregar isso garantindo que o pacote selinux-policy-devel esteja instalado e executando make -f /usr/share/selinux/devel/Makefile load .

    
por 02.04.2016 / 21:44