17 KiB
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.