
本記事は Kong Blog の記事を翻訳し転載しています。

Raja Ravi Varman
Kong Champion
アプリケーションや API への安全なアクセスを確保することは非常に重要です。組織がマイクロサービスアーキテクチャやクラウドネイティブソリューションを採用するにつれて、堅牢できめ細かなアクセス制御メカニズムの必要性はますます高まっています。そこでは、Open Policy Agent (OPA) と Kong Gateway の組み合わせが威力を発揮します。
Open Policy Agent を使用すると、組織は宣言的な方法でシステム全体のポリシーを定義し、適用できます。OPAを活用することで、チームはユーザー属性やロール、さらには時刻など、さまざまな要素に応じたコンテキスト認識型のアクセス制御ポリシーを作成できます。一方、Kong Gateway は、トラフィックの管理にとどまらず、広範なプラグイン エコシステムを通じて、セキュリティを強化する多機能な API ゲートウェイとして機能します。
OPAをKong Gateway と統合することで、組織はアクセス管理を一元化されたスケーラブルなアプローチを実現できます。この統合により、チームは特定のリソースへのアクセスを制御する動的なポリシーを実装できるようになり、定義された条件に基づいて承認されたユーザーだけがアクセスできるようになります。
本記事では、OPAとKong を使用して安全なアクセス制御を効果的に実装する方法を解説し、アプリケーションのセキュリティ体制を強化するための知識を提供します。
OPA と Kong Gateway とは
Open Policy Agent (OPA) の概要
Open Policy Agent(OPA)は、マイクロサービス、Kubernetes、クラウドネイティブ アプリケーションなど、さまざまな環境でポリシーを定義し適用できる、オープンソースの汎用ポリシーエンジンです。OPA は、ポリシーの判断をアプリケーションのロジックから切り離し、チームが管理するサービスから独立して、ポリシーを管理できるようにします。この分離により柔軟性と保守性が向上し、ポリシー ロジックをアプリケーションのコードに直接組み込むことなく、複雑なアクセス制御を簡単に実装できるようになります。
OPA の中核をなすのは、ポリシー定義専用に設計された宣言型言語であるRegoです。Regoを使用することで、ユーザーは JSONやYAMLなどの構造化データを評価できるポリシーを作成できます。これにより、組織はユーザー ロールやリクエストパラメータなど、さまざまな属性に基づいて適応するコンテキスト認識型のアクセス制御ポリシーを作成できるようになります。
OPAの主な特徴
- ポリシーのコードからの分離 : これにより、ポリシーを独立して更新・管理できるようになり、開発チームと運用チーム間のコラボレーションが向上します。
- 一元化されたポリシー管理 : OPAはポリシーの唯一信頼できるソースとして機能し、様々なサービスや環境間で一貫性を確保します。
- 柔軟性とスケーラビリティ : OPA はさまざまな環境に展開でき、スケーラブルなアーキテクチャをサポートします。
Kong Gatewayの概要
Kong Gateway は、さまざまなプラグインを通じてセキュリティを強化しながら、組織が API へのトラフィックを効果的に管理するのに役立ちます。クライアントとサービスの間で仲介役を果たし、負荷分散やレート制限、認証などの機能を提供します。Kong の優れた点のひとつは、API のワークフローに簡単に統合できるプラグインを活用した拡張性です。
OPA と組み合わせると、Kong はバックエンドサービスから、ポリシー判断の負荷を軽減できます。この統合により、組織は API 全体にわたって、一貫性のあるきめ細かなアクセス制御ポリシーを実装できます。認可の判断を OPA に委任することで、Kong は、Rego で定義されたルールに基づいてアクセスを許可または拒否し、セキュリティを強化するとともに、ポリシー管理を簡素化します。
Kongの主な特徴
- API 管理: Kong は、API のパフォーマンス監視、トラフィック管理、エンドポイントのセキュリティ保護のためのツールを提供します。
- プラグインエコシステム: 豊富なプラグインが揃っているため、Kong は特定のセキュリティや運用ニーズに合わせてカスタマイズが可能です。
- OPA とのシームレスな統合: この統合により、さまざまなユーザー属性やコンテキストに基づいた動的なポリシー適用が可能になります
OPAとKongを統合するメリット
Open Policy Agent (OPA) と Kong Gateway を統合することで、API 管理とセキュリティを強化する、さまざまな利点が得られます。この組み合わせにより、組織は柔軟でスケーラブルな細かいアクセス制御ポリシーを実装でき、最新のアプリケーション アーキテクチャの複雑さにも対応できます。
きめ細かなアクセス制御
Kong Gateway で OPA を使用する主な利点の一つは、細かいアクセス制御を強制できる点です。OPA を使用することで、組織はユーザーロールやリクエストパラメータ、コンテキスト情報など、さまざまな属性を考慮したポリシーを定義できます。この詳細なレベルにより、アクセス判断が特定の基準に基づいて行われ、誰がどのリソースにアクセスできるかをより精密にコントロールできるようになります。たとえば、特定のロールを持つユーザーだけが機密なエンドポイントにアクセスできるようなポリシーを作成することで、不正アクセスのリスクを大幅に減らすことができます。
分散システムのスケーラビリティ
アプリケーションがマイクロサービス アーキテクチャに進化するにつれ、スケーラビリティは重要な課題となります。OPA と Kong を統合することで、ポリシーの判断を個々のサービスではなく API ゲートウェイで一元管理できるようになり、システム全体のスケーラビリティが向上します。この仕組みにより、サービスごとに個別のアクセス制御を実装する必要性が最小限に抑えられ、分散システム全体でポリシー管理が合理化されます。アクセス制御の判断を Kong に一元化することで、パフォーマンスや信頼性を損なうことなく、効率的なポリシー管理が可能になります。
宣言型ポリシー言語(Rego)
OPA は、宣言型ポリシー言語である Rego を採用しており、ポリシーの定義や管理をシンプルにします。Rego を使うことで、ポリシー策定者は複雑なルールをわかりやすく簡潔に記述できるようになります。また、ビジネス要件の変化に応じてポリシーを柔軟に更新および変更できるため、新たなセキュリティ要件やコンプライアンス規制に対して、迅速に対応できます。また、宣言型の特性により可読性や保守性が向上し、チーム内でのポリシー策定の共同作業をスムーズにします。
さまざまなレイヤーにおける一貫性
OPA を Kong と統合することで、API や Kubernetes クラスター、データベースなど、アプリケーションのあらゆるレイヤーで一貫性が確保されます。ゲートウェイ レベルでポリシーを一元管理することで、認可ポリシーの信頼できる唯一の情報源を維持できます。その一貫性によって、構成ミスのリスクを軽減し、すべてのサービスが同じセキュリティ基準を満たすことが保証され、コンプライアンス対応や監査の手間が削減されます。
セキュリティ体制の強化
OPA と Kong を組み合わせることで、組織のセキュリティ体制を大幅に強化できます。OPA の動的ポリシー評価機能と Kong の強力な API 管理機能を活用することで、GDPR や HIPAA などの規制基準を満たしつつ、不正アクセスを防ぐ包括的なセキュリティ対策を実現できます。この階層化されたセキュリティアプローチは、機密データの保護だけでなく、ユーザーと利害関係者の信頼を高めます。
合理化された開発プロセス
OPA と Kong を統合することで、ポリシー策定とサービス実装を分離することができます。これにより、ポリシー策定者は基盤となるサービスの深い知識を必要とせず、アクセス制御ルールの作成や改善に集中することができます。この分離により策定プロセスがスムーズになり、要件の変化に応じて、迅速にイテレーションやポリシーの変更が可能になります。さらに、ポリシーの展開を CI/CD パイプラインに組み込めば、テストや検証のプロセスを自動化でき、変更の反映を迅速かつ効率的に進めることが可能になります。
OPA の強力な機能を Kong Gateway と組み合わせ、活用することで、組織は最新のアプリケーション環境の要件に対応しながら、アクセス制御を管理する堅牢なフレームワークを実現し、全体的なセキュリティと運用効率を高めることができます。
OPA と Kong を統合するための実装手順

Open Policy Agent (OPA) を Kong Gateway に統合するには、アクセス制御ポリシーが適切に適用されるようにするための重要な手順があります。以下に、その設定方法を紹介します。
Step1:環境設定
始める前にKong と OPA の両方がインストールされ、正常に動作していることを確認してください。OPA は、スタンドアロンのサービスとして、またはサービスと一緒にサイドカーコンテナとして展開できます。Docker を使用している場合は、以下のコマンドで OPA を起動できます。
docker run -d --name opa \
-p 8181:8181 \
openpolicyagent/opa run --server
Step 2: Kong Gatewayを構成する
Kong でサービスとルートを作成する : まず、受信リクエストを処理するサービスとルートを Kong で定義する必要があります。これは、Kong Admin API を使って設定します。
curl -i -X POST http://localhost:8001/services \
--data "name=my-service" \
--data "url=http://my-backend-service"
curl -i -X POST http://localhost:8001/routes \
--data "paths[]=/" \
--data "service.id=<service_id>"
OPA プラグインをルートに追加する : サービスとルートの設定が完了したら、次に目的のルートで OPA プラグインを有効にする必要があります。これにより、Kong は認可の判断を OPA に委任できるようになります。
curl -X POST http://localhost:8001/routes/<route_id>/plugins \
--data "name=opa" \
--data "config.opa_path=/v1/data/example/allowBoolean" \
--data "config.opa_host=localhost" \
--data "config.opa_port=8181"
Step 3: Regoでポリシーを定義する
OPA が Kong と統合されたので、次に Rego を使用してアクセス制御ポリシーを定義する必要があります。アクセス制御のルールを指定するポリシーファイル(auth.rego
など)を作成します。
package example
default allow = false
allow {
input.method == "GET"
input.path = ["demo"]
input.user.role == "Moderator"
}
以下のコマンドを使用して、このポリシーを OPA にアップロードします。
curl -X PUT http://localhost:8181/v1/policies/auth \
-H "Content-Type: application/json" \
--data-binary @auth.rego
Step 4: 構成をテストする
すべての設定が完了したら、統合が期待どおりに機能するかテストします。
認証されたリクエストを行う : ポリシーに基づいて許可されるリクエストを送信します。
curl -X GET http://localhost:8000/demo \
-H 'Authorization: Bearer <your_token>' \
-H 'X-User-Role: Moderator'
不正なリクエストを行う:次に、不正なリクエストをテストします。
curl -X GET http://localhost:8000/demo \
-H 'Authorization: Bearer <your_token>' \
-H 'X-User-Role: User'
最初のケースではバックエンドサービスから正常な応答が返ってくるはずですが、2番目のケースでは、Kongから403 Forbidden
の応答が返され、OPAによってアクセスが拒否されたことが示されます。
Step 5: ポリシーを監視し調整する
アプリケーションが進化すると、新たな要件やユーザーロールの変更に応じてポリシーを調整する必要が出てくることがあります。Rego ポリシーは OPA で直接更新でき、必要に応じてテストできます。また、Kong と OPA の両方のログを監視することで、リクエストが正しく処理され、ポリシーが期待通りに適用されているかどうかを確認できます。
結論
これらの手順を実行することで、Open Policy Agent を Kong Gateway と正常に統合し、スケーラブルで管理しやすいアーキテクチャを維持しながら、API の細かなアクセス制御が可能になります。