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 がローカル システムの既定のポートで起動していると仮定します。

[csharp light=”true”]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"[/csharp]

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

[csharp light=”true”]curl http://127.0.0.1:8000/test/request

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

}[/csharp]

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

キー認証の追加

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

[csharp light=”true”]curl http://127.0.0.1:8001/apis/mockbin/plugins/ \
-d "name=key-auth" \
-d "config.key_names=apikey"[/csharp]

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

[csharp light=”true”]curl http://127.0.0.1:8000/test/request

{
"message":"No API Key found in headers, body or querystring"
}[/csharp]

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

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

[csharp light=”true”]curl http://127.0.0.1:8001/consumers/ \
-d "username=mike"[/csharp]

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

[csharp light=”true”]curl http://127.0.0.1:8001/consumers/mike/key-auth/ \
-d "key=secret_key_123"[/csharp]

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

[csharp light=”true”]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",

}[/csharp]

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

レート制限の追加

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

[csharp light=”true”]curl http://127.0.0.1:8001/apis/mockbin/plugins/ \
-d "name=rate-limiting" \
-d "config.minute=10"[/csharp]

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

[csharp light=”true”]curl http://127.0.0.1:8000/test/request?apikey=secret_key_123

{
"message":"API rate limit exceeded"
}[/csharp]

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

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

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

[csharp light=”true”]curl http://127.0.0.1:8001/consumers?username=mike

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

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

[csharp light=”true”]curl http://127.0.0.1:8001/apis/mockbin/plugins/ \
-d "name=rate-limiting" \
-d "config.minute=200"[/csharp]

上記のコマンドによって、ユーザー“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/

 

 

 

 

タイトルとURLをコピーしました