Como posso dizer ao SELinux para dar acesso de escrita vsftpd em um diretório específico?

3

Configurei o vsftpd no meu servidor Fedora 12 e gostaria de ter a seguinte configuração. Cada usuário deve ter acesso a:

  • seu diretório inicial (/ home / USER);
  • o diretório da web que criei para ele (/ web / USER).

Para conseguir isso, eu configurei o vsftpd pela primeira vez para chroot cada usuário em seu diretório home. Em seguida, criei /web/USER com as permissões corretas e usei mount --bind /web/USER /home/USER/Web para que o usuário possa ter acesso a /web/USER a /home/USER/Web .

Eu também liguei o SELinux booleano ftp_home_dir para que o vsftpd tenha permissão para escrever nos diretórios home dos usuários.

Isso funciona muito bem, exceto que quando um usuário tenta carregar ou renomear um arquivo em /home/USER/Web , o SELinux proíbe isso porque a mudança também deve ser feita em /web/USER , e o SELinux não dá permissão ao vsftpd para escrever qualquer coisa nesse diretório.

Sei que posso resolver o problema ativando o SELinux booleano allow_ftpd_full_access ou ftpd_disable_trans . Eu também tentei usar o audit2allow para gerar uma política, mas o que ela faz é gerar uma política que forneça acesso de escrita ftpd aos diretórios do tipo public_content_t ; isso é equivalente a ativar allow_ftpd_full_access , se eu entendi corretamente.

Gostaria de saber se é possível configurar o SELinux para permitir o acesso de gravação FTP ao diretório específico /web/USER e seu conteúdo, em vez de desabilitar totalmente os controles FTP do SELinux.

    
por Alpha Hydrae 09.04.2010 / 10:15

3 respostas

2

# semanage fcontext -a -t public_content_rw_t "/myftp/pub(/.*)?"

Não se esqueça de incluir o (/.*)? no final do nome do diretório.

I also tried to use audit2allow to generate a policy, but what it does is generate a policy that gives ftpd write access to directories of type public_content_t; this is equivalent to turning on allow_ftpd_full_access, if I understood it correctly

Essencialmente, sim; já que o SELinux permite que diretórios / arquivos rotulados com public_content_t sejam compartilhados entre diferentes serviços. No entanto, o controle de acesso adicional está em vigor por meio do uso de sebooleans (ou sebool , mais precisamente).

Dar "acesso completo ao ftpd" não significa dar-lhe os direitos de fazer / ler / escrever o que e onde quiser. O SELinux designou políticas para os serviços em seu sistema; ou seja, ftpd tem permissão para ler arquivos se o contexto do arquivo do diretório ( fcontext ) for public_content_t . O SELinux dá permissões de gravação para o servidor ftp se o texto do diretório for public_content_rw_t ; outros serviços, como o samba, o apache, etc., devem ter permissões de gravação para esses diretórios por meio dos booleanos, de acordo com os Documentação RedHat . Se a sua "política local" der ao ftpd acesso de gravação em diretórios com o nome public_content_t , ela basicamente eliminará uma camada de segurança. Portanto, sugiro rotular o diretório com o contexto public_content_rw_t e remover sua política local gerada personalizada.

Para mais informações e detalhes, por favor veja as páginas wiki do SELinux .

    
por 24.02.2014 / 12:23
0

Vamos resumir as informações conhecidas em uma resposta melhor. Você já declarou uma solução usando determinados valores booleanos do selinux ou permitindo acesso de gravação a quaisquer diretórios com public_content_t , ambos sub-ótimos para você.

O que você precisa é garantir que os diretórios tenham um contexto selinux adequado. Você tem caminhos / home / $ USER / Web e / web / $ USER, o primeiro usado para montar o último via opção --bind .

A primeira ideia que me vem à mente é tentar sem o mount --bind . Eu acho que funcionaria para o acesso FTP para o seu primeiro teste e talvez você já tenha tentado isso. Você precisa verificar se esses arquivos estão acessíveis via HTTP. Se não, significa que o seu UserDir Apache não funciona e deve ser corrigido antes de jogar com mount --bind . Você provavelmente quer ter esses diretórios em / web por causa do armazenamento externo, certo?

Eu acho que o único problema aqui é que o diretório / web / $ USER não está configurado da mesma maneira que trabalharia automaticamente para / home / $ USER / Web. Você pode criar outro diretório como / home / $ USER / Test e comparar os resultados de ls -lZ neles. Você veria claramente a diferença.

Você pode usar chcon para alterar o contexto e, em seguida, verificar o que acontece. É uma ferramenta de baixo nível e não é uma solução sistemática, mas ajuda você a testar as coisas rapidamente. Você também pode fazer um pouco de magia negra aqui e apenas executar restorecon no / home / $ USER / Web e acredito que ele irá definir o contexto corretamente.

A solução final seria usar semanage fcontext para alterar o banco de dados de caminho para usar o contexto correto também em / web, bem como em qualquer / web / $ USER e especialmente para ter o contexto de / home / $ USER / Web o mesmo que o / web / $ USER pois o mount --bind é um pouco de magia negra em si.

Depois de alterar o banco de dados do caminho, não se esqueça de executar restorecon -r /web on e pode ser bom testar também se restorecone -r /home não quebra isso. Verifique também se os novos diretórios / web / $ USER são criados com o contexto correto ou se restorecon é necessário. Se você não estiver satisfeito com a situação, poderá configurar restorecond para monitorar esses diretórios e corrigir o contexto imediatamente, mas isso deve ser o último recurso.

Lembre-se sempre de que o próprio selinux não conhece o banco de dados do caminho, mas trabalha somente com os contextos de segurança dos respectivos arquivos.

Eu não tenho uma distribuição ativada por selinux agora, caso contrário, daria mais exemplos de linha de comando e a solução seria mais precisa. Eu posso consertar isso depois com um virtual centos / fedora, se necessário. Agora vejo que a questão é bastante antiga. Fui enganado pela resposta insuficiente, mas espero que ainda ajude alguém.

    
por 30.03.2014 / 20:36
0

Tente isto:

setsebool -P allow_ftpd_full_access on

If SELinux is to blame, there's a few SELinux booleans worth looking at.

Best start is: getsebool -a | grep ftp

You'll see something like

allow_ftpd_anon_write --> off allow_ftpd_full_access --> on allow_ftpd_use_cifs --> off allow_ftpd_use_nfs --> off ftp_home_dir --> on ftpd_connect_db --> off httpd_enable_ftp_server --> off tftp_anon_write --> off

Not all of these are relevant to vsftpd, for example the >httpd_enable_ftp_server is for Apache running FTP, and tftp_anon_write is for >tftpd. I'd start with:

setsebool -P allow_ftpd_full_access on setsebool -P ftp_home_dir on

Fonte: link

    
por 07.03.2018 / 04:24