開発者は、API を構築するための好ましい方法としてGraphQL を採用する傾向が高まっています。 GraphQL は複数のソースからのデータの取得を簡素化し、データ アクセスと集約を合理化します。 GraphQL を使用する開発者は、単一のエンドポイントから 1 つの POST リクエストで複数のデータ ソースをクエリすることにより、さまざまなソースから必要なデータを正確にリクエストできます。 このアプローチは、 REST APIアーキテクチャで発生する制限を解決するのに役立ちます。REST API アーキテクチャでは、クエリ不足 (必要なデータがすべて欠落しているリクエスト) やクエリ過剰 (複数のエンドポイントにリクエストが送信され、過剰なデータが収集される) などの問題が発生する可能性があります。
GraphQL は、各サービスまたはデータ ソースから必要なデータのみを取得する機能をクライアントに付与するため、マイクロサービス アーキテクチャに最適な選択肢です。 これにより、現代のビジネス環境で成功するために重要な要素である柔軟性と俊敏性が向上します。
アクセスと柔軟性のレベルが高い GraphQL API は、悪意のあるユーザーにとって魅力的な、より広範な攻撃対象領域も提供します。 GraphQL は比較的新しいにもかかわらず、他の API アーキテクチャに見られるのと同じ脆弱性の多くを抱えています。 幸いなことに、既存のインフラストラクチャとツールの一部を活用することで、GraphQL API をこれらの一般的な脅威から保護することができます。
このチュートリアルは、GraphQL API を配信および保護する方法を理解するのに役立ちます。 F5 NGINX Plusを API ゲートウェイとして使用し、 F5 NGINX UnitにApollo GraphQLサーバーをデプロイする方法を説明します。 さらに、高度なセキュリティを実現するために API ゲートウェイにF5 NGINX App Protect WAF を導入し、 F5 NGINX Management Suite を使用して WAF を構成し、潜在的な脅威を監視する方法も説明します。 この設定により、NGINX App Protect WAF を使用して SQL インジェクションなどの攻撃を検出することもできます。
チュートリアルを完了するには、次のセクションの手順に従ってください。
このチュートリアルを始める前に、次のものが必要です。
NGINX Management Suite は、いくつかの高度な機能を統合プラットフォームに統合し、NGINX インスタンスの構成、監視、トラブルシューティングのプロセスを簡素化します。 また、API の管理とガバナンスを容易にし、アプリケーションの負荷分散を最適化し、組織の全体的なセキュリティを強化します。
NGINX Management Suite をインストールして構成するには、次の手順に従います。
NGINX Unit は、軽量設計の効率的で合理化されたランタイム アプリケーションであり、速度や俊敏性を損なうことなく高いパフォーマンスを求める組織にとって理想的な選択肢です。 これは、TLS を処理し、ルーティングを要求し、アプリケーション コードを実行できるオープン ソース サーバーです。 NGINX Unit の詳細については、 「主な機能」ページをご覧ください。
このチュートリアルでは、Apollo GraphQL サーバーを構築するための広範な機能を提供するNGINX Unit 上の Node.js Web アプリケーション フレームワークとしてExpressを使用します。 この記事の執筆時点での現在のバージョンは Apollo Server 4 です。
NGINX Unit をデプロイし、Apollo GraphQL サーバーをインストールするには、次の手順に従います。
NGINX Plus インスタンスをデプロイするには適切な環境を選択します。 このチュートリアルでは、AWS Ubuntu インスタンスを使用し、NGINX Plus を使用して API ゲートウェイ リバース プロキシを設定します。 次に、セキュリティを強化するために、API ゲートウェイの前に NGINX App Protect WAF をデプロイします。
NGINX Plus と NGINX App Protect WAF をインストールするには、次の手順に従ってください。
load_modules を
追加します。 モジュールをロードします。モジュール/ngx_http_js_module.so; モジュールをロードします。モジュール/ngx_stream_js_module.so;
モジュールモジュール/ngx_http_app_protect_module.so をロードします。
app_protect_enable をオン;
/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",
"アラーム": true,
"ブロック": false
},
{
"名前": "VIOL_GRAPHQL_ERROR_RESPONSE",
"alarm": true,
"block": false
}
]
}
GraphQL 設定を適用するには、 nginx.confファイル内のapp_protect_policy_file
フィールドを GraphQL ポリシー名で更新します。 ファイルを更新したら、NGINX のリロードを実行して GraphQL 設定を適用します。
NGINX App Protect ポリシーを含むnginx.confファイルの例を次に示します。
ユーザー 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 ユニット
} } }
$ nginx -s リロード
次の手順に従って構成をテストできます。
$ curl -X PUT --data-binary @demo.json --unix-socket /var/run/control.unit.sock http://localhost/config
{ "成功": 「再構成が完了しました。」
}
$ 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>
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 ",
このチュートリアルでは、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 コンテンツにリダイレクトされます。"