Estou executando uma instalação de um webapp em execução em um servidor auto-hospedado que está na minha rede principal junto com todos os nossos PCs da empresa e alguns outros servidores.
Decidimos adicionar a autenticação básica HTTP como uma camada extra de segurança, mas queremos que as pessoas conectadas à rede local fiquem isentas disso.
Depois de tentar usar inicialmente as diretivas allow
e deny
, convenci um usuário do Stack Overflow a usar geo
. Eu progredi, mas acertei um problema frustrante. Eu não consigo abrir uma exceção para o intervalo de endereços IP 192.168.1.1-192.168.1.255.
Para mostrar o que estou fazendo, adicionarei o snippet abaixo com intervalos de endereços e, depois, explico melhor.
geo $authentication {
default "Authentication required";
127.0.0.1 "off";
192.168.1.0/24 "off";
10.8.0.0/24 "off";
78.432.xx.xx/0 "off";
0.0.0.0/0 "off"
}
server {
location / {
auth_basic $authentication;
auth_basic_user_file /etc/nginx/.htpasswd;
}
}
Eu tenho todos os intervalos de endereços IP comentados (além de 127.0.0.1) e é isso que acontece em cada cenário:
0.0.0.0/0
, posso conectar-me à página sem credenciais conforme o esperado. 78.432.xx.xx/0
(que é o meu endereço público real, redigido), posso acessar a página sem credenciais conforme o esperado. 10.8.0.0/24
(esses são os endereços IP atribuídos aos usuários ao usar nossa VPN) enquanto estiver conectado à VPN e, portanto, tiver atribuído o endereço 10.8.0.5
, ao acessar a página da web eu recebo as credenciais solicitadas, não é o que eu esperaria. 192.168.1.0/24
, ao acessar a página da web, recebo uma solicitação de credenciais, o que não é o que eu esperaria. Observe que meu endereço IP local é 192.168.1.22
. Eu posso ver ao acessar a página nos logs do nginx:
78.432.xx.xx - - [23/Jan/2018:13:58:57 +0000] "GET / HTTP/1.1" 401 195 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0"
Isso sugere que o nginx está detectando corretamente meu endereço IP externo e solicitando credenciais com base nisso, mas que a entrada para endereços IP internos não está tendo impacto. Isso é confirmado pelo fato de que, se eu inserir 192.168.1.102
no navegador em vez do nome de domínio, posso obter acesso sem credenciais necessárias.
A autenticação básica está funcionando e também o controle de IP, mas claramente estou fazendo algo errado, mas não consigo descobrir o que é.
A questão é, como eu digo ao nginx para pular a autenticação se ele detectar um endereço IP local?