2017-03-20 17 views
2

'Custom Authorizer'ラムダ機能で、APIゲートウェイへの要求の送信元IPアドレスを取得することは可能ですか?APIゲートウェイカスタムオーソライザ - ソースIPアドレスを取得する

API Gateway to a lambda functionの実際の統合でこれは間違いなく可能です。カスタムオーサライザ機能でリクエスタのIPアドレスを取得することはできないようですが、

私の目標は、APIGでレートベースのブロックを直接行うことです。 A similar solution is described here。しかし、1つまたは2つのAPIGエンドポイントへのアクセスを制限するだけなので、私はむしろレート制限に達したときにAPIGの拒否ポリシーに送信元アドレスを追加するカスタムオーサライザ機能でこれを実行します。

編集:潜在的な混乱を明確にする。私は、上記のように定期的に統合し、this other postでこれを行うことができると理解しています。しかし、私はすべてのラムダ関数に同じレート制限コードを書く必要がないように、カスタムオーソライザ機能を利用しようとしています。

+1

* "APIGの拒否ポリシーに送信元アドレスをレートリミットに達したときに送信元アドレスを単純に追加するカスタム許可機能" *問題があるようです。ポリシーにはロック機構がないため、同時に複数の過剰なユーザーがいる場合(ポリシーのフェッチ、ポリシーの変更、ポリシーの保存)、ポリシーに「追加」すると同時に他のものを削除する状態に簡単に移行できます。ステートレスな世界では、レート制限の必要性を判断するためにどのようにカウントしていますか? –

+0

この数は、request_id、source_ip、およびTTLの列を持つDDBテーブルに保持されます。次に、カスタムオーサライザは、指定されたsource_ipと現在の時刻よりも長いTTLを持つエントリの数をチェックします。ここで、TTLは現在の時間に10秒を加えたもののようなものです。ロックは問題ではないと考えていたものです。とにかく私はCloudFrontとWAFを使ってしまうだろう。 – unclemeat

+0

ポリシーにアクセスするためにDDBテーブルにロックキーを追加できるとします。 – unclemeat

答えて

-1

カスタムオーソライザは、現在、Enhanced Contextという名前を使用できます。 appropriate context variableを使用して情報を取得することができます(例:$context.identity.sourceIp)。 でもAPIマッピングを使用できますが、テストしていません。

+0

context.identityオブジェクトは実際にはCognitoIdentityオブジェクトです。どの属性に 'sourceIp'属性がありません。私はあなたが[この投稿]からその情報を得たと仮定します(http://stackoverflow.com/questions/33062097/how-can-i-retrieve-a-users-public-ip-address-via-amazon-api-gateway-ラムダ-n)。これは、ソースIPをラムダに渡すためのAPIマッピングを作成することを意味しています。カスタムのオーソライザ機能でAPIマッピングを使用することはできません。この変数は、デフォルトでコンテキストオブジェクトでは使用できません。 – unclemeat

+1

Enhanced Contextに関するリンクを読んでいると、実際には認可者からAPIGに追加情報が返ってくるようです。 APIGコンテキストオブジェクトはラムダ関数に渡されません。彼らは2つの別々のものです。 – unclemeat

+0

私の最初のコメントでは、私はPythonコンテキストオブジェクトについて話していました。 – unclemeat

-1

あなたはそれが元のクライアントのIPが含まれています

event.requestContext.identity.sourceIp 

をご覧ください

events['headers']['X-Forwarded-For'] 
+0

いいえ、しないでください。そのヘッダーは信頼できません。誰でもリクエストに追加して、内部に任意の値を入れることができます。私はテストし、私の発明された価値はログに現れました。 –

0

で送信元IPだけでなく、任意のプロキシサーバーのIPアドレスを取得することができます。

「アイデンティティソース」セクション

Context: identity.sourceIp 

を追加して、キャッシュを有効(デフォルトは300秒である)にオーソライザを作成。 このようにして、オーサライザラムダは各リクエストに対して呼び出されることはありません。なぜなら、そのIPに対して返されたポリシーをキャッシュするからです。

渡されたイベントパラメータのロギングを追加すると、実験を行うことができます(キャッシングについて忘れてはならず、すべてのAPIゲートウェイが承認者ラムダを呼び出すわけではありません)。

ところで、「X-Forwarded-For」は別の@ binshiの回答に対する私のコメントを見てください。

関連する問題