Lorsque j'étais nouveau sur AWS, j'ai été confronté à un défi intéressant en travaillant sur une tâche de signature numérique d'un document, qui nécessitait l'adresse IP du client dans le cadre de la signature électronique. Au début, j’ai été ravi lorsque la mise en œuvre a semblé fonctionner parfaitement du premier coup. Cependant, mon enthousiasme fut de courte durée. Lors des tests, j'ai remarqué que la même adresse IP était renvoyée, même lorsque j'accédais à l'application depuis différentes machines. C'est alors que j'ai réalisé que l'adresse IP que je recevais n'était pas l'adresse IP réelle du client mais l'adresse IP de l'équilibreur de charge.
Cette découverte m'a conduit sur un chemin d'investigation et d'apprentissage. J'ai dû creuser plus profondément pour comprendre ce qui se passait et comment récupérer la véritable adresse IP du client. Dans ce blog, je partagerai mon expérience et fournirai un guide complet sur la façon d'y parvenir en utilisant AWS Lambda et Python, en vous assurant que vous pouvez capturer avec précision l'adresse IP du client lors de l'utilisation d'un équilibreur de charge d'application (ALB).
Lorsqu'un client fait une requête à votre application via un ALB, l'équilibreur de charge agit comme intermédiaire. Par conséquent, l’adresse IP vue par votre application est celle de l’ALB, et non celle du client. Pour résoudre ce problème, ALB inclut l'adresse IP du client dans l'en-tête HTTP X-Forwarded-For. Cet en-tête peut contenir plusieurs adresses IP au cas où la requête serait passée par plusieurs proxys.
Voici ce que nous devons gérer :
Extraire l'adresse IP du client : récupérez et analysez l'en-tête X-Forwarded-For.
Gérer plusieurs adresses IP : assurez-vous que nous obtenons la bonne adresse IP client même lorsque plusieurs proxys sont impliqués.
L'en-tête X-Forwarded-For doit être utilisé avec prudence en raison des risques de sécurité potentiels. Les entrées ne peuvent être considérées comme dignes de confiance que si elles sont ajoutées par des systèmes correctement sécurisés au sein du réseau. Cela garantit que les adresses IP des clients ne sont pas falsifiées et sont fiables.
AWS Lambda est un service de calcul sans serveur qui vous permet d'exécuter du code sans provisionner ni gérer de serveurs. Python, avec sa simplicité et sa lisibilité, est un excellent choix pour gérer cette tâche au sein d'une fonction Lambda.
Fonction AWS Lambda : fonction principale qui traite les demandes entrantes.
Application Load Balancer (ALB) : l'équilibreur de charge qui transmet les requêtes à la fonction Lambda.
Tout d'abord, assurez-vous que votre fonction Lambda est configurée et intégrée à un ALB. Suivez le guide officiel d'AWS si nécessaire : Utilisation des fonctions Lambda comme cibles pour Application Load Balancer.
Plongeons dans le code Python de la fonction Lambda. Cette fonction extraira l'adresse IP du client de l'en-tête 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}) }
Extraire l'en-tête : récupérez l'en-tête X-Forwarded-For de la requête entrante.
Analyser l'en-tête : prenez la première adresse IP, qui représente l'adresse IP d'origine du client.
Mécanisme de repli : utilisez l'adresse IP source du contexte de la requête si l'en-tête n'est pas présent.
Journalisation et réponse : enregistrez et renvoyez l'adresse IP du client pour vérification.
Demande :
{ "headers": { "x-forwarded-for": "203.0.113.195, 70.41.3.18, 150.172.238.178" }, "requestContext": { "identity": { "sourceIp": "70.41.3.18" } } }
Réponse :
{ "client_ip": "203.0.113.195" }
L'identification de l'adresse IP réelle du client dans une fonction AWS Lambda derrière un ALB nécessite une gestion minutieuse de l'en-tête X-Forwarded-For. Cette approche garantit une journalisation IP précise et améliore la capacité de l'application à personnaliser et sécuriser les interactions des utilisateurs.
Documentation AWS ALB :
Python dans AWS Lambda :
Explication des en-têtes HTTP
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!