Segurança com firewalld e SELinux no RHEL

Red Hat Enterprise LinuxBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá como proteger um servidor web Apache (httpd) no Red Hat Enterprise Linux (RHEL) gerenciando políticas SELinux e regras de firewall. Você trabalhará em um cenário prático onde configurará o httpd para escutar em uma porta não padrão e explorará como os sistemas SELinux e firewall gerenciam a segurança para tais configurações. Este exercício oferece experiência prática com tarefas comuns de administração de segurança em um ambiente RHEL.

Você começará configurando o serviço httpd para rodar em uma porta personalizada e observando como ele se comporta sob a aplicação do SELinux. Você usará o comando semanage para entender e gerenciar os rótulos de porta do SELinux, garantindo a conformidade de segurança adequada. Em seguida, você usará firewall-cmd para abrir esta porta personalizada no firewall do sistema. Finalmente, você verificará se o servidor web está acessível, confirmando que suas configurações de segurança foram aplicadas corretamente.

Configure httpd em uma Porta Personalizada e Entenda o Contexto SELinux

Nesta etapa, você aprenderá como configurar o servidor web Apache (httpd) para rodar em uma porta não padrão e entender como o SELinux gerencia o acesso às portas. Trabalharemos com a porta 8081 e exploraremos o gerenciamento de portas do SELinux, mesmo que o serviço inicie com sucesso em algumas configurações.

Os pacotes necessários (httpd, policycoreutils-python-utils e firewalld) já foram instalados na fase de configuração. O pacote policycoreutils-python-utils fornece o comando semanage, que você usará em uma etapa posterior.

Vamos começar modificando a configuração padrão do httpd para escutar em uma porta não padrão, 8081. O arquivo de configuração principal para o httpd está localizado em /etc/httpd/conf/httpd.conf. Usaremos o editor nano para alterar a porta de escuta.

sudo nano /etc/httpd/conf/httpd.conf

Dentro do editor nano, use as setas do teclado para rolar para baixo e encontrar a linha que diz Listen 80. Altere esta linha para:

Listen 8081

Para salvar o arquivo e sair do nano, pressione Ctrl+X, depois Y para confirmar as alterações e, finalmente, Enter para escrever no arquivo.

Agora, com a configuração alterada, vamos tentar iniciar o serviço httpd. Neste ambiente em contêiner, systemctl não está disponível. Iniciaremos o daemon httpd diretamente.

sudo /usr/sbin/httpd

Você pode ver uma mensagem de aviso sobre o nome de domínio totalmente qualificado do servidor, mas isso é normal e pode ser ignorado.

AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::216:3eff:fe02:1a1e%eth0. Set the 'ServerName' directive globally to suppress this message

Vamos verificar se o serviço está em execução verificando os processos httpd.

ps aux | grep httpd

Você deve ver vários processos httpd em execução, o que indica que o servidor web foi iniciado com sucesso.

root        4813  0.0  0.2  23364  7736 ?        Ss   09:32   0:00 /usr/sbin/httpd
apache      4814  0.0  0.1  23020  5092 ?        S    09:32   0:00 /usr/sbin/httpd
apache      4815  0.0  0.4 1441064 14620 ?       Sl   09:32   0:00 /usr/sbin/httpd
apache      4816  0.0  0.5 1441064 18736 ?       Sl   09:32   0:00 /usr/sbin/httpd
apache      4837  0.0  0.4 1572200 16872 ?       Sl   09:32   0:00 /usr/sbin/httpd
labex       4996  0.0  0.0   6408  2176 pts/3    S+   09:32   0:00 grep --color=auto httpd

Vamos também verificar os logs de erro do httpd para ver o que aconteceu durante a inicialização.

sudo tail /var/log/httpd/error_log

Você deve ver mensagens normais de inicialização indicando que o servidor está funcionando corretamente.

[Tue Jun 17 09:32:46.374275 2025] [core:notice] [pid 4812:tid 4812] SELinux policy enabled; httpd running as context system_u:system_r:unconfined_service_t:s0
[Tue Jun 17 09:32:46.377265 2025] [suexec:notice] [pid 4812:tid 4812] AH01232: suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[Tue Jun 17 09:32:46.394284 2025] [lbmethod_heartbeat:notice] [pid 4813:tid 4813] AH02282: No slotmem from mod_heartmonitor
[Tue Jun 17 09:32:46.399433 2025] [mpm_event:notice] [pid 4813:tid 4813] AH00489: Apache/2.4.62 (Red Hat Enterprise Linux) configured -- resuming normal operations
[Tue Jun 17 09:32:46.399458 2025] [core:notice] [pid 4813:tid 4813] AH00094: Command line: '/usr/sbin/httpd'

Curiosamente, o serviço httpd foi iniciado sem nenhum problema de SELinux. Vamos verificar se houve alguma negação do SELinux no log de auditoria.

sudo grep AVC /var/log/audit/audit.log | grep httpd

Se não houver resultados, significa que o SELinux não impediu o serviço httpd de se vincular à porta 8081. Isso pode ser porque:

  1. A porta 8081 pode já estar permitida para serviços HTTP por padrão em algumas configurações
  2. O processo httpd pode estar sendo executado em um contexto não confinado
  3. A porta 8081 pode já estar definida na política SELinux

Vamos verificar o modo SELinux atual:

getenforce

Você deve ver que o SELinux está no modo "Enforcing", o que significa que está aplicando ativamente as políticas. O fato de o httpd ter iniciado com sucesso indica que a porta 8081 pode já ter a rotulagem SELinux adequada, ou o serviço está sendo executado em um contexto não confinado, como mostrado nas mensagens do log. Para fins deste exercício de aprendizado, vamos continuar para a próxima etapa, onde exploraremos o gerenciamento de portas do SELinux e garantiremos a configuração adequada.

Entendendo e Gerenciando as Etiquetas de Porta do SELinux com semanage

Nesta etapa, você aprenderá como gerenciar rótulos de porta SELinux usando o comando semanage. Embora o serviço httpd esteja atualmente em execução na porta 8081, é importante entender como configurar corretamente as políticas de porta SELinux para garantir segurança e conformidade. Você explorará a configuração de porta atual e aprenderá como atribuir explicitamente o tipo SELinux correto a portas personalizadas.

Primeiro, você precisa encontrar o tipo SELinux correto para portas de servidor web. O comando semanage port -l lista todas as definições de porta conhecidas pelo SELinux. Podemos canalizar esta saída para grep para encontrar tipos relacionados a http.

sudo semanage port -l | grep http

A saída mostra vários tipos de porta. O mais relevante para um servidor web padrão é http_port_t.

http_cache_port_t              tcp      8080, 8118, 8123, 10001-10010
http_cache_port_t              udp      3130
http_port_t                    tcp      80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t            tcp      5988
pegasus_https_port_t           tcp      5989

Como você pode ver, http_port_t é atribuído a portas HTTP/HTTPS padrão como 80 e 443. A política SELinux permite que processos com o tipo httpd_t (nosso servidor web) se vinculem a qualquer porta rotulada com http_port_t. Vamos verificar se a porta 8081 já está nesta lista.

Observe que a porta 8081 não está atualmente listada em http_port_t. No entanto, em algumas configurações RHEL, esta porta pode já estar definida na política SELinux. Vamos tentar adicioná-la explicitamente para a conformidade adequada do SELinux usando o comando semanage port -a.

  • A opção -a significa "adicionar" (add).
  • A opção -t http_port_t especifica o tipo a ser atribuído.
  • A opção -p tcp especifica o protocolo.
sudo semanage port -a -t http_port_t -p tcp 8081

Você pode ver uma mensagem indicando "Port tcp/8081 already defined, modifying instead" (Porta tcp/8081 já definida, modificando em vez disso), o que significa que a porta já estava configurada. Isso explica por que o httpd foi iniciado com sucesso na etapa anterior. Para verificar a configuração atual, liste as definições de http_port_t novamente.

sudo semanage port -l | grep '^http_port_t'

Você deve agora ver a porta 8081 incluída na lista.

http_port_t                    tcp      8081, 80, 81, 443, 488, 8008, 8009, 8443, 9000

Com a política SELinux explicitamente atualizada, a porta 8081 agora é formalmente reconhecida como uma porta HTTP. O serviço httpd deve continuar a ser executado sem problemas, e você garantiu a conformidade adequada do SELinux.

Vamos verificar se o processo ainda está em execução:

ps aux | grep httpd

Você deve continuar a ver vários processos httpd, indicando que o servidor web está sendo executado com sucesso com a rotulagem de porta SELinux adequada.

root        4813  0.0  0.2  23364  7736 ?        Ss   09:32   0:00 /usr/sbin/httpd
apache      4814  0.0  0.1  23020  5092 ?        S    09:32   0:00 /usr/sbin/httpd
apache      4815  0.0  0.4 1441064 14620 ?       Sl   09:32   0:00 /usr/sbin/httpd
apache      4816  0.0  0.5 1441064 18736 ?       Sl   09:32   0:00 /usr/sbin/httpd
apache      4837  0.0  0.4 1572200 16872 ?       Sl   09:32   0:00 /usr/sbin/httpd
labex       5215  0.0  0.0   6408  2176 pts/3    S+   09:33   0:00 grep --color=auto httpd

Você configurou com sucesso a política SELinux para permitir explicitamente que o serviço httpd seja executado na porta 8081, garantindo a conformidade de segurança adequada.

Abrir uma Porta Personalizada no Firewall com firewall-cmd

Nesta etapa, você configurará o firewall do sistema para permitir conexões externas ao seu servidor web na porta personalizada 8081. Embora o serviço httpd agora esteja funcionando corretamente graças à alteração da política SELinux, o serviço firewalld, que gerencia as regras de tráfego de rede, provavelmente está bloqueando solicitações de entrada nesta porta não padrão por padrão.

O pacote firewalld já foi instalado na fase de configuração. No entanto, precisamos iniciar o serviço firewalld primeiro. Vamos verificar o status atual e iniciá-lo, se necessário.

sudo firewall-cmd --list-all

Se você vir "FirewallD is not running" (FirewallD não está em execução), precisamos iniciar o daemon firewalld. Neste ambiente de contêiner, iniciamos o daemon firewalld diretamente. O & no final executa o processo em segundo plano.

sudo /usr/sbin/firewalld &

Aguarde um momento para o serviço inicializar e, em seguida, verifique se ele está em execução:

sudo firewall-cmd --list-all

Agora você deve ver a configuração atual do firewall para a zona padrão (public).

Vamos testar o acesso ao servidor web a partir da linha de comando usando curl. Este comando tenta se conectar a localhost na porta 8081.

curl http://localhost:8081

Você deve ver o conteúdo HTML da sua página de teste, o que significa que o servidor web está acessível localmente. Isso é esperado porque o firewalld normalmente permite o tráfego localhost por padrão.

No entanto, para acesso externo e configuração de segurança adequada, ainda precisamos configurar o firewall corretamente para nossa porta personalizada. Embora as conexões localhost normalmente funcionem independentemente das regras do firewall, as conexões externas de outras máquinas seriam bloqueadas sem a configuração adequada do firewall.

Primeiro, vamos inspecionar as regras atuais para a zona padrão (public):

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0 eth1
  sources:
  services: cockpit dhcpv6-client ssh
  ports:
  protocols:
  forward: yes
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

Agora, adicione uma nova regra para permitir o tráfego TCP na porta 8081. Certifique-se de que o firewalld esteja em execução antes de executar este comando.

  • --add-port=8081/tcp especifica a porta e o protocolo a serem abertos.
  • --permanent garante que a regra persista após uma reinicialização ou recarregamento do firewall.
sudo firewall-cmd --permanent --add-port=8081/tcp

Se você vir "FirewallD is not running" (FirewallD não está em execução), certifique-se de ter iniciado o daemon firewalld na etapa anterior e aguarde um momento para que ele inicialize.

O comando deve retornar success (sucesso) quando o firewalld estiver funcionando corretamente.

success

As regras permanentes não são aplicadas à configuração ativa do firewall até que ele seja recarregado. Vamos recarregar o firewall para aplicar nossa nova regra.

sudo firewall-cmd --reload

Este comando também deve retornar success (sucesso).

success

Vamos verificar se a porta agora está aberta listando as regras novamente.

sudo firewall-cmd --list-all

Você deve agora ver 8081/tcp na seção ports:.

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0 eth1
  sources:
  services: cockpit dhcpv6-client ssh
  ports: 8081/tcp
  protocols:
  forward: yes
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

Você configurou o firewall com sucesso. A etapa final é testar se você pode acessar o servidor web.

Verificar o Acesso às Portas Padrão e Personalizadas do Servidor Web

Nesta etapa final, você verificará se todas as alterações que você fez garantem que seu servidor web esteja configurado corretamente para acesso local e externo. Você configurou a política SELinux e abriu a porta necessária no firewall. Agora, você realizará testes abrangentes para confirmar a configuração.

Primeiro, vamos criar uma página de teste simples para que, quando nos conectarmos, recebamos uma mensagem personalizada. A raiz do documento padrão para httpd é /var/www/html. Criaremos um arquivo index.html nesse diretório. Você precisará de privilégios sudo para escrever neste local.

echo "Success! Web server on custom port 8081 is working." | sudo tee /var/www/html/index.html

Este comando coloca a mensagem de sucesso no arquivo index.html. O comando tee é usado aqui porque nos permite escrever em um arquivo que requer privilégios sudo enquanto usa um pipe. Você deve ver a mensagem ecoada no terminal como confirmação.

Success! Web server on custom port 8081 is working.

Para completar o exercício, vamos demonstrar o contraste tentando acessar a porta HTTP padrão 80. Como nosso servidor está configurado para ouvir apenas na porta 8081, esta solicitação deve falhar.

curl http://localhost:80

Como esperado, a conexão é recusada porque nenhum serviço está ouvindo nessa porta.

curl: (7) Failed to connect to localhost port 80: Connection refused

Isso confirma que seu servidor está sendo executado exclusivamente na porta personalizada que você configurou. Por meio deste laboratório, você aprendeu um fluxo de trabalho crítico de solução de problemas para serviços no RHEL:

  1. Verifique o status e os logs do serviço.
  2. Investigue as negações do SELinux no log de auditoria.
  3. Corrija as políticas SELinux usando semanage.
  4. Configure as regras do firewall usando firewall-cmd.
  5. Verifique a conectividade.

Resumo

Neste laboratório, você aprendeu como configurar um servidor web em uma porta personalizada e gerenciar as políticas de segurança do SELinux. Com o servidor web Apache (httpd), os pacotes policycoreutils-python-utils e firewalld pré-instalados, você se concentrou em entender o gerenciamento de portas do SELinux e a configuração do firewall. Você modificou o arquivo httpd.conf para alterar a porta de escuta do servidor web para uma porta não padrão, 8081.

Você descobriu que o serviço httpd foi iniciado com sucesso na porta personalizada porque a porta 8081 já estava devidamente configurada na política SELinux. Isso proporcionou uma oportunidade de explorar o gerenciamento de portas do SELinux e entender como o semanage funciona para manter a rotulagem adequada das portas. Você também aprendeu a usar firewall-cmd para gerenciar as regras do firewall, garantindo conformidade com a segurança e acessibilidade. Embora o httpd tenha sido executado em um contexto não confinado, este laboratório demonstrou a importância da configuração adequada do SELinux e do firewall para ambientes de produção.