Files
2026-05-06 13:35:47 -03:00

17 KiB
Raw Permalink Blame History

title, source, path
title source path
Configuração de proxy reverso Apache https://tdn.totvs.com/pages/viewpage.action?pageId=877162376 \Plataforma Documentação técnica\Configuração\Configuração de Ambiente\Proxy reverso\Configuração de proxy reverso Apache.md

Fique atento!

Esta página foi revisada para considerar as configurações de server do TOTVS Fluig a partir da atualização 1.6.

Objetivo


Este guia orienta a configuração do Apache como Proxy Reverso e a implementação de Rate Limit para assegurar a disponibilidade da plataforma contra acessos abusivos.

Dicas!

  • Após a configuração do proxy reverso, não esqueça de alterar a URL de acesso ao portal nas Configurações do sistema da plataforma. Clique aqui e saiba como fazer.

  • Obtenha mais informações sobre DMZ em [Topologia DMZ](../Topologia DMZ.md).

  • Clique aqui para ver a documentação do próprio fornecedor sobre a configuração de proxy reverso utilizando Apache no Windows.

  • Se não for configurado, o padrão de timeout do proxy reverso do Apache é 60 segundos. A configuração recomendada é 300 segundos que é o timeout padrão do TOTVS Fluig podendo ser ajustado para mais ou para menos de acordo com a necessidade.

Importante!

Salientamos que, ao utilizar um proxy reverso, uma prática de segurança recomendada para a plataforma é não expor o servidor de aplicação diretamente na Internet.

[Clique aqui](../../../Especificações Técnicas/Boas práticas de segurança para o seu ambiente.md) e veja outras boas práticas de segurança recomendadas para o seu ambiente.

Pré-requisitos


  • Apache™ versão 2.4. O instalador e a documentação oficial do Apache™ podem ser encontrados em http://httpd.apache.org/.

  • Se for utilizar SSL, também será necessário converter o certificado utilizado na configuração da plataforma para os formatos .cer, .key e .pem. O guia para configurar a plataforma em SSL (HTTPS) encontra-se aqui.

  • Para a porta do realtime (7777) no Apache é necessário habilitar o módulo SSL em todos os vhosts que utilizarem o realtime   SSLEngine One SSLProxyEngine On.

Módulos Apache


Certifique-se de que os seguintes módulos estão sendo carregados pelo Apache:

Nota:

Na versão 2.4 do Apache no Windows, o módulo LoadModule proxy_fdpass_module modules/mod_proxy_fdpass.so não existe.

# Módulos para WebDAV
LoadModule dav_module modules/mod_dav.so
LoadModule dav_fs_module modules/mod_dav_fs.so
LoadModule dav_lock_module modules/mod_dav_lock.so

# Módulos para proxy reverso
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_express_module modules/mod_proxy_express.so
LoadModule proxy_fdpass_module modules/mod_proxy_fdpass.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so

Se for utilizar SSL no lado DMZ, certifique-se ainda de que o seguinte módulo está sendo carregado pelo Apache:

# Módulo para HTTPS
LoadModule ssl_module modules/mod_ssl.so

Configuração do Apache (sem SSL)


01. Acesse a pasta /etc/httpd/conf.d.

Nota:

O caminho da pasta pode variar, esse caminho do exemplo é de uma instalação Linux CentOS.

02. Crie um arquivo de configuração para a plataforma (chamado fluig.conf, por exemplo), com o seguinte conteúdo:

Listen 7777
Listen 21
Header set Access-Control-Allow-Origin: "http://<Nome externo do servidor>"
Header set Access-Control-Allow-Headers: "Content-Type, X-Requested-With, accept-version"
Header set Access-Control-Allow-Methods: "GET, PUT, OPTIONS, DELETE, POST"
Header Set Access-Control-Request-Method: "GET, PUT, OPTIONS, DELETE, POST"
ProxyRequests Off
ProxyVia On
AllowConnect 7777
AllowConnect 21

Listener HTTP


<VirtualHost *:80>
    ServerName <Nome externo do servidor>
    ProxyPreserveHost On
    ProxyPass / http://<IP do servidor Fluig>:<Porta do servidor Fluig>/
    ProxyPassReverse / http://<Nome externo do servidor>/
</VirtualHost>

Listener do RealTime


<VirtualHost *:7777>
        RequestHeader set X-Forwarded-Proto https
        RequestHeader set Access-Control-Allow-Origin: "https://<Nome externo do servidor>"
        RequestHeader set X-Forwarded-Host  <Nome externo do servidor>:7777

        ServerName  <Nome externo do servidor> 

        SSLProxyEngine On
        SSLEngine On

        ProxyRequests Off
        ProxyPreserveHost On
        Include /etc/letsencrypt/options-ssl-apache.conf
        SSLCertificateFile  <diretorio-cadeia-certificados>/cert.pem 
        SSLCertificateKeyFile <diretorio-cadeia-certificados>/privkey.pem

        # allow for upgrading to websockets
        RewriteEngine On
        RewriteCond %{HTTP:Upgrade} =websocket [NC]
        RewriteRule /(.*)           ws://<IP do servidor Fluig>:7777/$1 [P,L]
        RewriteCond %{HTTP:Upgrade} !=websocket [NC]
        RewriteRule /(.*)           http://<IP do servidor Fluig>:7777/$1 [P,L]


        ProxyPass "/" "http://<IP do servidor Fluig>:7777"
        ProxyPassReverse "/" "http://<IP do servidor Fluig>:7777/"

        ProxyPass "/" "ws://<IP do servidor Fluig>:7777/"
        ProxyPassReverse "/" "ws://<IP do servidor Fluig>:7777/"

</VirtualHost>

Listener FTP


<VirtualHost *:21>
    ServerName <Nome externo do servidor>
    ProxyPreserveHost On
    ProxyPass / ftp://<IP do servidor Fluig>/
    ProxyPassReverse / ftp://<IP do servidor Fluig>:21/
</VirtualHost>

Legenda

: nome que aparecerá na URL do navegador, por exemplo, http://meuservidor.com.br.

: endereço IP interno do servidor onde o Fluig está rodando, por exemplo, 10.10.2.35.


Configuração do Apache (SSL) + Fluig (HTTP)


Se não for utilizado HTTPS na plataforma, deve possuir a seguinte configuração:

Header set Access-Control-Allow-Origin: "https://meuservidor.fluig.com/"
Header set Access-Control-Allow-Headers: "Content-Type, X-Requested-With, accept-version"
Header set Access-Control-Allow-Methods: "GET, PUT, OPTIONS, DELETE, POST"
Header Set Access-Control-Request-Method: "GET, PUT, OPTIONS, DELETE, POST"
 

<VirtualHost *:80>
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
</VirtualHost>

<VirtualHost *:443>
    ServerName <Nome externo do servidor>
    RequestHeader set X-Forwarded-Host <Nome externo do servidor>:443
    RequestHeader set X-Forwarded-Proto https
    SSLProxyEngine On
    SSLEngine On
    SSLCertificateFile <diretorio-certificado>.crt
    SSLCertificateKeyFile <diretorio-chave-privada>.key
    SSLCertificateChainFile <diretorio-cadeia-certificados>.pem
    ProxyPreserveHost On
    ProxyPass / http://<IP do servidor fluig>:<Porta do servidor Fluig>/
    ProxyPassReverse / https://<Nome externo do servidor/
</VirtualHost>
 
<VirtualHost *:21>
    ServerName <Nome externo do servidor>
    ProxyPreserveHost On
    ProxyPass / ftp://<IP do servidor Fluig>/
    ProxyPassReverse / ftp://<IP do servidor Fluig>:21/
</VirtualHost>

Legenda

<Nome externo do servidor>: nome que aparecerá na URL do navegador, por exemplo, http://meuservidor.com.br.

<diretorio-certificado>: diretório e nome do arquivo do certificado de domínio enviado pela entidade certificadora, por exemplo: /etc/httpd/ssl/cert-dominio.crt

<diretorio-chave-privada>: diretório e nome do arquivo da chave privada, enviada pela entidade certificadora, por exemplo: /etc/httpd/ssl/chave-privada.key

<diretorio-cadeia-certificados>: diretório e nome do arquivo que contém a cadeia de certificados, por exemplo: /etc/httpd/ssl/cert-cadeia-certificados.pem

Nota:

O caminho da pasta pode variar, esse caminho do exemplo é de uma instalação Linux CentOS.

DICA: O arquivo referente à cadeia de certificados pode ser criado concatenando os certificados de domínio, intermediários e raiz. No Linux, isto pode ser feito com o comando abaixo:

cat cert-dominio.crt cert-intermediario.crt cert-raiz.crt > cert-cadeia-certificados.pem

OBS: Os certificados intermediários e raiz normalmente podem ser encontrados para download no site da entidade certificadora que você escolheu.

<IP do servidor fluig>: endereço IP interno do servidor onde o Fluig está rodando, por exemplo, 10.10.2.35.

Configuração para acessar a plataforma via mobile/OAuth


Essa configuração deve ser realizada para garantir que a requisição chega ao conector HTTP com o mesmo protocolo a partir do qual a requisição foi originada.

01. Edite o arquivo standalone.xml localizado no diretório do servidor de aplicação [diretório_instalação]/appserver/standalone/configuration/.

02. Localize o seguinte código:

standalone.xml

<subsystem xmlns="urn:jboss:domain:undertow:3.1">
	<buffer-cache name="default"/>
	<server name="default-server">
		<http-listener max-post-size="1073741824" name="default" socket-binding="http"/> <!-- Alterar esta linha -->
		<host alias="localhost" name="default-host"><single-sign-on path="/"/><filter-ref name="gzipFilter" predicate="path-suffix['.css'] or path-suffix['.js']"/></host>
    </server>
	<servlet-container name="default" stack-trace-on-error="local-only">
 		<jsp-config/>
		<websockets/>
	</servlet-container>
	<filters><gzip name="gzipFilter"/></filters>
</subsystem>

03. Na tag http-listener inclua o atributo proxy-address-forwarding com valor true, conforme mostrado abaixo:

<http-listener max-post-size="1073741824" name="default" socket-binding="http" proxy-address-forwarding="true"/>

01. Edite o arquivo domain.xml localizado no diretório do servidor de aplicação [diretório_instalação]/appserver/domain/configuration/.

02. Localize o seguinte código:

domain.xml

<subsystem xmlns="urn:jboss:domain:undertow:3.1">
	<buffer-cache name="default"/>
	<server name="default-server">
		<http-listener max-post-size="1073741824" name="default" socket-binding="http"/> <!-- Alterar esta linha -->
		<host alias="localhost" name="default-host"><single-sign-on path="/"/><filter-ref name="gzipFilter" predicate="path-suffix['.css'] or path-suffix['.js']"/></host>
    </server>
	<servlet-container name="default" stack-trace-on-error="local-only">
 		<jsp-config/>
		<websockets/>
	</servlet-container>
	<filters><gzip name="gzipFilter"/></filters>
</subsystem>

03. Na tag http-listener inclua o atributo proxy-address-forwarding com valor true, conforme mostrado abaixo:

<http-listener max-post-size="1073741824" name="default" socket-binding="http" proxy-address-forwarding="true"/>

Configuração do Apache (SSL) + Fluig (SSL)


01. Acesse a pasta /etc/httpd/conf.d.

Nota:

O caminho da pasta pode variar, esse caminho do exemplo é de uma instalação Linux CentOS.

02. Crie um arquivo de configuração para a plataforma (chamado fluig.conf, por exemplo), com o conteúdo abaixo, caso seja utilizado HTTPS também no lado do Fluig.

Importante!

Lembrando que, se o seu ambiente utiliza [balanceamento de carga](../Alta disponibilidade e balanceamento de carga.md), a configuração de HTTPS deve ser replicada manualmente para todos os servidores do Fluig.

Header set Access-Control-Allow-Origin: "https://<Nome externo do servidor>"
Header set Access-Control-Allow-Headers: "Content-Type, X-Requested-With, accept-version"
Header set Access-Control-Allow-Methods: "GET, PUT, OPTIONS, DELETE, POST"
Header Set Access-Control-Request-Method: "GET, PUT, OPTIONS, DELETE, POST"


<VirtualHost *:443>
 ServerName <Nome externo do servidor>
 RequestHeader set X-Forwarded-Host <Nome externo do servidor>:443
 RequestHeader set X-Forwarded-Proto https
 SSLProxyEngine On
 SSLEngine On
 SSLCertificateFile <diretorio-certificado>.crt
 SSLCertificateKeyFile <diretorio-chave-privada>.key
 SSLCertificateChainFile <diretorio-cadeia-certificados>.pem
 ProxyPreserveHost On
 ProxyPass / https://<IP do servidor Fluig>:<Porta do servidor Fluig>/
 ProxyPassReverse / https://<Nome externo do servidor>/
</VirtualHost>
 
<VirtualHost *:21>
 ServerName <Nome externo do servidor>
 ProxyPreserveHost On
 ProxyPass / ftp://<IP do servidor Fluig>/
 ProxyPassReverse / ftp://<IP do servidor Fluig>:21/
</VirtualHost>

Configurar Rate Limit de requisições


Pré-requisitos


É necessário ter o Apache com módulos habilitados:

  • mod_evasive (proteção contra abuso — recomendado)

Usando mod_evasive


Instalação

No Ubuntu/Debian: sudo apt install libapache2-mod-evasive

Ative

sudo a2enmod evasive
sudo systemctl restart apache2

Configuração básica


Edite: /etc/apache2/mods-enabled/evasive.conf

Exemplo

<IfModule mod_evasive20.c>
 	DOSHashTableSize 3097
 	DOSPageCount 5
 	DOSPageInterval 1
 	DOSSiteCount 50
 	DOSSiteInterval 1
 	DOSBlockingPeriod 10
 	DOSEmailNotify admin@seusite.com
</IfModule>

Aplicar ao endpoint específico


O mod_evasive não limita diretamente por URL de forma nativa, mas é possível combinar com Location.

ESTRATÉGIA

VirtualHost + Location ServerName seu_dominio.com <location "="" api="" public="" social="" post="" publish"=""> SetEnvIf Request_URI "^/api/public/social/post/publish$" rate_limit

O mod_evasive vai reagir automaticamente ao excesso de requisições nesse endpoint.

Customizando o comportamento de bloqueio


O parâmetro DOSBlockingPeriod define a duração da restrição aplicada ao endereço IP identificado como abusivo.

  • Configuração: DOSBlockingPeriod 30
  • Funcionamento: Suspende o acesso do IP por 30 segundos.

Reativação

Se o IP realizar uma nova requisição antes do término desse período, o contador é reiniciado, prolongando o bloqueio por mais 30 segundos a partir da última tentativa.

Ajuste de sensibilidade (configuração restritiva)


Estes parâmetros definem o limiar de tolerância para requisições repetitivas ao mesmo recurso.

  • DOSPageCount 3: Define o limite máximo de solicitações permitidas.
  • DOSPageInterval 1: Define a janela de tempo (em segundos) para a contagem acima.
  • Resultado Prático: O sistema bloqueia o IP se ele exceder 3 requisições por segundo direcionadas ao mesmo endpoint (página ou objeto específico).

Recomenda-se testar esse limite em ambientes de homologação antes de aplicar em produção.

Exemplo completo


Este exemplo estabelece uma política de limitação de taxa (rate limiting) para mitigar comportamentos automatizados abusivos, definindo limites de frequência por recurso individual e por volume global de tráfego originado de um único endereço IP.

<IfModule mod_evasive20.c>
 	DOSHashTableSize 3097
 	DOSPageCount 5
 	DOSPageInterval 1
 	DOSSiteCount 50
 	DOSSiteInterval 1
 	DOSBlockingPeriod 10
</IfModule>
<VirtualHost *:80>
 	ServerName seu_dominio.com

 	<Location "/api/public/social/post/publish">
 		Require all granted
 	</Location>
</VirtualHost>

Ocultar informações no cabeçalho HTTP


Para prevenir vulnerabilidades, é importante que as informações não fiquem expostas no cabeçalho HTTP. [Clique aqui](Ocultar informações no cabeçalho HTTP.md) e saiba como ocultá-las.