チュートリアル:F5 NGINXでGraphQL APIを配信し、セキュリティを確保する

NGINX | 2023年7月20日

APIを構築する手法として、開発者の間でGraphQLの採用が進んでいます。GraphQLを使用すると、複数のソースからのデータ取得が容易になり、データへのアクセスと集約を効率化できます。単一のエンドポイントから1回のPOSTリクエストで複数のデータソースにクエリを実行できるため、開発者はさまざまなソースから必要なデータを正確にリクエストできます。このアプローチは、REST APIアーキテクチャで発生し得る制約の解消に役立ちます。たとえば、必要なデータがすべて含まれないアンダークエリや、複数のエンドポイントにリクエストを送信して過剰なデータを取得するオーバークエリといった問題に対処できます。

GraphQLは、クライアントが各サービスやデータソースから必要なデータだけを取得できるため、マイクロサービスアーキテクチャに最適です。これにより、現代のビジネス環境で成功するために不可欠な柔軟性と俊敏性が向上します。

GraphQL APIにはセキュリティが不可欠

GraphQL APIは、アクセス性と柔軟性が高い一方で、攻撃対象領域も広く、悪意のある攻撃者に狙われやすくなります。GraphQLは比較的新しい技術ですが、他のAPIアーキテクチャに見られる脆弱性の多くが同様に存在します。既存のインフラストラクチャやツールの一部を活用することで、こうした一般的な脅威からGraphQL APIを保護できます。

チュートリアルの概要

このチュートリアルでは、GraphQL APIを配信し、保護する方法について理解を深めることができます。APIゲートウェイとしてApollo GraphQLサーバーを F5 NGINX Unit上に、F5 NGINX Plusを使用してデプロイする方法を説明します。さらに、高度なセキュリティを実現するために、APIゲートウェイにF5 NGINX App Protect WAFをデプロイし、F5 NGINX Management Suiteを使用してWAFを設定し、潜在的な脅威を監視する方法も紹介します。この構成では、NGINX App Protect WAFを使用してSQLインジェクションなどの攻撃を検出することもできます。

以下の各セクションの手順に従って、チュートリアルを完了してください。

図1:NGINX PlusとNGINX App Protect WAFがGraphQL APIのセキュリティと認証を提供し、NGINX Management Suiteが攻撃を監視し、Apollo GraphQLサーバーがNGINX Unit上で稼働するアーキテクチャ

前提条件

このチュートリアルを始める前に、以下をご用意ください。

NGINX Management Suite Security Monitoringのインストールと設定

NGINX Management Suiteは、複数の高度な機能を統合プラットフォームに集約し、NGINXインスタンスの構成、監視、トラブルシューティングを簡素化します。また、APIの管理とガバナンスを容易にし、アプリケーションの負荷分散を最適化するとともに、組織全体のセキュリティを強化します。

以下の手順に従って、NGINX Management Suiteをインストールし、設定します。

  • 「Virtual Machine or Bare Metal」ページにある「Installation」ページの手順に従ってください。このページには、このチュートリアルで使用する「Security Monitoring」モジュールのほか、必要に応じてインストールできるモジュールが含まれています。
  • ライセンスを追加 (インストールしたモジュールごと)。
  • NGINX Management SuiteホストからNGINX Agentパッケージをインストールし、こちらの手順に従ってNGINX App ProtectインスタンスのSecurity Monitoringを設定します。

NGINX UnitをデプロイしてApollo GraphQL Serverをインストールする

NGINX Unitは、軽量設計の効率的で合理化されたアプリケーションランタイムです。速度や俊敏性を損なうことなく高いパフォーマンスを求める組織に適しています。TLSの処理、リクエストのルーティング、アプリケーションコードの実行が可能なオープンソースサーバーです。NGINX Unitの詳細については、主な機能ページをご覧ください。

このチュートリアルでは、Apollo GraphQLサーバーの構築に必要な幅広い機能を備えたNode.js WebアプリケーションExpressを、NGINX Unit上のフレームワークとして使用します。本稿執筆時点の最新バージョンはApollo Server 4です。

以下の手順に従ってNGINX Unitをデプロイし、Apollo GraphQLサーバーをインストールします。

  1. NGINX Unitをサポート対象のオペレーティングシステムにインストールします。
  2. Follow the GitHubリポジトリの手順に従ってApollo GraphQLサーバーを構築し、Apollo GraphQLのHelloアプリを作成します。

NGINX PlusをAPIゲートウェイとしてデプロイし、NGINX App Protect WAFをインストール

NGINX Plusインスタンスのデプロイに適した環境を選択します。このチュートリアルでは、AWS Ubuntuインスタンスを使用し、NGINX PlusでAPIゲートウェイのリバースプロキシを設定します。次に、セキュリティを強化するため、APIゲートウェイの前段にNGINX App Protect WAFをデプロイします。

以下の手順に従って、NGINX PlusとNGINX App Protect WAFをインストールします。

  1. NGINX Plusをインストールします。サポート対象のオペレーティングシステムに
  2. NGINX JavaScriptモジュールをインストールします (njs)。
  3. Add the load_modulesをnginx.confディレクトリに追加します。
load_module modules/ngx_http_js_module.so;load_module modules/ngx_stream_js_module.so;
  1. サポート対象のオペレーティングシステムにNGINX App Protect WAFをインストールします。
  2. NGINX App Protect WAFモジュールをnginx.conf ファイルのmainコンテキストに追加します:
load_module modules/ngx_http_app_protect_module.so;
  1. Enable NGINX App Protect WAF on an http/server/location context in the nginx.confファイルのhttp/server/locationコンテキストでNGINX App Protect WAFを有効にします:
app_protect_enable on;
  1. /etc/app_protect/confディレクトリにGraphQLポリシー設定を作成します。NGINX App Protect WAFポリシーの作成方法について詳しくは、関連ガイドラインを参照してください。以下にGraphQLポリシー設定の例を示します。
{   "name": "graphql_policy",
      "template": {
          "name": "POLICY_TEMPLATE_NGINX_BASE"
      },
      "applicationLanguage": "utf-8",
      "caseInsensitive": false,
      "enforcementMode": "blocking",
      "blocking-settings": {
          "violations": [
              {
                  "name": "VIOL_GRAPHQL_FORMAT",
                  "alarm": true,
                  "block": false
              },
              {
                  "name": "VIOL_GRAPHQL_MALFORMED",
                  "alarm": true,
                  "block": false
              },
              {
                  "name": "VIOL_GRAPHQL_INTROSPECTION_QUERY",
                  "alarm": true,
                  "block": false
              },
              {
                  "name": "VIOL_GRAPHQL_ERROR_RESPONSE",
                  "alarm": true,
                  "block": false
              }
          ]
      } 
  1. GraphQL設定を適用するには、app_protect_policy_fileフィールドを、nginx.confファイル内のGraphQLポリシー名で更新します。ファイルを更新したら、NGINXをリロードしてGraphQL設定を適用します。以下は、NGINX App Protectポリシーを含むnginx.confファイルの例です。
user nginx;  worker_processes  4;
  load_module modules/ngx_http_js_module.so;
  load_module modules/ngx_stream_js_module.so; 
  load_module modules/ngx_http_app_protect_module.so;
  error_log /var/log/nginx/error.log debug;
  events {
      worker_connections  65536;
  }
http {
      include       /etc/nginx/mime.types;
      default_type  application/octet-stream;
      sendfile        on;
      keepalive_timeout  65;
      server {
          listen       <port>;
          server_name  <name>; 
          app_protect_enable on;
          app_protect_security_log_enable on; # This section enables the logging capability
          app_protect_security_log "/etc/app_protect/conf/log_sm.json" syslog:server=127.0.0.1:514; # This is where the remote logger is defined in terms of: logging options (defined in the referenced file), log server IP, log server port
          app_protect_security_log "/etc/app_protect/conf/log_default.json" /var/log/app_protect/security.log;
          proxy_http_version 1.1;    
          location / {
              client_max_body_size 0;
              default_type text/html;
              proxy_pass http://<ip addr>:<port>$request_uri;#<ip addr> of Nginx unit
          }
          location /graphql {
              client_max_body_size 0;
              default_type text/html;
              app_protect_policy_file "/etc/app_protect/conf/graphql_policy.json";
              proxy_pass http://<ip addr>:<port>$$request_uri; #<ip addr> of Nginx unit
           
          }
      }
  }
  1. 次のコマンドを実行してNGINX Plusを再起動します:

$ nginx -s reload

設定をテストする

次の手順に従って、設定をテストできます。

  1. NGINX Unitサーバーに移動し、次のコマンドを入力してApollo GraphQLアプリケーションを起動します。
$ curl -X PUT --data-binary @demo.json --unix-socket /var/run/control.unit.sock http://localhost/config
  1. 更新が正常に完了すると、リスナーのIPアドレスとポートでアプリを利用できることを確認できます。
{          "success": "Reconfiguration done."
  }
  1. Apollo GraphQLサーバーにアクセスするには、Webブラウザーを開き、サーバーのパブリックIPアドレスを貼り付けます。例:http://3..X.X.X:4003/graphql(この例ではポート4003を使用しています)。
  2. アプリケーションをテストするには、正しいGraphQLクエリを入力して実行します。

図2:Apollo GraphQL UIプレイグラウンド

  1. クエリにSQLインジェクションが入力される状況を考えてみましょう。この場合、NGINX App Protect WAFはApollo GraphQLサーバーを保護し、攻撃の性質を示すサポートIDを生成します。
$ curl -X POST http://3.X.X.X:4003/graphql/ -H "Content-Type:application/json" -d '{"query": "query {hello OR 1=1;} "}'<html><head><title>Request Rejected</title></head><body>The requested URL was rejected. Please consult with your administrator.<br><br>Your support ID is: 7313092578494613509<br><br><ahref='javascript:history.back();'>[GoBack]</a></body><html>
  1. 攻撃の詳細を確認するには、/var/log/app_protect/security.logにあるNGINX Plusインスタンスのログを参照してください。
attack_type="Non-browser Client,Abuse of Functionality,SQL-Injection,Other Application Activity,HTTP Parser Attack",blocking_exception_reason="N/A",date_time="2023-07-05 21:22:38",dest_port="4003",ip_client="99.187.244.63",is_truncated="false",method="POST",policy_name="graphql_policy",protocol="HTTP",request_status="blocked",response_code="0",severity="Critical",sig_cves="N/A,N/A",sig_ids="200002147,200002476",sig_names="SQL-INJ expressions like ""or 1=1"" (3),SQL-INJ expressions like ""or 1=1"" (6) (Parameter)",sig_set_names="{SQL Injection Signatures},{SQL Injection Signatures}",src_port="64257",sub_violations="HTTP protocol compliance failed:Host header contains IP address",support_id="7313092578494613509",
  1. NGINX Management Security Monitoringモジュールでは、インスタンスのデータを監視して潜在的な脅威を確認できるほか、最適な保護を実現するために必要に応じてポリシーを調整できます。

図3:NGINX Management Suite Security Monitoringモジュールの概要図4:Security Monitoringモジュールにおけるセキュリティ違反の包括的な概要

まとめ

このチュートリアルでは、NGINX UnitでApollo GraphQL Serverをセットアップし、APIゲートウェイとしてNGINX Plusをデプロイして、APIゲートウェイの前段に配置したNGINX App Protect WAFでGraphQL APIを保護する方法を学びました。

NGINX Management Suite Security Monitoringを使用して、GraphQL APIが侵害される前に、一般的な高度な脅威を特定してブロックすることもできます。このシンプルなアーキテクチャにより、認証や認可の欠如、インジェクション攻撃、無制限のリソース消費など、特に一般的なAPI脆弱性からGraphQL APIを保護できます。

今すぐNGINXをお試しください。API Connectivity Stackの30日間無料トライアルでは、NGINX Plus、NGINX App Protect、NGINX Management Suiteをご利用いただけます。

関連リソース


共有
タグ: API, F5 NGINX, Tech

著者について

Akash Ananthanarayanan
Akash Ananthanarayananテクニカルマーケティングマネージャー | F5 NGINX

Akash Ananthanarayananのその他のブログ記事

関連するブログ記事

チュートリアル:NGINXを使用してアプリケーション向けにOpenTelemetryを構成する
NGINX | 2024/01/18

チュートリアル:NGINXを使用してアプリケーション向けにOpenTelemetryを構成する

OpenTelemetryを使用してNGINXサーバーの状態と健全性をより明確に把握することで、問題のトラブルシューティングを行い、Webアプリケーションのパフォーマンスを向上できます。

AkitaのNGINX Plus認定モジュールでAPIエンドポイントの問題を特定・修正
NGINX | 2023/05/31

AkitaのNGINX Plus認定モジュールでAPIエンドポイントの問題を特定・修正

Akita SoftwareのAPIオブザーバビリティ向け新しいNGINX Plus Certified Moduleを活用して、APIエンドポイントの問題をより迅速に特定し、修正できます。

JavaプロジェクトをスキャフォールディングしてKubernetesネイティブアプリを構築する方法
NGINX | 2023/02/09

JavaプロジェクトをスキャフォールディングしてKubernetesネイティブアプリを構築する方法

Red HatのシニアプリンシパルデベロッパーアドボケイトであるDaniel Oh氏が、Javaプロジェクトをゼロから構築するためのひな形を作成し、Kubernetesネイティブアプリケーションとしてビルドする方法を解説します。

F5 NGINXaaS for Azureのご紹介:Microsoft Azureでネイティブに利用できるSaaS型ロードバランシング
NGINX | 2022/05/24

F5 NGINXaaS for Azureのご紹介:Microsoft Azureでネイティブに利用できるSaaS型ロードバランシング

NGINXaaS for Azureは、NGINX PlusをAzureネイティブのSaaSとして利用できるサービスです。NGINXの設定を容易にリフト&シフトできるため、クラウド導入とモダンアプリの展開を加速できます。

SELinuxでNGINXおよびNGINX Plusを使用する
NGINX | 2018/08/17

SELinuxでNGINXおよびNGINX Plusを使用する

Red Hat Enterprise Linux(RHEL)および関連ディストリビューションでSecurity-Enhanced Linux(SELinux)を有効にすると、デフォルト設定によりNGINXとNGINX Plusの一部の操作が制限されます。この記事では、すべての機能を利用できるようにSELinuxの設定を変更する方法について説明します。

NGINX PlusによるAWS Auto Scalingグループの負荷分散
NGINX | 2017/03/06

NGINX PlusによるAWS Auto Scalingグループの負荷分散

新しいnginx-asg-sync統合ソフトウェアにより、NGINX PlusはAWS Auto Scalingグループの負荷を直接分散できるため、クラウドでの負荷分散がさらに柔軟になります