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

8

Nossa empresa possui um servidor web com o CentOS 7 e nossos clientes gerenciam seus sites por FTP (vsftpd). O SELinux está no modo de imposição.

O problema é que os dados criados / enviados pelo VSFTPD não estão herdando o contexto apropriado do SELinux. Deixe-me explicar.

Por exemplo, para sites 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

Portanto, quando copio um site WordPress, digamos de outro servidor para um diretório /var/www/html/do SSH, as pastas wp-content/e wp-content/uploads/o httpd_sys_rw_content_tcontexto de segurança adequado . NO ENTANTO, quando essas pastas são criadas por FTP, o contexto que elas obtêm é httpd_sys_content_t(sem rw ). Isso significa que os sites que nossos clientes carregam no servidor não podem gravar nesses diretórios, mesmo que concedam permissões de gravação ao usuário / grupo apache, para que o administrador do WordPress não funcione. Portanto, quando eles enviam um site, precisam solicitar nosso suporte para corrigir isso, o que é uma perda de tempo para todos os envolvidos.

Digamos que o cliente enviou o site para o site httpdocs, se através do SSH eu mv httpdocs/ httpdocs.2/ && cp -pr httpdocs.2/ httpdocs/ && rm httpdocs.2/ -frresolver o problema, não haverá nada de errado com os dados.

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

Portanto, a pergunta é: como os diretórios criados / enviados por meio do VSFTPD herdam os contextos adequados do SELinux, assim como eles são herdados quando os diretórios são criados / enviados por meio do SSH?

Juan Pablo Barrios
fonte
Por segurança, é uma má idéia oferecer suporte a FTP. Considere se livrar dele e instruir os clientes sobre como configurar seus clientes de transferência de arquivos para usar o SFTP ... ... o que também eliminará esse problema.
Michael Hampton
Obrigado Michael. Concordo com você, mas, no nosso caso, não usamos "ftp.domain.com" para nossos clientes e também não expomos o endereço IP público do servidor (o servidor está atrás do proxy NginX), portanto, a segurança do FTP não é um problema. para nós. Somente aqueles para quem enviamos o endereço FTP podem até encontrar o endereço IP do servidor para se conectar através do FTP.
Juan Pablo Barrios

Respostas:

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ões regulares 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 pós-rotulagem.

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

Quando uma entrada é criada em um diretório usando o SELinux, as regras que regem qual rótulo o arquivo ou diretório acabam não sendo ditadas pelas expressões regulares que você cita, mas por outras regras a seguir (acredito que essa seja a ordem correta, mas pode ter perdido algo) .

  1. Existe uma type_transitionregra nomeada explícita .
  2. Existe uma type_transitionregra explícita sem nome .
  3. Herdar o mesmo contexto que o diretório pai.
  4. Aplique o default_context.

Então, quando copio um site WordPress, digamos de outro servidor para um diretório em / var / www / html / by SSH, as pastas wp-content / e wp-content / uploads / têm o contexto de segurança httpd_sys_rw_content_t apropriado.

Então, sim, faz isso, mas não pelo motivo que você pensa que faz. Certamente não por causa da política de pós-rotulagem.

Isso ocorre porque type_transitionexiste uma regra nomeada específica 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 é basicamente dizer.

  • 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, após o login, você recebe o contexto de origem unconfined_tao qual essa regra se aplica.

Isso não funciona para o serviço FTP, porque é mais provável ftpd_tque o contexto de origem desse serviço não tenha regra correspondente.

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

No Fedora 23, pelo menos, existe uma interface para permitir isso, um módulo de política como esse 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 selinux-policy-develpacote esteja instalado e em execução make -f /usr/share/selinux/devel/Makefile load.

Matthew Ife
fonte
1
Oi Matthew, isso fez o truque !! Obrigado por sua ajuda, pois eu estava ficando louco com isso. Eu não tinha certeza do que fazer com o módulo de política que você escreveu como eu nunca tinha personalizado SELinux, então eu pesquisei um pouco e o seguinte é o que eu fiz: eu criei o arquivo local_ftpd.tecom o seu módulo de política, então eu fiz make -f /usr/share/selinux/devel/Makefile local_ftpd.ppe depois semodule -i local_ftpd.pp. Isso está bom? Agora, os arquivos criados por FTP herdam os contextos desejados. Obrigado novamente!
Juan Pablo Barrios