GraphQL セキュリティ

Version: 20.x
日本語翻訳に関する免責事項

このページの翻訳はAIによって自動的に行われました。可能な限り正確な翻訳を心掛けていますが、原文と異なる表現や解釈が含まれる場合があります。正確で公式な情報については、必ず英語の原文をご参照ください。

GraphQL API に特有のセキュリティの問題について対処する必要があります。GraphQL サーバーの実行コストが非常に高いクエリを作成して、サービス拒否攻撃を実行される可能性があります。この問題への対処方法は 2 つあります。

  • クエリの複雑性分析を使用して、大量のデータを要求するクエリを拒否する。

  • クエリ深度分析を使用して、深くネストされたクエリを拒否する。

これらの緩和策は、任意のクエリが実行されるパブリック API に適しています。自分が管理するクエリのみをサポートしている API の場合、ホワイトリストに登録することで問題を完全に緩和することができます。

注記

複雑性の既定の設定は、/App_Config/Sitecore/Services.GraphQL/Sitecore.Services.GraphQL.config で指定します。

キャッシングとホワイトリスト

GraphQL API は Sitecore キャッシュ インスタンスを使用して、事前に解析および検証された着信クエリを格納します。検証後はクエリをもう一度検証する必要がなくなり、キャッシュから取得されます。既定のキャッシュ サイズは 10 MB で、エンドポイントごとにサイズを設定できます。

既定のキャッシュ メカニズムにより、Apollo で開発された自動永続クエリ (APQ) プロトコルのサポートも有効になります。APQ クライアントは、実行したいクエリのハッシュを送信します。クエリがキャッシュされている場合、完全なクエリ コンテンツを送信するのではなく、ハッシュを介して実行されます。クエリがキャッシュにない場合、特定のエラー応答が送信され、クライアントはクエリ テキストを使用して要求を再発行します。これにより、サーバーは将来の再利用のためにそれをキャッシュできます。この手法により、最低限の労力で着信帯域幅を大幅に削減できます。

キャッシュ メカニズムは、クエリ ホワイトリストを使用する方法も提供します。ホワイトリストは、クエリ全体を送信する必要がなく、クエリへのポインタ/ハッシュのみを送信する必要があるため、API のサービス拒否攻撃に対する保護と、帯域幅の使用量の削減 (APQ とまったく同じ) の両方を提供できます。GraphQL API は、信頼できるキャッシュの概念をサポートします。許可されるクエリは、キャッシュ内のクエリのみです。WhitelistingGraphQLQueryCache クラスは、次の機能を備えた既定のホワイトリスト実装を提供します。

  • 許可されたクエリをファイルとしてディスクのフォルダーに保存します (ソース管理のコミットを簡単にレビューできます)。

  • .graphql ファイルを使用してアプリにクエリを保存し、ファイルごとに 1 つの GQL 操作を格納している場合、これらのファイルをホワイトリストにコピーすることができます。

  • 受信したクエリがホワイトリスト ファイルに追加される学習モードをサポートします。これは、ビルド時にアプリケーション内のすべてのクエリを実行するエンドツーエンドのテストがある場合に適しています。学習モードは、本番環境では無効になっています。

  • 格納されたクエリに APQ 互換のハッシュを使用します。これにより、APQ クライアントは自動部分なしですべての APQ 機能に接続して取得できます (実行したクエリがホワイトリストに含まれている必要があります)。

  • ホワイトリストが変更されたときに、ホワイトリストをもう一度読み込みます。

キャッシュ設定は、エンドポイントの設定ファイルに登録されます。カスタム キャッシュの実装は、IGraphQLQueryCacheFactory から継承する必要があります。次の例は、ホワイトリストにキャッシュを登録する方法を示しています。

RequestResponse
<cache type="Sitecore.Services.GraphQL.Hosting.QueryTransformation.Caching.WhitelistingGraphQLQueryCache, Sitecore.Services.GraphQL.NetFxHost">    
    <!-- path can be virtual (/... or ~/...) or physical (c:\...) -->    
    <param desc="path">~/App_Data/GraphQL/myendpoint-whitelist</param>
    <param desc="hashFactory">        
        <hashFactory type="Sitecore.Services.GraphQL.Hosting.Hashing.Sha256DocumentHashFactory, Sitecore.Services.GraphQL.NetFxHost"/>    
    </param>    
    <!-- learning allows the whitelist to add incoming queries; then disable this in production -->    
    <learningEnabled>true</learningEnabled>
</cache>

承認

GraphQL 承認は、ビジネス ロジック/スキーマ レベルで実行します、各リゾルバー関数は、特定のグラフ ノードに必要な承認を確認する必要があります。

API 全体にカスタム承認が必要な場合は、<security> セクションの下に各 API 要求を承認するための IAuthorizationFilter ベースのクラスを次のように登録することができます。

RequestResponse
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/" xmlns:role="http://www.sitecore.net/xmlconfig/role/">
    <sitecore>
        <api>
            <GraphQL>
                <endpoints>
                    <master>
                        <security>
                          <authorization type="My.Type.Derived.From.IAuthorizationFilter, My.Assembly" />
                        </security>
                    </master>
                </endpoints>
            </GraphQL>
        </api>
    </sitecore>
</configuration>

何かフィードバックはありますか?

この記事を改善するための提案がある場合は、