Kong の使用による API の保護と制限

すばらしい RESTful API の構築を終え、必要なエンドポイントを実装し、開発者が利用できるところまできていると仮定しましょう。この段階で API を公開する前に必要なステップは、たいてい次のとおりです。

  1. API を保護するために、API キーや基本認証を使ったセキュリティ メカニズムを設置する。
  2. レート制限を設定し、開発者によるサービスへの過剰なリクエストを回避する。
  3. 特定の開発者をホワイトリストに登録し、設定以上のリクエストを可能にする。

オープン ソースの API ゲートウェイである Kong を使うと、上記の 3 点が容易に実装できます。何よりも、タイムリーに実行できることが魅力です。

エクセルソフトでは、Kong のインストール ドキュメント、クイック スタートなどを日本語化しております。ドキュメントはこちらをご覧ください。

Kong の仕組み

Kong はAPI の手前に位置し、アップストリーム API への主要なエントリポイントとなります。リクエストおよびレスポンス処理中に、Kong はAPI に追加されたあらゆる プラグイン を実行します。

ここでは、Kong をすでにインストールしていることを前提として話を進めます。

Kong API を追加

第一ステップとして、Kong の管理 API を使って Kong に API を追加します。API の例として Mockbin を使用し、Kong がローカル システムの既定のポートで起動していると仮定します。

curl http://127.0.0.1:8001/apis/ \
     -d "name=mockbin" \
     -d "request_path=/test" \
     -d "strip_request_path=true" \
     -d "upstream_url=http://mockbin.org"

Kong は、“/test” に送られるすべてのリクエストが Mockbin にプロキシされることを認識しています。次のようなリクエストをKong のプロキシ ポートに送り、テストします。

curl http://127.0.0.1:8000/test/request

{
    "startedDateTime": "2016-03-08T07:37:03.611Z",
    "clientIPAddress": "127.0.0.1",
    "method": "GET",
    ...
}

リクエストが Kong によって受信され、Kong に API を追加した際に使用した “strip_request_path” プロパティで指示した通り、“/test” パスを取り除いてから Mockbin にプロキシされます。

キー認証の追加

API が Kong に追加されると、Kong Plugins を利用してさらなる機能を追加することができます。たとえば、開発者が API を使用する場合に有効な API キーを必要とする、キー認証プラグインを追加します。

curl http://127.0.0.1:8001/apis/mockbin/plugins/ \
     -d "name=key-auth" \
     -d "config.key_names=apikey"

必要なのは以上です。ほんの数秒でキー認証セキュリティを追加できました。セキュリティのクレデンシャル情報が作成されていないため、このままでは API を使用しようとすると失敗します。

curl http://127.0.0.1:8000/test/request 

{ 
    "message":"No API Key found in headers, body or querystring" 
}

ユーザーとクレデンシャル情報の作成

これで API は保護されましたので、ユーザーを作成して API キーのクレデンシャル情報を関連付ける必要があります。これは非常に簡単なプロセスです。まずユーザーを作成しましょう。

curl http://127.0.0.1:8001/consumers/ \
     -d "username=mike"

次に、そのユーザーに関する新しいクレデンシャル情報を作成します。

curl http://127.0.0.1:8001/consumers/mike/key-auth/ \
     -d "key=secret_key_123"

ここまでで、API、認証プラグイン、ユーザー、そしてクレデンシャル情報が準備できました。たとえば、次のようにリクエストにクレデンシャル情報を付け加えることで、API が使用できるようになります。

curl http://127.0.0.1:8000/test/request?apikey=secret_key_123

{
    "startedDateTime": "2016-03-08T07:37:03.611Z",
    "clientIPAddress": "127.0.0.1",
    "method": "GET",
    ...
}

ユーザーが適切に認証され、リクエストが API に送られました。

レート制限の追加

Kong のキー認証プラグインを使って API が保護されましたので、今度は レート制限プラグインを使って各ユーザーにつきリクエスト数を 1 分につき 10 件までというレート制限機能を追加し、過剰なリクエストからも保護しましょう。

curl http://127.0.0.1:8001/apis/mockbin/plugins/ \
     -d "name=rate-limiting" \
     -d "config.minute=10"

これだけです。今後 10 件以上のリクエストを送った場合、Kong から次のようなエラー メッセージが発信されます。

curl http://127.0.0.1:8000/test/request?apikey=secret_key_123

{
    "message":"API rate limit exceeded"
}

ここまでは順調です。文字通りほんの 5 つの HTTP リクエスト Kong の管理 API に送っただけで、Kong に API を追加し、キー認証で保護し、ユーザーとクレデンシャル情報を作成し、さらに、レート制限機能を追加できました。

ユーザーごとのレート制限のカスタマイズ

より高いレート制限を必要とするエンタープライズのお客さんがいると想定します。プラグインを追加する際に “consumer_id” プロパティを指定することで、API 毎だけでなく、API とユーザー毎において多くのプラグインを Kong に設定することができます。

curl http://127.0.0.1:8001/consumers?username=mike

{
    "total":1,
    "data":[{
        "id":"03040614-5cfb-4138-8277-c3f856de1fe8",
        "username":"mike",
        "created_at":1457423123000
    }]
}

ユーザーの ID は “03040614-5cfb-4138-8277-c3f856de1fe8” ですので、このユーザーに関してのみカスタムのレート制限プラグインを追加し、1 分につき 200 件までのリクエストを許可します。

curl http://127.0.0.1:8001/apis/mockbin/plugins/ \
     -d "name=rate-limiting" \
     -d "config.minute=200"

上記のコマンドによって、ユーザー“mike” は Kong にブロックされる前に 200 件のリクエストが送信できるようになりますが、他のユーザーに関しては前述の、1 分につき 10 件までのリクエスト制限が維持されます。

次のステップ

Kong は、認証からロギング、変換、モニタリングまで、ほぼあらゆる主要なAPI の要件を実装できる、数十種類のプラグインをサポートしています。ステートレスであるため、複数の Kong インスタンスを追加するだけでシステムを拡張でき、あらゆる RESTful API やマイクロサービスをサポートできます。

記事参照:
2016年 3月 17日 Marco Palladino
© Mashape Inc, 2017「Protecting and Rate Limiting an API with Kong」
http://blog.mashape.com/protecting-rate-limiting-api-kong/

シェアする

  • このエントリーをはてなブックマークに追加

フォローする