APIペネトレーションテストの概要
APIのセキュリティを確保するためには、実装後のテストが不可欠です。ペネトレーションテスト(ペンテスト)は実際の攻撃者の視点でAPIの脆弱性を発見するプロセスです。OWASP ZAP・Burp Suiteなどのツールと手動テストを組み合わせて包括的な評価を行います。
テストの準備
- スコープ定義:テスト対象のAPIエンドポイント・環境を明確にする
- 許可の取得:APIオーナーから書面での許可を得る
- API仕様書の取得:OpenAPI/Swagger仕様書を入手する
- テストアカウントの用意:複数の権限レベルのテストアカウントを準備
OWASP ZAPを使った自動スキャン
# OWASP ZAPのAPIスキャン(Dockerで実行)
docker run -v $(pwd):/zap/wrk/:rw -t ghcr.io/zaproxy/zaproxy:stable zap-api-scan.py -t http://staging-api.example.com/api/v1/openapi.json -f openapi -r api-scan-report.html -J api-scan-report.json
Burp Suiteを使った手動テスト
Burp SuiteのProxy機能でAPIトラフィックをインターセプトし、リクエストを改ざんして脆弱性を確認します。
BOLAテスト(他ユーザーのリソースアクセス)
# 自分のIDで正常にアクセス
GET /api/orders/order-123
Authorization: Bearer USER_A_TOKEN
# 他のユーザーのIDを指定(BOLAの確認)
GET /api/orders/order-456 // order-456はユーザーBのもの
Authorization: Bearer USER_A_TOKEN
# 200が返ってきたらBOLAの脆弱性あり → 404が正しい
認可バイパスのテスト
# 管理者専用エンドポイントを一般ユーザーで呼ぶ
GET /api/admin/users
Authorization: Bearer REGULAR_USER_TOKEN
# 200が返ってきたら認可の不備あり → 403が正しい
# JWTの改ざんテスト(alg: noneに変更)
# 署名検証が適切に実装されているか確認
主要なテスト項目チェックリスト
- ☐ 全エンドポイントで認証なし/無効トークンで401が返るか
- ☐ 他ユーザーのリソースにアクセスできないか(BOLA)
- ☐ 権限のない操作が403になるか(Broken Function Level Authorization)
- ☐ SQLインジェクション・NoSQLインジェクションが防止されているか
- ☐ レート制限が機能しているか(ブルートフォース対策)
- ☐ エラーメッセージにスタックトレースが含まれていないか
- ☐ 更新APIでMass Assignmentが防止されているか
- ☐ SSRFが防止されているか
- ☐ ファイルアップロードAPIに型・サイズ制限があるか
CI/CDへのセキュリティテストの組み込み
# GitHub ActionsにOWASP ZAPスキャンを組み込む
- name: OWASP ZAP API Scan
uses: zaproxy/action-api-scan@v0.9.0
with:
target: 'http://staging-api.example.com/api/v1/openapi.json'
format: openapi
fail_action: true # 高重大度の脆弱性が見つかったらCI失敗
まとめ
APIのペネトレーションテストは定期的に実施することが重要です。OWASP ZAPによる自動スキャンをCI/CDに組み込み、リリースのたびに基本的な脆弱性チェックを行いましょう。年に1〜2回は外部の専門家によるペンテストを実施してより深い評価を行うことを推奨します。