Files

475 lines
17 KiB
Markdown
Raw Permalink Normal View History

2026-05-06 13:35:47 -03:00
---
title: Configuração de proxy reverso Apache
source: https://tdn.totvs.com/pages/viewpage.action?pageId=877162376
path: \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](#ConfiguraçãodeproxyreversoApache-Objetivo)
- [Pré-requisitos](#ConfiguraçãodeproxyreversoApache-Pré-requisitos)
- [Módulos Apache](#ConfiguraçãodeproxyreversoApache-MódulosApache)
- [Configuração do Apache (sem SSL)](#ConfiguraçãodeproxyreversoApache-ConfiguraçãodoApache(semSSL))
- [Listener HTTP](#ConfiguraçãodeproxyreversoApache-ListenerHTTP)
- [Listener do RealTime](#ConfiguraçãodeproxyreversoApache-ListenerdoRealTime)
- [Listener FTP](#ConfiguraçãodeproxyreversoApache-ListenerFTP)
- [Configuração do Apache (SSL) + Fluig (HTTP)](#ConfiguraçãodeproxyreversoApache-ConfiguraçãodoApache(SSL)+Fluig(HTTP))
- [Configuração para acessar a plataforma via mobile/OAuth](#ConfiguraçãodeproxyreversoApache-Configuraçãoparaacessaraplataformaviamobile/OAuth)
- [Configuração do Apache (SSL) + Fluig (SSL)](#ConfiguraçãodeproxyreversoApache-ConfiguraçãodoApache(SSL)+Fluig(SSL))
- [Configurar Rate Limit de requisições](#ConfiguraçãodeproxyreversoApache-ConfigurarRateLimitderequisições)
- [Pré-requisitos](#ConfiguraçãodeproxyreversoApache-Pré-requisitos.1)
- [Usando mod\_evasive](#ConfiguraçãodeproxyreversoApache-Usandomod_evasive)
- [Configuração básica](#ConfiguraçãodeproxyreversoApache-Configuraçãobásica)- [Aplicar ao endpoint específico](#ConfiguraçãodeproxyreversoApache-Aplicaraoendpointespecífico)
- [Customizando o comportamento de bloqueio](#ConfiguraçãodeproxyreversoApache-Customizandoocomportamentodebloqueio)
- [Ajuste de sensibilidade (configuração restritiva)](#ConfiguraçãodeproxyreversoApache-Ajustedesensibilidade(configuraçãorestritiva))
- [Exemplo completo](#ConfiguraçãodeproxyreversoApache-Exemplocompleto)
- [Ocultar informações no cabeçalho HTTP](#ConfiguraçãodeproxyreversoApache-OcultarinformaçõesnocabeçalhoHTTP)
# 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](http://tdn.totvs.com/x/EO4KDg) e saiba como fazer.
- Obtenha mais informações sobre DMZ em [Topologia DMZ](../Topologia DMZ.md).
- [Clique aqui](https://httpd.apache.org/docs/current/platform/windows.html) 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](http://tdn.totvs.com/x/vdMgFQ).
- Para a porta do realtime (7777) no Apache é necessário habilitar o módulo SSL em todos os vhosts que utilizarem o *realtime*   **SSLEngine On**e **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 externo do servidor>**: nome que aparecerá na URL do navegador, por exemplo, http://**meuservidor.com.br**.
**<IP do servidor Fluig>**: 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](https://tdn.totvs.com/pages/viewpage.action?pageId=354472893#Configura%C3%A7%C3%A3oHTTPSdaplataforma-Configura%C3%A7%C3%A3odeHTTPSmanual) 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](http://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.