Quando eu era novo na AWS, enfrentei um desafio interessante enquanto trabalhava em uma tarefa para assinar digitalmente um documento, que exigia o IP do cliente como parte da assinatura eletrônica. Inicialmente, fiquei emocionado quando a implementação pareceu funcionar perfeitamente na primeira vez. No entanto, minha excitação durou pouco. Durante os testes, notei que o mesmo endereço IP estava sendo retornado, mesmo quando eu acessava a aplicação em máquinas diferentes. Foi então que percebi que o endereço IP que estava recebendo não era o IP real do cliente, mas o IP do balanceador de carga.
Essa descoberta me levou a um caminho de investigação e aprendizado. Tive que me aprofundar para entender o que estava acontecendo e como recuperar o IP real do cliente. Neste blog, compartilharei minha experiência e fornecerei um guia completo sobre como conseguir isso usando AWS Lambda e Python, garantindo que você possa capturar com precisão o endereço IP do cliente ao usar um Application Load Balancer (ALB).
Quando um cliente faz uma solicitação ao seu aplicativo por meio de um ALB, o balanceador de carga atua como intermediário. Conseqüentemente, o endereço IP que seu aplicativo vê é o do ALB, não o do cliente. Para resolver isso, o ALB inclui o IP do cliente no cabeçalho HTTP X-Forwarded-For. Este cabeçalho pode conter vários endereços IP caso a solicitação tenha passado por vários proxies.
Aqui está o que precisamos lidar:
Extraia o IP do cliente: recupere e analise o cabeçalho X-Forwarded-For.
Tratar vários IPs: certifique-se de obter o IP do cliente correto mesmo quando vários proxies estiverem envolvidos.
O cabeçalho X-Forwarded-For deve ser usado com cautela devido a possíveis riscos de segurança. As entradas só podem ser consideradas confiáveis se adicionadas por sistemas devidamente protegidos na rede. Isso garante que os IPs do cliente não sejam adulterados e sejam confiáveis.
AWS Lambda é um serviço de computação sem servidor que permite executar código sem provisionar ou gerenciar servidores. Python, com sua simplicidade e legibilidade, é uma excelente escolha para lidar com essa tarefa dentro de uma função Lambda.
Função AWS Lambda: a função principal que processa solicitações recebidas.
Application Load Balancer (ALB): o balanceador de carga que encaminha solicitações para a função Lambda.
Primeiro, certifique-se de que sua função Lambda esteja configurada e integrada a um ALB. Siga o guia oficial da AWS, se necessário: Usando funções Lambda como destinos para Application Load Balancer.
Vamos mergulhar no código Python para a função Lambda. Esta função extrairá o endereço IP do cliente do cabeçalho X-Forwarded-For.
import json def lambda_handler(event, context): # Extract the 'X-Forwarded-For' header x_forwarded_for = event['headers'].get('x-forwarded-for') if x_forwarded_for: # The first IP in the list is the client's IP client_ip = x_forwarded_for.split(',')[0] else: # Fallback if header is not present client_ip = event['requestContext']['identity']['sourceIp'] # Log the client IP print(f"Client IP: {client_ip}") # Respond with the client IP return { 'statusCode': 200, 'body': json.dumps({'client_ip': client_ip}) }
Extraia o cabeçalho: recupere o cabeçalho X-Forwarded-For da solicitação recebida.
Analisar o cabeçalho: pegue o primeiro IP, que representa o IP original do cliente.
Mecanismo de fallback: use o IP de origem do contexto da solicitação se o cabeçalho não estiver presente.
Registro e Resposta: Registra e retorna o IP do cliente para verificação.
Solicitar:
{ "headers": { "x-forwarded-for": "203.0.113.195, 70.41.3.18, 150.172.238.178" }, "requestContext": { "identity": { "sourceIp": "70.41.3.18" } } }
Resposta:
{ "client_ip": "203.0.113.195" }
Identificar o IP real do cliente em uma função AWS Lambda por trás de um ALB requer um tratamento cuidadoso do cabeçalho X-Forwarded-For. Essa abordagem garante registro de IP preciso e aprimora a capacidade do aplicativo de personalizar e proteger as interações do usuário.
Documentação do AWS ALB:
Python no AWS Lambda:
Cabeçalhos HTTP explicados
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3