Acesso do Apache a outras partições

Artigo que apresenta uma experiência sobre como resolver um problema de acesso do servidor HTTP Apache a um diretório de outra partição, que era barrado pelo sistema SELinux do Linux.

Quadro sobre os índios apache

Ontem me deparei com um problema que eu nunca tinha visto antes. Instalei o Apache no Fedora 14 (Linux), que vem configurado para utilizar o diretório "/var/www/html" como repositório de sites, mas ele não estava conseguindo acessar arquivos/diretórios em outras partições.

Bom, a questão central é que eu crio meus projetos web em "/dados/rubens/projetos/". Então o que costumo fazer é criar um link simbólico em "/var/www/html" apondando para o diretório do projeto. Isso funciona perfeitamente, mesmo que os diretórios estajam em partições diferentes. O problema é que o Apache não estava conseguindo acessar o diretório "simbólico", mesmo definindo a diretiva Options Indexes FollowSymLinks no arquivo de configurações do Apache. Fiz um teste com PHP, e ele conseguia ver o diretório "/dados" (usando a função scandir), mas verificando o acesso ao diretório com as funções is_readable, is_writable e is_executable, notei que o apache não tinha permissão nenhuma. O probema é que o diretório tinha permissão para o Apache (estava com rwxr-xr-x).

Procurei na Web problemas parecidos, mas não encontrei. De repente, por acaso, me lembrei do SELinux, um mecanismo de segurança de sistemas Linux (que costuma vir ativado em distribuições Red Hat e derivados, como o Fedora). Fui ver os logs e notei que, de fato, haviam notificações de tentativa de acesso do httpd ao diretório "/dados", mas que foram bloqueadas. Ou seja, o problema é que as configurações do SELinux estavam impedindo alguns tipos de operações do Apache.

Pesquisei um pouco sobre o SELinux e vi que existem diretivas próprias para segurança do Apache. Bem interessantes de serem estudadas para um servidor em produção, mas talvez nem tanto para um computador de desenvolvimento. Para desativar as diretivas de segurança do Apache no SELinux, você pode usar estes comandos:

$ setsebool -P allow_httpd_anon_write 1
$ setsebool -P allow_httpd_mod_auth_ntlm_winbind 1
$ setsebool -P allow_httpd_mod_auth_pam 1
$ setsebool -P allow_httpd_anon_write 1
$ setsebool -P allow_httpd_mod_auth_pam 1
$ setsebool -P allow_httpd_sys_script_anon_write 1
$ setsebool -P httpd_builtin_scripting 1
$ setsebool -P httpd_can_check_spam 1
$ setsebool -P httpd_can_network_connect 1
$ setsebool -P httpd_can_network_connect_cobbler 1
$ setsebool -P httpd_can_network_connect_db 1
$ setsebool -P httpd_can_network_memcache 1
$ setsebool -P httpd_can_network_relay 1
$ setsebool -P httpd_can_sendmail 1
$ setsebool -P httpd_dbus_avahi 1
$ setsebool -P httpd_enable_cgi 1
$ setsebool -P httpd_enable_ftp_server 1
$ setsebool -P httpd_enable_homedirs 1
$ setsebool -P httpd_execmem 1
$ setsebool -P httpd_read_user_content 1
$ setsebool -P httpd_setrlimit 1
$ setsebool -P httpd_ssi_exec 1
$ setsebool -P httpd_tmp_exec 1
$ setsebool -P httpd_tty_comm 1
$ setsebool -P httpd_unified 1
$ setsebool -P httpd_use_cifs 1
$ setsebool -P httpd_use_gpg 1
$ setsebool -P httpd_use_nfs 1

O parâmetro -P serve para manter a configuração mesmo após o reboot (ou seja, define de forma persistente). Depois vem o nome da diretiva do SELinux e depois o valor 1 ou 0, indicando "sim" ou "não".

Para saber a situação das diretivas, use o comando getsebool. Você pode aplicar um pipe sobre o comando fgrep para buscar apenas as diretivas referentes ao httpd:

$ getsebool -a | fgrep httpd

Depois de ativar estas diretivas (o que pode levar algum tempo), precisa executar um comando sobre o diretório desejado e reiniciar o Apache:

restorecon -v '/dados'
service httpd restart

Para desabilitar totalmente o SELinux, basta editar o arquivo /etc/selinux/conf. Neste arquivinho, só existem duas diretivas com comentários explicativos. Para desativar você pode usar:

SELINUX=disabled
SELINUXTYPE=targeted

1 comentário