Bloquear acesso de externo através de url
-
Em um NAT de entrada podemos restringir através de uma lista de IPs, por exemplo, que podem ter acesso a um serviço publicado em um IP e porta da rede local.
Um servidor web tem a capacidade de traduzir o a url digitada e apresentar o site correto quando utilizamos o Virtual Host, assim um único servidor pode hospedar múltiplos sites de diversos domínios.
Citei esse exemplo pois acredito ser possível então usar a URL utilizada na requisição a ser direcionada para o servidor publicado através de NAT de entrada para permitir ou não o acesso a uma parte do sistema.
Ex.: Preciso que acessem um sistema através de www.meusistema.com.br/clientes, mas não exista acesso a www.meusistema.com.br/interno
Como consigo fazer esse bloqueio?
-
@alisson-rocha Pelo pfsense eu não acho que isso seja possível, pois a nível de Firewall, seria encaminhamento de porta e regras apenas.
Algumas pessoas usam o proxy reverso, eu nunca usei, de repente lá você tenha mais granularidade para fazer esse tipo de configuração, mas eu desconheço, vale a pena verificar.A nível do servidor web, pela configuração do apache por exemplo, existe uma possibilidade de permitir apenas usuários autenticados, no qual o usuário precisaria digitar usuário e senha para ter acesso ao site interno.
Nesse caso, é primordial usar conexão HTTPS para que a senha não seja transmitida sem criptografia pela internet. Você vai precisar de certificados SSL válidos caso prossiga dessa forma.Segue um exemplo funcional de como seria uma configuração no apache com autenticação de usuário no AD, pertencentes ao grupo services criado no AD.
<Directory /var/www/html/diretorio> AuthType Basic AuthName "Acesso restrito" AuthBasicProvider ldap AuthLDAPBindDN "CN=svc_apache,CN=Users,DC=local,DC=lan" Include ldap AuthLDAPUrl "ldap://IP_DO_ACTIVE_DIRECTORY:389/cn=Users,dc=local,dc=lan?sAMAccountName?sub?(objectClass=*)" AuthLDAPGroupAttribute member Require ldap-group CN=services,CN=Users,DC=local,DC=lan <LimitExcept GET POST HEAD> deny from all </LimitExcept> </Directory>
Em relação ao virtual host, você pode permitir apenas alguns endereços IPs com a diretiva require ip conforme abaixo:
<VirtualHost *:80> <Location /> Require ip 192.168.0.0/24 </Location> ... </VirtualHost>
Uma outra observação, é fazer o direcionamento da porta 80 para a porta 443, e impedir o acesso direto por IP, que seria feito dessa forma, exemplos também funcionais:
/etc/apache2/sites-enabled $ cat 000-default.conf
<VirtualHost *:80> ServerName IP_INTERNO_SERVIDOR_WEB Redirect 403 / UseCanonicalName Off </VirtualHost> <VirtualHost *:80> ServerName example.domain.org Redirect permanent / https://example.domain.org/ DocumentRoot /var/www/html </VirtualHost>
/etc/apache2/sites-enabled $ cat 000-default-ssl.conf
<IfModule mod_ssl.c> <VirtualHost _default_:443> ServerAdmin webmaster@localhost ServerName example.domain.org DocumentRoot /var/www/html
-
@mcury O detalhe é que deve ser possível que usuários internos acessem a url /interna pois há um NAT Reflection mas externamente essa url não pode ser acessada. já a url /cliente deve ser possível acessá-la externamente. Vou pesquisar sobre proxy reverso para ver se tem algo que me ajude.
-
@alisson-rocha NAT Reflection é considerado um "hack" e não é a maneira recomendada de se fazer esse acesso, eu teria desabilitado esse NAT, e feito com que o pessoal de dentro, acessasse o servidor diretamente, com SPLIT DNS.
-
@mcury Ok, mas quanto a necessidade de acesso externo a url /externo ?
-
@alisson-rocha Eu teria feito dessa maneira:
Acesso externo:
Encaminhamento de porta normal.
Usuários acessariam pelo IP externo e seriam encaminhados para o servidor diretamente na porta do servidor WEB.
Pode publicar seu IP externo no DNS público com o nome do site em questão.Acesso interno:
Sem encaminhamento de porta.
Usuários internos, utilizando o DNS interno (do pfsense ou qualquer outro servidor DNS que você possua), ao acessarem o endereço do site, receberiam o endereço do servidor WEB diretamente, nesse caso endereço interno do servidor como por exemplo, 192.168.10.25.
Seria necessário criar uma entrada no DNS interno com o nome do site, e o endereço do site para que isto seja possível, ou seja, SPLIT DNS. -
Nesse caso, você poderia utilizar o modo de autenticação como citei anteriormente.
Ou seja, apenas usuários autenticados poderiam acessar o site interno, não haveria diferença se viessem da Internet, ou internamente. Eles precisariam de usuário e senha.
-
@mcury Ok, mas se externamente o usuário acessasse a url /interno ela iria ter acesso ao sistema, e é justamente isso que desejo bloquear.
-
www.meusistema.com.br/clientes - Acesso livre.
www.meusistema.com.br/interno - Solicitar autenticação