私が AWS を初めて使用したとき、ドキュメントにデジタル署名するタスクに取り組んでいたときに、電子署名の一部としてクライアントの IP を必要とする興味深い課題に直面しました。最初は、実装が初めて完璧に機能したように見えたときに興奮しました。しかし、私の興奮も長くは続きませんでした。テスト中に、別のマシンからアプリケーションにアクセスした場合でも、同じ IP アドレスが返されることに気付きました。そのとき、受け取っていた IP アドレスが実際のクライアント IP ではなく、ロード バランサーの IP であることに気づきました。
この発見は私を調査と学習の道に導きました。何が起こっているのか、そして実際のクライアント IP を取得する方法を理解するには、さらに深く掘り下げる必要がありました。このブログでは、私の経験を共有し、AWS Lambda と Python を使用してこれを実現し、Application Load Balancer (ALB) を使用するときにクライアントの IP アドレスを正確にキャプチャできるようにする方法に関する包括的なガイドを提供します。
クライアントが ALB を通じてアプリケーションにリクエストを送信すると、ロード バランサーが仲介者として機能します。したがって、アプリケーションが認識する IP アドレスは、クライアントの IP アドレスではなく、ALB の IP アドレスになります。これに対処するために、ALB はクライアントの IP を X-Forwarded-For HTTP ヘッダーに含めます。リクエストが複数のプロキシを通過した場合、このヘッダーには複数の IP アドレスを含めることができます。
処理する必要があるものは次のとおりです:
クライアント IP を抽出します: X-Forwarded-For ヘッダーを取得して解析します。
複数の IP を処理する: 複数のプロキシが関係している場合でも、正しいクライアント IP を取得できるようにします。
X-Forwarded-For ヘッダーは、潜在的なセキュリティ リスクのため、注意して使用する必要があります。エントリは、ネットワーク内で適切に保護されたシステムによって追加された場合にのみ信頼できると見なされます。これにより、クライアント IP が改ざんされておらず、信頼できることが保証されます。
AWS Lambda は、サーバーのプロビジョニングや管理を行わずにコードを実行できるサーバーレス コンピューティング サービスです。 Python は、そのシンプルさと読みやすさにより、Lambda 関数内でこのタスクを処理するのに最適な選択肢です。
AWS Lambda 関数: 受信リクエストを処理するコア関数。
Application Load Balancer (ALB): リクエストを Lambda 関数に転送するロードバランサー。
まず、Lambda 関数がセットアップされ、ALB と統合されていることを確認します。必要に応じて、AWS の公式ガイドに従ってください: Application Load Balancer のターゲットとしての Lambda 関数の使用。
Lambda 関数の Python コードを見てみましょう。この関数は、X-Forwarded-For ヘッダーからクライアントの IP アドレスを抽出します。
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}) }
ヘッダーの抽出: 受信リクエストから X-Forwarded-For ヘッダーを取得します。
ヘッダーの解析: クライアントの元の IP を表す最初の IP を取得します。
フォールバック メカニズム: ヘッダーが存在しない場合は、リクエスト コンテキストのソース IP を使用します。
ログと応答: 検証のためにクライアントの IP をログに記録して返します。
リクエスト:
{ "headers": { "x-forwarded-for": "203.0.113.195, 70.41.3.18, 150.172.238.178" }, "requestContext": { "identity": { "sourceIp": "70.41.3.18" } } }
応答:
{ "client_ip": "203.0.113.195" }
ALB の背後にある AWS Lambda 関数で実際のクライアント IP を特定するには、X-Forwarded-For ヘッダーを慎重に処理する必要があります。このアプローチにより、正確な IP ログが保証され、ユーザー インタラクションをパーソナライズして安全にするアプリケーションの機能が強化されます。
AWS ALB ドキュメント:
AWS Lambda の Python:
HTTP ヘッダーの説明
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3