terça-feira, 13 de setembro de 2011

Colocar o Samba a funcionar com o SELinux

Antes de mais nada: SELinux é uma camada de proteção do sistema operacional. Procurem resistir à tentação de desabilita-lo!

Agora sim, vamos lá...

Estive quebrando a cabeça com o SELinux para compartilhar via Samba uma pasta fora do /home no CentOS 6 com SELinux ativo. Aqui vai a solução, caso interesse a alguém. Serve para o Fedora e Scientific Linux também.

Quando a pasta encontra-se dentro de qualquer pasta dentro do /home é tranquilo, habilite o boleano samba_enable_home_dirs.

# setsebool -P samba_enable_home_dirs 1

Porém quando é fora do /home, o SELinux bloqueará o acesso.

Por exemplo, vamos usar esse /etc/samba/smb.conf

[global]
    workgroup = GRUPO
    server string =
    security = SHARE
    max log size = 0
    load printers = No

[Arquivos]
    path = /arquivos
    read only = No
    guest ok = Yes

(ver Guia de configuração do Samba não-PDC)

e criar a pasta /arquivos com tudo liberado

# mkdir /arquivos
# chmod 777 /arquivos

Tudo aparenta certo. O Samba está rodando no modo SHARE, onde ele não pede autenticação para os clientes e a pasta que estamos compartilhando está com permissão 777, de leitura/escrita para dono, grupo e outros (o Samba no modo SHARE acessa o sistema de arquivos por padrão com a conta nobody). Além disso, o firewall foi corretamente configurado para liberar o Samba. Contudo, continua não funcionando.

Falta configurar o label da pasta que criamos. Para liberar acesso ao Samba, existem três opções de labels:

samba_share_t -> libera acesso leitura/escrita para o Samba
public_content_t -> acesso somente leitura para o Samba e outros daemons que eventualmente você queira que acessem a mesma pasta
public_content_rw_t -> idem acima mas com acesso leitura/escrita

Os dois últimos labels são úteis para quando você quer por exemplo que o Samba e o Apache acessem a mesma pasta. Com public_content_rw_t, é preciso configurar um boleano específico para cada daemon, como allow_smbd_anon_write (Samba), allow_httpd_anon_write (Apache/lighttpd), allow_ftpd_anon_write (servidores FTP), entre outros (getsebool -a dá a lista completa de boleanos disponíveis).

No meu caso, apenas o Samba usará a pasta, então ficarei com a primeira.

Primeiro, você verifica o label de cada pasta/arquivo adicionando a opção -Z ao ls. Exemplos:

# ls -lZ /arquivos
# ls -ldZ /arquivos

Vamos então configurar o label.

MODO TEMPORÁRIO (útil para testes)

# chcon -R -t samba_share_t /arquivos

Com o chcon, o label é alterado, mas não resiste a uma reinicialização.

MODO DEFINITIVO

# semanage fcontext -a -t samba_share_t '/arquivos(/.*)?'
# restorecon -FRv /arquivos

[Atualização - 22/01/2015] Adicionado -F.

Para quem tem instalações mínimas do CentOS, Fedora, Scientific Linux, o semanage não vem instalado. Ele faz parte do pacote policycoreutils-python

Com semanage fcontext a ferramenta edita o arquivo /etc/selinux/targeted/contexts/files/file_contexts.local com o novo label.

restorecon -FRv efetua um relabel na pasta especificada aplicando a configuração personalizada que definimos acima. Desta forma, fica permanente, resistindo a reinicializações e atualizações do SELinux.

RESTAURAR LABEL PADRÃO

# semanage fcontext -d '/arquivos(/.*)?'
# restorecon -FRv /arquivos

O arquivo file_contexts.local citado acima não deve ser editado manualmente. Use semanage fcontext -d para remover uma customização anterior e depois mande o restorecon fazer novamente o relabel para voltar ao padrão do sistema.

Os manuais da Red Hat são uma boa fonte de informação: 5.7. SELinux Contexts - Labeling Files

Nenhum comentário:

Postar um comentário