Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Postman と API セキュリティ / Postman and API Security

Postman と API セキュリティ / Postman and API Security

Presentation slides: 脅威と向き合うWeb APIセキュリティの重要ポイント ~徳丸さんと学ぶセキュア開発の最前線~
Session title: Postman と API Security
Session Description:
Web APIのセキュリティを考えるとき、APIの安全をどのようなテストでカバーするか、いかに継続的にAPIを安全を保ちつつ管理していくかを考えることが重要です。APIクライアントとしてちょっとしたレスポンス確認に利用されることが多いPostmanですが、APIセキュリティにも役立つPostmanが備える認証・認可サポート、柔軟なテストのしくみ、機密情報を安全に扱えるPostman Vaultといった数々の機能と利用シーンをご紹介します。

Yoichi Kawasaki

December 12, 2024
Tweet

More Decks by Yoichi Kawasaki

Other Decks in Technology

Transcript

  1. アジェンダ • API 開発で気を付けるポイント • Postman の機能 ◦ 認証・認可設定のハードルを下げるしくみ ◦

    柔軟なテストのしくみ ◦ 継続的に API を安全に保つ ◦ 機密情報を安全に扱う機能 ◦ 一貫性のあるルールを適用 @postman_japan
  2. Web APIテストで確認すること APIテストは、インターフェースの品質、信頼性、セキュリティを確保するために行います 機能要件 • APIコントラクトテスト: APIがコントラクト通り の仕様で実装されているか • 機能テスト:

    APIが期待通りの振る舞いであ るかどうか 非機能要件 • セキュリティテスト: APIを通じたやりとりが セキュアか • パフォーマンステスト: APIのパフォーマンス に問題がないか @postman_japan
  3. 認可は開発者が意識してテストしないと難しい 認可の不備によるリスクは非常に大きく OWASP API Security Top 10 2023でも次のような認可の不備を取 り上げています @postman_japan

    リソースごとの認可 • API12023  Broken Object Level Authorization (オブジェクトレベルの認可の不備 ) • API32023  Broken Object Property Level Authorization (オブジェクトプロパティトレベルの認可の不備 ) 機能ごとの認可 • API52023  Broken Function Level Authorization (機能レベルの認可の不備 ) オブジェクトレベルの認可の不備 BOLAのイメージ 機能レベルの認可の不備 BFLAのイメージ
  4. 柔軟なテストのしくみ テストスクリプト • 各APIリクエストにスクリプト( JavaScript)の記述ができる • リクエスト送信前 (pre-request) とレスポンス受信後(post-response)のフェーズで実行可能 •

    各リクエストには複数のテストを登録でき、それぞれに「合格」「失敗」の結果が出る • Mochaベースのテストフレームワークで、 AssertionライブラリとしてChai.js利用可能 • ローコード支援機能としてコードスニペットや AIアシスタント Postbot)の利用が可能 @postman_japan スクリプト 実行フェーズ テスト結果
  5. 柔軟なテストのしくみ テストスクリプト @postman_japan // ステータスコードが 200であることを確認 pm.test("Status code is 200",

    function () { pm.response.to.have.status(200); }); // レスポンスが JSONであることを確認 pm.test("Response is in JSON format", function () { pm.response.to.be.json; }); // レスポンスのボディが期待通りの構造と値を持っていることを確認 pm.test("Response has expected contract", function () { const jsonData = pm.response.json(); // idフィールドが数値で値が 1であることを確認 pm.expect(jsonData).to.have.property("id", 1); pm.expect(jsonData.id).to.be.a("number"); // nameフィールドが文字列で "Taro"であることを確認 pm.expect(jsonData).to.have.property("name", "Taro"); pm.expect(jsonData.name).to.be.a("string"); // emailフィールドが文字列で "[email protected]"であることを確認 pm.expect(jsonData).to.have.property("email", "[email protected]"); pm.expect(jsonData.email).to.be.a("string"); }); コントラクトテスト 認可テスト(ユーザーの権限確認) // 不正なトークンを設定 // ヘッダー Authorization: 'Bearer invalidToken' pm.test("Forbidden Check: Should return 403", function () {  // 403 Forbidden エラーチェック pm.expect(response.code).to.eql(403); }); 認証テスト(ユーザーの確認) // 認証が必要なエンドポイントに対して認証トークンなしで送信 pm.test("Unauthorized Check: Should return 401", function () { // 401 Unauthorized エラーチェック pm.expect(response.code).to.eql(401); });
  6. 柔軟なテストのしくみ テストスクリプト 複数のリクエストを組み合わせてシナリオテスト、 E2Eテストも作れる コレクション APIリクエスト① テスト サンプル APIリクエスト② テスト

    サンプル APIリクエスト③ テスト サンプル 複数リクエストで構成されたシナリオテストが可能 Request ① POST /regist Request ② GET /get Request ③ POST /unregist スクリプト @postman_japan
  7. 柔軟なテストのしくみ コレクションランナー 複数のAPIリクエストをまとめて実行可能なコンポーネント @postman_japan 実行 実行結果詳細表示 サマリー結果表示 順番入れ替え可能 実行方法選択 手動

    / スケジュール実行 イテレーション数 遅延秒数 データファイル 指定可能 選択 コレクションメニュー コレクションランナー実行方法設定
  8. 継続的に API を安全に保つ Postman CLI & CI/CD PostmanはコレクションはPostman CLI (コマンドラインインターフェース

    )から実行可能。これを CI/CDに組み 込むことで継続的な APIテストの実行が可能となる # Postmanにログイン postman login --with-api-key {{postman-api-key}} # コレクションのテスト実行 postman collection run {{collection-ID}} # API定義に対してセキュリティ・ガバナンスチェック postman api lint {{api-definition-ID}} Postman CLIでのcollection run実行イメージ GitHub ActionsでのPostmanテストの実行イメージ
  9. 機密情報を安全に扱う機能 Postman Vault • シークレットトークン、パスワードなど機密データを安全に Postmanのローカルインスタンスに保存して再 利用できる仕組み。データは Postman Vault 内で暗号化され保存される

    • Enterpriseプランかつ Advanced Security Administration アドオンを購入することで外部Vaultインテグレーショ ンの活用も可能 @postman_japan 利用可能なドメインを限定できる {{vault:secret-name}} で環境、認 可設定などワークスペース全体で利 用可能 外部キー管理サービスに格納されたシークレット 情報を Postman 変数として認証などに利用可能 1Password AWS Secret Manager Azure Key Vault HashiCorp Vault
  10. 一貫性のあるルールを適用 API セキュリティ・ガバナンスチェック • APIクライアントサイドからのアプローチで、代表的な APIセキュリティチェックとAPIにまつわる 設定の一貫性(ガバナンス)のチェックが可能 • API lintとして手動もしくはCI/CDなどを通じた継続的確認が可能

    @postman_japan APIセキュリティ • セキュリティ衛生状態 • 認証と認可の脆弱性 • クォータの実装 • 適切なセキュリティヘッダー • カスタムルールの追加 APIガバナンス • 全体統制の設定 ◦ API文書の整備、テスト実施、API設 定、誤ってトークンを公開していない か、など • カスタムルールの追加 https://www.postman.com/api-platform/api-security/ https://www.postman.com/api-platform/api-governance/
  11. API開発ライフサイクルにおける各ステージでの活用例 定義 設計 開発 テスト セキュリティ デプロイ 監視・観測 ビジネス システム

    Security ・・・ ドキュメント コード管理 システム設定 モック API Contracts (スキーマ) APIサーバー 開発 API Gateway 開発 トラフィック キャプチャ セキュリティ テスト 要件 Postman コレクション generate パフォーマンス テスト Contracts テスト E2E テスト ソースコード 成果物 commit 自動テスト APIサーバー Build/Deploy API Gateway Build/Deploy CI/CD ・・・ 配布 モニター アラート APM レポート APIカタログ API 開発ポータル trigger integration trigger ユーザー フィードバック Feedback loop UIテスト Stub generate 参考 @postman_japan
  12. まとめ APIの安全性を保つために活用できるPostmanの機能を紹介しました • 認証・認可設定のハードルを下げるしくみ • 柔軟なテストのしくみ • 継続的に API を安全に保つ

    • 機密情報を安全に扱う機能 • セキュリティ・ガバナンスチェック なお、言うまでもありませんが、 Postmanだけで全てのテストをカバーできるわけではありません(例 , 高度な 脆弱性スキャン、E2Eテスト、など)。テストは多層的に実施することが望ましく、ユニットテストや E2Eテストな ど、各レイヤーでのテストや他のツール・テスト戦略を併用することで、システム全体の品質を確保することが 重要です。 @postman_japan