こんにちは!セキュリティの世界へようこそ。私は普段、企業のシステムの守りを固める仕事をしていますが、今日は皆さんと一緒に「GraphQLの守り方」について、少しだけ掘り下げていきたいと思います。
「GraphQL」と聞くと、「APIを便利にする最新技術でしょ?」と思うかもしれません。確かにその通りです。でも、その便利さが時には「泥棒に家の間取り図を渡してしまう」ようなリスクを孕んでいることを知っていましたか?
今日は、新人エンジニアの方でも明日から実践できる「GraphQLの守り方」を、家の防犯に例えて解説しますね。
—
1. 「Introspection」は家の中を案内するルームツアー?
GraphQLには「Introspection(イントロスペクション)」という、とても親切な機能があります。これは、APIに「今どんなデータが取れるの?」と聞くと、その構造(スキーマ)を丁寧に教えてくれる機能です。
開発中、これは最高に便利です。でも、これを本番環境で「誰でも見られる状態」にしておくのは、泥棒に「この家の金庫はどこにありますか?」「窓の鍵はどこについていますか?」と質問させて、丁寧に答えてあげているのと同じなんです。
この情報を手に入れた攻撃者は、あなたのシステムがどんなデータを持っていて、どこが弱そうかを一瞬で把握してしまいます。これが、XSS(クロスサイトスクリプティング)などの攻撃を仕掛けるための「準備運動」になってしまうんですね。
—
2. なぜ「無効化」が必要なのか
攻撃者は、あなたのアプリケーションの「裏側の顔(スキーマ情報)」が見えると、攻撃の精度が格段に上がります。
例えば、ユーザーの個人情報を取得するクエリ(命令)がどこにあるか分かれば、そこを重点的に狙います。もし、Introspectionを無効にしていれば、攻撃者は「見えない壁」にぶつかることになります。彼らは手探りで攻撃を試すしかなくなり、その間にあなたの監視システムが「おかしな動きがあるぞ!」と気づく時間を稼ぐことができるのです。
—
3. 実践!本番環境で「Introspection」を無効化する
では、具体的にどうすればいいのでしょうか? 多くのライブラリでは、設定一つでこれを封じ込めることができます。
例:Apollo Server (Node.js) の場合
一番普及しているフレームワークの一つです。設定は驚くほどシンプルですよ。
const { ApolloServer } = require(‘apollo-server’);
const server = new ApolloServer({
typeDefs,
resolvers,
// ここが重要!本番環境では必ず false に設定します
// 環境変数(process.env.NODE_ENV)を使って制御するのが定石です
introspection: process.env.NODE_ENV !== ‘production’,
// Playground(ブラウザで試せる画面)も本番では閉じておきましょう
playground: process.env.NODE_ENV !== ‘production’,
});
このように、「開発環境ではOKだけど、外の世界(本番環境)では扉を閉める」というルールをコードに落とし込むのが、セキュリティの基本中の基本です。
—
4. 忘れてはいけない「認可(Authorization)」の壁
Introspectionをオフにするのは「家の外から中を見えなくする」ことですが、それだけでは不十分です。家の中に入った泥棒が、勝手にクローゼットを開けないようにする必要がありますよね。これが「認可」です。
GraphQLは、リクエストが一つであっても、その裏で複数の関数が動いています。それぞれの関数で「このデータを見ていい人?」というチェックを入れましょう。
// データの取得時に必ずチェックを挟む
const resolvers = {
Query: {
userProfile: (parent, args, context) => {
// ユーザーがログインしているか確認
if (!context.user) throw new Error(“認証してください”);
// 自分のデータ以外をリクエストしていないか確認
if (context.user.id !== args.id) throw new Error(“許可されていません”);
return fetchUserFromDb(args.id);
},
},
};
「認証(誰であるか)」と「認可(何ができるか)」。この二重のガードがあるだけで、セキュリティレベルは飛躍的に向上します。
—
5. まとめ:一歩ずつ、安全な家を作ろう
セキュリティ対策は、一度で完璧にしようとすると疲れてしまいます。でも、今日お話しした2つのポイントを意識するだけで、あなたのAPIは格段に強くなります。
1. Introspectionを無効化して、間取り図を隠す。
2. リクエストのたびに「お前は誰だ? 何をしていい?」と確認する(認可)。
これらは、物理的な鍵をかけることと同じくらい当たり前の、けれど非常に大切な習慣です。
最初は難しく感じるかもしれませんが、まずは「本番環境の設定ファイルを確認する」ことから始めてみませんか?皆さんが作ったシステムが、堅牢で、誰からも愛される安全なサービスになることを応援しています。
また何か疑問があれば、いつでも相談してくださいね。一歩ずつ、一緒に強くなっていきましょう!
コメント