Recentemente me deparei com um problema ao tentar alterar porta padrão do Apache (80) para a porta 78 (sim sou troll, problem?) no red hat enterprise linux 6.
Ao editar o arquivo /etc/httpd/conf/httpd.conf , alterei a linha:
Listen 80
para
Listen 78
Ao reiniciar o apache:
# /etc/init.d/httpd restart
Me deparo com a seguinte mensagem:
apr_sockaddr_info_get() failed for redhat
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
(13)Permission denied: make_sock: could not bind to address [::]:78
(13)Permission denied: make_sock: could not bind to address 0.0.0.0:78
no listening sockets available, shutting down
Unable to open logs
Verificando os logs em busca do problema, podemos ver que o daemon gerou uma mensagem em /var/log/audit/audit.log :
type=AVC msg=audit(1306646370.592:162): avc: denied { name_bind } for pid=1546 comm="httpd" src=78 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=system_u:object_r:reserved_port_t:s0 tclass=tcp_socket
type=SYSCALL msg=audit(1306646370.592:162): arch=c000003e syscall=49 success=no exit=-13 a0=3 a1=7f0be4146760 a2=10 a3=7fffa476dcbc items=0 ppid=1545 pid=1546 auid=500 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts2 ses=6 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)
Uma mensagem do tipo AVC ou seja uma mensagem originada pelo SElinux (Security Enhanced Linux).
Para muitos ''Administradores'' apenas desabilitar o SElinux com o comando abaixo resolveria o problema:
# echo 0 > /selinux/enforce
Agora basta reiniciar o apache que ele irá executar sem problema, porém ao alterar o valor do arquivo /selinux/enforce para 0, você passa o SElinux para modo permissivo, desativando toda sua configuração referente a proteção do sistema.
Para voltar o SElinux para o modo enforce atribua o valor para 1.
Diversos problemas, de incompatibilidade podem ser resolvidos desabilitando o SElinux, porém você perde uma segurança a mais para o seu sistema, deixando as vantagens do SElinux de lado.
Primeiramente antes de falar das vantagens de se usar o SElinux, não tenho como fugir de explicar um pouco sobre os mecanismos de controle de acesso, DAC (padrão na maioria das distribuições linux) e MAC (padrão do SElinux).
DAC (Discretionary Access Control) é o sistema de permissões que conhecemos como usuário, grupo e outros. Por exemplo um usuário é dono de um determinado arquivo, onde ele poderá atribuir permissão de leitura, escrita e execução para outro usuário ou um determinado grupo. O determinado usuário decide quem pode acessar e executar o arquivo que lhe pertence, assim como pode revogar o direito de acesso quando desejar.
MAC (Mandatory Access Control), diferente do DAC, o MAC não considera que os usuários respectivamente dono de arquivos tenham opção de atribuir quem pode acessar o arquivo, ficando por conta apenas do administrador do sistema tomar decisões de acesso e modificação em geral do arquivo. Toda configuração de segurança no MAC fica por conta do administrador, sem qualquer intervenção possível do usuário.
Ok com um pouco de conceito sobre os mecanismos de acesso, vamos entender as vantagens de se utilizar o SElinux, como mencionei o SElinux é baseado no controle de acesso MAC, o mesmo está incorporado ao kernel linux desda versão 2.4 até a presente 2.6 com diversas modificações.
O SElinux não desativa o método DAC, eles trabalham em conjunto, complementando a segurança do sistema, ou seja mesmo com a segurança do DAC referente a permissões de usuários, grupos e outros, após toda permissão for verificada, o SElinux verifica as suas configurações, assim impedindo que um possível bug no arquivo ou objeto que está sendo executado permita que uma falha de segurança seja explorada.
Um exemplo para entender, digamos que o Apache esteja sendo executado como root, com o método DAC, o root pode escrever, executar e modificar qualquer arquivo ou diretório do sistema, logo se uma falha descoberta no Apache for utilizada por um invasor, o mesmo poderá acessar e modificar qualquer arquivo ou diretório do sistema, incluindo o /etc/passwd.
Nesse momento que o SElinux entra em pratica, com as configurações de segurança do SElinux, é possível limitar até o acesso do root em determinados processos e acessos, como o SElinux funciona com o método de acesso MAC, toda configuração de segurança e acesso, referente ao serviço apache, será previamente configurado para toda comunicação deste serviço com o sistema, como dispositivos, arquivos e sockets, assim previnindo que um determinado serviço interfira em outra parte do sistema ou serviço que não seja necessário para seu funcionamento, em outras palavras o serviço será configurado para ser executado com baixos privilégios, apenas os necessários para o seu correto funcionamento.
Ok ok, mas como resolver o problema sem desativar o SElinux ?
Primeiramente, vamos verificar como está a configuração de portas que o Apache pode utilizar de acordo com a configuração do SElinux.
Para isso precisaremos da ferramenta ''semanage'', utilizada para configurar elementos de segurança no SElinux.
Instale a mesma com o comando abaixo:
# yum install policycoreutils-python
Verificando as portas disponíveis para ser utilizada pelo Apache:
# semanage port -l | grep http
A saída do comando será parecida com isto:
http_cache_port_t tcp 3128, 8080, 8118, 10001-10010
http_cache_port_t udp 3130
http_port_t tcp 80, 443, 488, 8008, 8009, 8443
pegasus_http_port_t tcp 5988
pegasus_https_port_t tcp 5989
Veja que o comando exibe as portas disponíveis para serem utilizadas de acordo com a configuração do SElinux ou seja a porta 78 na qual eu estava tentando utilizar não está disponível.
Para adicionar a porta desejada utilize o comando abaixo:
# semanage port -a -t http_port_t -p tcp 78
Após executar o comando acima, você poderá verificar que a porta 78 agora está disponível pela configuração do SElinux:
# semanage port -l | grep http
http_cache_port_t tcp 3128, 8080, 8118, 10001-10010
http_cache_port_t udp 3130
http_port_t tcp 78, 80, 443, 488, 8008, 8009, 8443
pegasus_http_port_t tcp 5988
pegasus_https_port_t tcp 5989
Agora basta reiniciar o Apache:
# /etc/init.d/httpd restart
O mesmo irá iniciar sem problemas com o SElinux ativado.
=D
Aconselho a leitura do man semenage para verificar maiores configurações, assim como o projeto SElinux e a documentação oficial da Red Hat
parabéns cara, isso foi ótimo unico lugar que descobri isso foi aqui... obrigadão..
[Responder comentário]Olá! Após dias apanhando disso, a sua solução foi a ÚNICA que me atendeu! Parabéns!
[Responder comentário]