ブログ | NGINX

チュートリアル: F5 NGINX で GraphQL API を配信し、保護する

NGINX-F5 水平黒タイプ RGB の一部

開発者は、API を構築するための好ましい方法としてGraphQL を採用する傾向が高まっています。 GraphQL は複数のソースからのデータの取得を簡素化し、データ アクセスと集約を合理化します。 GraphQL を使用する開発者は、単一のエンドポイントから 1 つの POST リクエストで複数のデータ ソースをクエリすることにより、さまざまなソースから必要なデータを正確にリクエストできます。 このアプローチは、 REST APIアーキテクチャで発生する制限を解決するのに役立ちます。REST API アーキテクチャでは、クエリ不足 (必要なデータがすべて欠落しているリクエスト) やクエリ過剰 (複数のエンドポイントにリクエストが送信され、過剰なデータが収集される) などの問題が発生する可能性があります。

GraphQL は、各サービスまたはデータ ソースから必要なデータのみを取得する機能をクライアントに付与するため、マイクロサービス アーキテクチャに最適な選択肢です。 これにより、現代のビジネス環境で成功するために重要な要素である柔軟性と俊敏性が向上します。

GraphQL API にとってセキュリティは重要

アクセスと柔軟性のレベルが高い GraphQL API は、悪意のあるユーザーにとって魅力的な、より広範な攻撃対象領域も提供します。 GraphQL は比較的新しいにもかかわらず、他の API アーキテクチャに見られるのと同じ脆弱性の多くを抱えています。 幸いなことに、既存のインフラストラクチャとツールの一部を活用することで、GraphQL API をこれらの一般的な脅威から保護することができます。

チュートリアルの概要

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

チュートリアルを完了するには、次のセクションの手順に従ってください。

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

前提条件

このチュートリアルを始める前に、次のものが必要です。

NGINX Management Suite セキュリティ監視のインストールと構成

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

NGINX Management Suite をインストールして構成するには、次の手順に従います。

  • インストールページの仮想マシンまたはベア メタルページの指示に従います。 このページには、セキュリティ監視モジュール (このチュートリアルで使用) と、必要に応じてインストールできるその他のモジュールが含まれています。
  • インストールされている各モジュールのライセンスを追加します
  • NGINX Management Suite ホストから NGINX エージェント パッケージをインストールし、ここの手順に従って NGINX App Protect インスタンスのセキュリティ監視を設定します。

NGINXユニットをデプロイし、Apollo GraphQLサーバーをインストールする

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

このチュートリアルでは、Apollo GraphQL サーバーを構築するための広範な機能を提供するNGINX Unit 上の Node.js Web アプリケーション フレームワークとしてExpressを使用します。 この記事の執筆時点での現在のバージョンは Apollo Server 4 です。

NGINX Unit をデプロイし、Apollo GraphQL サーバーをインストールするには、次の手順に従います。

  1. サポートされているオペレーティング システムに NGINX Unit をインストールします。
  2. 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. nginx.confディレクトリにload_modules を追加します。
  4. モジュールをロードします。モジュール/ngx_http_js_module.so; モジュールをロードします。モジュール/ngx_stream_js_module.so;
    
  5. サポートされているオペレーティング システムにNGINX App Protect WAFをインストールします。
  6. NGINX App Protect WAF モジュールをnginx.confファイルのメイン コンテキストに追加します。
  7. モジュールモジュール/ngx_http_app_protect_module.so をロードします。
  8. nginx.confファイルの http/server/location コンテキストで NGINX App Protect WAF を有効にします。
  9. app_protect_enable をオン;
  10. /etc/app_protect/conf ディレクトリに GraphQL ポリシー構成を作成します。 NGINX App Protect WAF ポリシーの作成方法の詳細については、関連するガイドラインを参照してください。

    GraphQL ポリシー構成の例を次に示します。

  11. {   "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",
                    "アラーム": true,
                    "ブロック": false
                },
                {
                    "名前": "VIOL_GRAPHQL_ERROR_RESPONSE",
                    "alarm": true,
                    "block": false
                }
                ]
        } 
  12. GraphQL 設定を適用するには、 nginx.confファイル内のapp_protect_policy_fileフィールドを GraphQL ポリシー名で更新します。 ファイルを更新したら、NGINX のリロードを実行して GraphQL 設定を適用します。

    NGINX App Protect ポリシーを含むnginx.confファイルの例を次に示します。

  13. ユーザー nginx; ワーカープロセス 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 デバッグ;
    イベント {
        ワーカー接続 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; # このセクションではログ機能を有効にします         app_protect_security_log "/etc/app_protect/conf/log_sm.json" syslog:server=127.0.0.1:514; # ここで、リモート ロガーが定義されます: ログ オプション (参照ファイルで定義)、ログ サーバー IP、ログ サーバー ポート         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> の Nginx ユニット         }         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> の Nginx ユニット         
            } } }
  14. 次のコマンドを実行して、NGINX Plus を再起動します。
  15.    

    $ nginx -s リロード
    

構成をテストする

次の手順に従って構成をテストできます。

  1. NGINX Unit サーバーに移動して次のコマンドを入力し、Apollo GraphQL アプリケーションを起動します。
  2. $ curl -X PUT --data-binary @demo.json --unix-socket /var/run/control.unit.sock http://localhost/config
  3. 更新が成功すると、リスナーの IP アドレスとポートでアプリが利用可能になっていることがわかります。
  4. {          "成功": 「再構成が完了しました。」
    }
  5. Apollo GraphQL サーバーにアクセスするには、Web ブラウザーを開いて、サーバーのパブリック IP アドレスを貼り付けます。 たとえば、 http://3.. X . X . X :4003/graphql (この例ではポート 4003 を使用します)。
  6. アプリケーションをテストするには、正しい GraphQL クエリを入力してクエリを実行します。
  7. Apollo GraphQL UI プレイグラウンドのスクリーンショット
    図2: Apollo GraphQL UI プレイグラウンド
  8. 個人がクエリに SQL インジェクションを入力する状況を考えてみましょう。 この場合、NGINX App Protect WAF は Apollo GraphQL サーバーを保護し、攻撃の性質を説明するサポート ID を生成します。
  9. $ 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>リクエストが拒否されました</title></head><body>要求された URL は拒否されました。 管理者にご相談ください。<br><br>サポート ID は次のとおりです: 7313092578494613509<br><br><ahref='javascript:history.back();'>[戻る]</a></body><html>
  10. 攻撃の詳細を確認するには、/var/log/app_protect/security.log にある NGINX Plus インスタンスのログを参照してください。
  11. attack_type="非ブラウザ クライアント、機能の悪用、SQL インジェクション、その他のアプリケーション アクティビティ、HTTP パーサー攻撃",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 式 ("or 1=1" など)" (3),SQL-INJ 式 ("or 1=1" など)" (6) (パラメータ)",sig_set_names="{SQL インジェクション シグネチャ},{SQL インジェクション シグネチャ}",src_port="64257",sub_violations="HTTP プロトコル準拠に失敗しました: ホスト ヘッダーに IP アドレスが含まれています", support_id="7313092578494613509 ",
  12. NGINX 管理セキュリティ監視モジュールでは、インスタンスのデータを監視して潜在的な脅威を確認できるほか、最適な保護のために必要に応じてポリシーを調整することもできます。
  13. NGINX Management Suite セキュリティ監視モジュールの概要のスクリーンショット
    図3: NGINX Management Suite セキュリティ監視モジュールの概要
    セキュリティ監視モジュールにおけるセキュリティ違反の包括的な概要のスクリーンショット
    図4: セキュリティ監視モジュールにおけるセキュリティ違反の包括的な概要

結論

このチュートリアルでは、NGINX Unit に Apollo GraphQL サーバーを設定し、NGINX Plus を API ゲートウェイとしてデプロイし、API ゲートウェイの前にある NGINX App Protect WAF を使用して GraphQL API を保護する方法を学習しました。

また、NGINX Management Suite セキュリティ モニタリングを使用して、GraphQL API が侵害される前に一般的な高度な脅威を識別してブロックすることもできます。 このシンプルなアーキテクチャは、認証と承認の欠如、インジェクション攻撃、無制限のリソース消費など、最も一般的な API の脆弱性から GraphQL API を保護します。

NGINX Plus、NGINX App Protect、NGINX Management Suite を含むAPI Connectivity Stack の 30 日間無料トライアルで、今すぐ NGINX を試してみてください。

追加リソース


「このブログ投稿には、入手できなくなった製品やサポートされなくなった製品が参照されている場合があります。 利用可能な F5 NGINX 製品およびソリューションに関する最新情報については、 NGINX 製品ファミリーをご覧ください。 NGINX は現在 F5 の一部です。 以前の NGINX.com リンクはすべて、F5.com の同様の NGINX コンテンツにリダイレクトされます。"