14 セキュリティに関する考慮事項 - HiroyukiMakita/mcp-server-tutorial GitHub Wiki
14. セキュリティに関する考慮事項
MCPサーバー、特に外部APIと連携したり、ローカルシステムのリソースにアクセスしたりする機能を持つ場合、セキュリティは非常に重要な考慮事項となります。 このセクションでは、開発中に意識すべき主要なセキュリティポイントについて説明します。
1. APIキーや機密情報の管理
絶対にやってはいけないこと: APIキーやパスワード、アクセストークンなどの機密情報をソースコードに直接ハードコーディングしないでください。
- 理由: ソースコードがバージョン管理システム(Gitなど)で管理されている場合、ハードコーディングされた機密情報はリポジトリの履歴に残り、意図せず公開されてしまう危険性があります。公開リポジトリの場合は特に致命的です。
推奨される対策:
- 環境変数を利用する:
- 今回のチュートリアルで実装したように、APIキーは環境変数 (
process.env.YOUR_API_KEY
) 経由でMCPサーバーに渡すようにします。 mcp_settings.json
のenv
プロパティで設定する方法は、ローカルでの開発や実行には便利ですが、この設定ファイル自体の管理にも注意が必要です(特に共有PCなどの場合)。
- 今回のチュートリアルで実装したように、APIキーは環境変数 (
.env
ファイルと.gitignore
:- 開発時には、プロジェクトのルートディレクトリに
.env
ファイルを作成し、そこにAPI_KEY=your_actual_key
のように記述し、dotenv
ライブラリなどを使って読み込む方法も一般的です。 - その際、
.env
ファイルは必ず.gitignore
に追加し、リポジトリにコミットされないようにします。
- 開発時には、プロジェクトのルートディレクトリに
- サーバーサイドでの機密情報管理サービス:
- 本番環境でより高度なセキュリティが求められる場合は、HashiCorp Vault、AWS Secrets Manager、Google Cloud Secret Managerなどの専用のシークレット管理サービスを利用することを検討します。
2. 入力値のバリデーションとサニタイズ
MCPツールが外部(クライアント)から入力値を受け取る場合、その値が想定された形式・範囲であることを必ず検証(バリデーション)し、必要に応じて無害化(サニタイズ)する必要があります。
- バリデーション:
- 今回のチュートリアルでは
zod
を使用して入力スキーマを定義し、MCP SDK が自動的にバリデーションを行っています。これは非常に良い実践です。 - 型(文字列、数値、真偽値など)、必須項目、最小値・最大値、パターン(正規表現)、文字数制限などを厳密に定義しましょう。
- 今回のチュートリアルでは
- サニタイズ:
- 特に、受け取った入力値を元にファイルパスを生成したり、OSコマンドを実行したり、データベースクエリを組み立てたりする場合には、サニタイズが不可欠です。
- 例:
- ファイルパス操作:
../
のようなディレクトリトラバーサル攻撃を防ぐ。 - OSコマンドインジェクション: シェルメタ文字をエスケープするか、コマンドと引数を明確に分離する。
- SQLインジェクション: プレースホルダやパラメータ化クエリを使用する。
- XSS (クロスサイトスクリプティング): HTMLとして出力する可能性のある文字列はHTMLエンティティにエスケープする。
- ファイルパス操作:
- 今回の天気情報サーバーでは、都市名という比較的単純な文字列を扱っていますが、もしこれをファイル名の一部に使うような場合は注意が必要です。
3. 依存ライブラリの脆弱性管理
現代のソフトウェア開発では多くの外部ライブラリ(npmパッケージなど)に依存しています。これらのライブラリに脆弱性が発見されることもあります。
- 定期的なアップデート:
npm outdated
やyarn outdated
コマンドで、利用しているライブラリに新しいバージョンがないか確認し、定期的にアップデートしましょう。- メジャーバージョンのアップデートは破壊的変更を含む可能性があるので、変更履歴を確認し、テストを十分に行います。
- 脆弱性スキャン:
npm audit
やyarn audit
コマンドを実行すると、プロジェクトが依存しているライブラリに既知の脆弱性がないかスキャンし、報告してくれます。- GitHubリポジトリでは、Dependabot alerts などの機能で自動的に脆弱性を通知してくれる設定も可能です。
- 発見された脆弱性には、可能な限り迅速に対応(パッチ適用、ライブラリアップデート、代替ライブラリへの移行など)します。
4. 最小権限の原則
MCPサーバーを実行するプロセスや、サーバーがアクセスするリソース(APIキーに紐づく権限など)は、そのサーバーが必要とする最小限の権限のみを持つべきです。
- 例: OpenWeatherMap APIキーが、天気情報取得以外の権限(アカウント情報の変更など)を持たないようにします(通常、APIキーは特定のスコープに限定されています)。
- サーバーがローカルファイルシステムにアクセスする場合、読み取り専用で十分な場合は書き込み権限を与えない、特定のディレクトリ以外にはアクセスできないようにする、などの制限を検討します。
5. エラーメッセージの内容
エラー発生時にクライアントに返すメッセージには、デバッグに有用な情報を含めつつも、システムの内部構造や機密情報(フルパス、SQLクエリなど)を過度に漏らさないように注意します。
- サーバー側のログには詳細なエラー情報を記録し、クライアントにはより一般的なエラーメッセージ(例: 「処理中にエラーが発生しました。しばらくしてからもう一度お試しください。」)を返す、という使い分けも有効です。
6. HTTPSの利用 (リモートサーバーの場合)
今回のチュートリアルではローカルStdioサーバーを扱っていますが、もしMCPサーバーをリモートでホストし、HTTP(S) SSE で通信する場合は、必ずHTTPSを使用して通信を暗号化してください。
セキュリティは継続的な取り組みです。常に最新の情報を収集し、ベストプラクティスに従って対策を講じることが重要です。