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
Muito boa noite.... Você salvou minha madrugada... Valeu.....
Postar um comentário
Nota: fique a vontade para expressar o que achou deste artigo ou do blog.
Dica: para acompanhar as respostas, acesse com uma conta do Google e marque a opção "Notifique-me".
Atenção: o blogger não permite inclusão de tags nos comentários, por isso, use algum site externo para postar seu código com dúvidas e deixe o link aqui. Exemplo: pastebin.com