Proteger 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 do 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 de 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 rótulos de porta do SELinux, garantindo a conformidade de segurança adequada. Em seguida, usará o firewall-cmd para abrir essa porta personalizada no firewall do sistema. Por fim, verificará se o servidor web está acessível, confirmando que suas configurações de segurança foram aplicadas corretamente.

Configurar o httpd em uma porta personalizada e entender o contexto do 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, a 8081. O arquivo de configuração principal do 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 teclas de seta 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 gravar no arquivo.

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

A fase de configuração já desativa o host virtual SSL padrão para que este laboratório de HTTP simples possa iniciar sem erros relacionados a arquivos de certificado.

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á rodando verificando os processos do httpd.

ps aux | grep httpd

Você deve ver vários processos httpd rodando, o que indica que o servidor web iniciou 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á rodando 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 iniciou sem problemas do 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 ocorrer 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 rodando em um contexto não confinado.
  3. A porta 8081 pode já estar definida na política do SELinux.

Vamos verificar o modo atual do SELinux:

getenforce

Você deve ver que o SELinux está no modo "Enforcing", o que significa que ele está aplicando políticas ativamente. O fato de o httpd ter iniciado com sucesso indica que a porta 8081 pode já ter o rótulo correto do SELinux, ou o serviço está rodando em um contexto não confinado, conforme mostrado nas mensagens de 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 rótulos de porta do SELinux com o semanage

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

Primeiro, você precisa encontrar o tipo correto do SELinux para portas de servidor web. O comando semanage port -l lista todas as definições de porta conhecidas pelo SELinux. Podemos direcionar essa saída para o 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 é 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, o http_port_t é atribuído a portas HTTP/HTTPS padrão como 80 e 443. A política do 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á listada atualmente em http_port_t. No entanto, em algumas configurações do RHEL, essa porta pode já estar definida na política do SELinux. Vamos tentar adicioná-la explicitamente para conformidade adequada com o SELinux usando o comando semanage port -a.

  • A opção -a significa "add" (adicionar).
  • 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", o que significa que a porta já estava configurada. Isso explica por que o httpd iniciou 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'

Agora você deve 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 do SELinux explicitamente atualizada, a porta 8081 agora é formalmente reconhecida como uma porta HTTP. O serviço httpd deve continuar rodando sem problemas, e você garantiu a conformidade adequada com o SELinux.

Vamos verificar se o processo ainda está rodando:

ps aux | grep httpd

Você deve continuar vendo vários processos httpd, indicando que o servidor web está rodando com sucesso com o rótulo de porta correto do SELinux.

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 do SELinux para permitir explicitamente que o serviço httpd rode na porta 8081, garantindo a conformidade de segurança adequada.

Abrir uma porta personalizada no firewall com o 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 esteja rodando corretamente graças à alteração na política do 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", 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 que o serviço inicialize e, em seguida, verifique se ele está rodando:

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 o curl. Este comando tenta se conectar ao 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, pois o firewalld normalmente permite o tráfego de 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 de localhost normalmente funcionem independentemente das regras de firewall, as conexões externas de outras máquinas seriam bloqueadas sem a configuração de firewall adequada.

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 tráfego TCP na porta 8081. Certifique-se de que o firewalld esteja rodando 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 recarga do firewall.
sudo firewall-cmd --permanent --add-port=8081/tcp

Se você vir "FirewallD is not running", certifique-se de ter iniciado o daemon firewalld na etapa anterior e aguarde um momento para que ele inicialize.

O comando deve retornar success quando o firewalld estiver rodando 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.

success

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

sudo firewall-cmd --list-all

Agora você deve 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ê consegue acessar o servidor web.

Verificar o acesso às portas padrão e personalizada do servidor web

Nesta etapa final, você verificará se todas as alterações feitas garantem que seu servidor web esteja configurado corretamente para acesso local e externo. Você configurou a política do 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 o httpd é /var/www/html. Criaremos um arquivo index.html nesse diretório. Você precisará de privilégios sudo para gravar 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 gravar em um arquivo que requer privilégios sudo enquanto usamos um pipe. Você deve ver a mensagem ecoada no terminal como confirmação.

Success! Web server on custom port 8081 is working.

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

curl http://localhost:80

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

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

Isso confirma que seu servidor está rodando 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. Verificar o status e os logs do serviço.
  2. Investigar negações do SELinux no log de auditoria.
  3. Corrigir políticas do SELinux usando o semanage.
  4. Configurar regras de firewall usando o firewall-cmd.
  5. Verificar a conectividade.

Resumo

Neste laboratório, você aprendeu como configurar um servidor web em uma porta personalizada e gerenciar políticas de segurança do SELinux. Com os pacotes Apache web server (httpd), 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 iniciou com sucesso na porta personalizada porque a porta 8081 já estava configurada corretamente na política do SELinux. Isso proporcionou uma oportunidade de explorar o gerenciamento de portas do SELinux e entender como o semanage funciona para manter o rótulo de porta adequado. Você também aprendeu a usar o firewall-cmd para gerenciar regras de firewall, garantindo tanto a conformidade de segurança quanto a acessibilidade. Embora o httpd tenha rodado 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.