GraphQLの入門情報とセキュリティ観点で気をつけたいこと

Nov 28, 2021 10:20 · 2490 words · 5 minute read GraphQL

GraphQLに入門しました。

参考になった情報や、手を動かして試してみたいときの検証環境について、自分が入門するときに欲しかった情報をまとめておきます。

目次

GraphQLとは

Facebookが開発したデータクエリ言語です。
REST APIの代わりとして使うことができ、「複数クライアント対応」など複雑になりがちな状況に柔軟に対応することができます。

APIを提供するサーバ側だけでなく、クライアント側からみてもメリットがあります。
クエリを操作することで柔軟なデータ取得が可能になるので、これまで複数回REST APIにアクセスしないと得られなかった情報を1回のリクエストで取得することができます。

GraphQLで提供されているデータの操作方法は、下記の3種類です。

  • データを取得する「Query」
  • データの操作(作成・変更・削除)をする「Mutation」
  • データを購読する「Subscription」

GraphQLを使うことで得られるメリットや活用方法については下記の動画がおすすめです。

  • REST APIを運用する多くの企業が直面する問題
  • なぜGraphQLが誕生したのか

といった背景情報も含まれており、とてもわかりやすい内容でした。

GraphQLの実装例

GraphQLが誕生した背景や、どのようなメリットがあるのかがわかりました。
次は実装方法を見てみましょう。
今回はPythonのWebフレームワークである「FastAPI」を使った事例です。

FastAPIについてはこちら
PythonのFastAPIチュートリアルをやってみた · kapieciiのブログ

下記の2記事では、「FastAPI + GraphQLで実装する方法」が詳しく記載されています。
本当は自分で手を動かしてみるのが一番ですが、時間がない方は記事を読むだけでも実装の全体像が把握できるのではないでしょうか。

GraphQLとセキュリティ

便利なGraphQLではありますが、使う上で気をつけなければならない点もあります。

GraphQLのセキュリティテストに関する情報を調べたところ、テスト観点として下記のような内容が挙がっていました。
裏を返すと、これらの点に注意して実装&本番公開する必要があります。

※「下記の内容に対応しておけば完璧!」というわけではないですし、今後新たに注意すべき点が見つかる可能性もあります。 参考情報としてお使いください。

GraphiQLを公開しない

GraphQLでは、Graph"i"QLというIDEがよく使われています。
GraphiQLは開発者にとって便利なツールだと思うのですが、悪い人にとっても便利なツールです。

参考情報

How to exploit GraphQL endpoint: introspection, query, mutations & tools - Global Bug Bounty Platform (yeswehack.com)

Introspectionを無効にする

Introspectionを使うことで、データの型、使えるクエリなどの情報を取得することができます。
これらの情報は悪い人からすると、とても有益な情報です。

参考情報

How to exploit GraphQL endpoint: introspection, query, mutations & tools - Global Bug Bounty Platform (yeswehack.com)

入力値チェックとデータのアクセス制御

GraphQL自体に「入力値のチェック機能」や「データのアクセス制御機能」はありません。
REST APIの場合と同様に、「入力値の検証(可能ならホワイトリストで)」と、「ユーザがデータにアクセスする権限があるのかチェック」する必要があります。

参考情報

righettod/poc-graphql: Research on GraphQL from an AppSec point of view. (github.com)

クエリの深さを制限する

ネストの深いクエリを使うことで負荷をかけることができます。
実行可能なクエリの深さを制限すると良いでしょう。

参考情報

righettod/poc-graphql: Research on GraphQL from an AppSec point of view. (github.com)

バッチ処理を制限する

GraphQLのQueryでは、複数の問い合わせを同時に実行することができます。
そのため、ネット上に公開されている「どこかから漏洩したユーザIDとパスワードのリスト」を効率よく総当りで試すことができてしまいます。

また、バッチ処理機能を使って一括で複数のログイン試行をすることで、アクセス監視による攻撃の検知を回避されてしまうかもしれません。

参考情報

👉GraphQL Batching Attack (wallarm.com)

GraphQLを気軽に試せる環境

「ちょっと触ってみたいけど、サッと試せる環境は無いだろうか?」と思った場合は、こちらの環境が使えます。

あえて脆弱性を作り込んである環境なので、操作感と合わせて「脆弱性があるとどのようなことができるのか?」も体験することができます。

righettod/poc-graphql

righettod/poc-graphql: Research on GraphQL from an AppSec point of view. (github.com)

DockerでサッとGraphiQL環境を作ることができます。

READMEに詳しく解説が書かれています。
READMEに沿ってGraphiQLを操作することで、GraphQLを使った実装で発生する問題を体験することができます。

david3107/graphql-security-labs

david3107/graphql-security-labs: GraphQL security workshop labs (github.com)

もっとセキュリティテストに寄ったコンテンツだとこちら。
ブログを模したWebアプリをDocker環境で起動することができます。

動画による解説もあるので、セキュリティテストを実施する人がどのような操作をしているのかわかりやすいです。


ただし、この環境は2021年11月現在「docker build」でエラーが発生します。
エラーを修正してPull Requestをだしているので、Mergeされるまではこちらの「update-dockerfiles」branchを使ってもらうのがいいと思います。

kapiecii/graphql-security-labs at update-dockerfiles (github.com)

最後に

GraphQLの入門時に、自分が参考になったと思った情報をまとめてみました。

私も触り始めたばかりなので何も偉そうなことは言えませんが、「これからGraphQLを触ってみようかな」という方の参考になれば嬉しいです。

tweet Share