SLL #16|OWASP ZAPを導入し、自分のWebサーバーを初めてスキャンしてみた

SLL #16 OWASP ZAPを導入し、自分のWebサーバーを初めてスキャンしてみた のアイキャッチ画像。虫眼鏡でブラウザウィンドウとサーバーを検査し、オレンジ・黄色の警告アイコンが複数表示されている図解。「Phase6「Security」」のラベル付き。 Docker

個人学習プロジェクト 「Security Learning Lab(SLL)」 の学習記録です。

今回は、Phase6「Security」の実践として、脆弱性診断ツールOWASP ZAPをMacにインストールし、EC2上のDocker版Nginxに自動スキャンを実行して結果を読み解いた内容についてまとめます。

学習時間

約2時間

今日やったこと

  • OWASP ZAPの概要(プロキシとして通信を監視・分析する脆弱性診断ツール)を確認
  • Homebrewでのインストールを試みるも、Gatekeeperのチェック未通過でパッケージが無効化されていることが判明
  • ZAP公式サイトから直接macOS版インストーラーをダウンロードし、Gatekeeperの警告を正規の手順で回避してインストール
  • ZAPを起動し、セッション保存の設定、アドオン一覧の確認を経てクイックスタート画面まで到達
  • 「自動スキャン」を選択し、診断対象としてEC2上のDocker版Nginx(ポート8080)のURLを入力
  • 「従来のスパイダー」を使用、「Ajaxスパイダー」は不使用の設定で「攻撃」を実行
  • スキャン完了後、「アラート」タブでMedium 2件・Low 3件の検出結果を確認
  • 修正前の記録としてHTMLレポートを出力・保存

学習内容

OWASP ZAPの役割

ZAP(Zed Attack Proxy)は、ブラウザとWebサーバーの間に入り込み、通信内容を監視・分析することで脆弱性を発見する、無料のオープンソース診断ツール。現在は開発元がOWASPからCheckmarx社に移管され「ZAP by Checkmarx」として提供されている。

Gatekeeperと未署名リリースの問題

Macには「Gatekeeper」という、信頼できないアプリの実行を防ぐセキュリティ機能が備わっている。今回、ZAPのリリースが現在未署名の状態であることが公式サイトにも明記されており、Homebrew経由のインストールはブロックされたが、公式サイトからの直接ダウンロード+システム設定からの正規の許可手順で対応できた。

自動スキャンは2段階で動く

ZAPの自動スキャンは「スパイダー」と「アクティブスキャン」の2工程で構成されている。スパイダーはHTML内のリンクをたどってサイト内のURLを洗い出す工程で、建物の扉を一つずつ開けて見取り図を作るイメージ。アクティブスキャンは見つけたURLごとに実際にリクエストを送り、反応から脆弱性を判定する工程で、部屋ごとに鍵や窓を点検するイメージ。今回のNginxデフォルトページでは、発見されたエンドポイントは2件だった。

パッシブスキャンは常に動いている

アクティブスキャンが終わる前から、ステータスバーには検出件数が表示されていた。これは攻撃リクエストを送らず、通過した通信のヘッダや本文を眺めるだけで判定する「パッシブスキャン」の結果。レポートを確認すると、今回の5件はすべてパッシブスキャンによる検出だった。

スパイダーの限界

スパイダーはリンクをたどる方式のため、どこにもリンクされていないURL、JavaScriptで動的に生成されるリンク、ログイン後にしか見えない画面は見つけられない。クイックスタートに「手動探索」の選択肢があるのはこの限界を人の操作で補うためで、実務の診断で担当者がブラウザを操作しながらプロキシに通す手順を取るのも同じ理由。

検出された5件のアラート

  • CSPヘッダ未設定(Medium):読み込みを許可するスクリプトや画像の出所をブラウザに宣言しておらず、XSSが混入した際の最後の防衛線がない
  • クリックジャッキング対策ヘッダの欠如(Medium):X-Frame-Options等がなく、他サイトのiframeに透明に埋め込まれてクリックを誘導される余地がある
  • In Page Banner Information Leak(Low):/robots.txtへのアクセスで返る404ページの本文に、Nginxのバージョンが表示されている
  • X-Content-Type-Optionsヘッダ未設定(Low):nosniffがなく、ブラウザがContent-Typeを無視して中身から種類を推測する余地がある
  • Serverヘッダによるバージョン漏洩(Low):ServerヘッダにNginxのバージョンが含まれ、既知の脆弱性を狙う材料になる

5件すべてが「Nginxをデフォルト設定のまま公開している」ことに起因し、前回学んだOWASP Top10のA02(セキュリティ設定ミス)に該当する内容だった。

困ったこと・つまずいたこと

Homebrewでのインストールが失敗した

  • 何に困ったか:brew install --cask owasp-zapを実行したところ、「Gatekeeperのチェックを通過しないため無効化された」というエラーが出た
  • どう解決したか:ZAP公式サイトから直接macOS(Apple Silicon)版のインストーラーをダウンロードし、Macの「システム設定」からブロックを解除する正規の手順でインストールした

URL欄のドットが表示されず、入力できていないと思い込んだ

  • 何に困ったか:攻撃対象URLに貼り付けたIPアドレスのドットが画面上でスペースのように見え、入力できていないと判断してしまった。コピペしても表示は変わらなかった
  • どう解決したか:試しに「攻撃」を押したところ、そのままスキャンが正常に走った。実際にはドットは入力されており、Javaアプリが日本語環境で小さな記号を描画できていないだけだった

今日の学び・気づき

  • セキュリティツール自体が、Macのセキュリティ機能(Gatekeeper)に一時的に引っかかるという状況を経験し、「安全性の判断は常に単純ではない」という視点を得られた
  • 仕事で報告書に並んでいる「CSP未設定」「X-Frame-Options欠如」を、自分のサーバーで自分の手で検出でき、指摘内容が急に身近になった
  • 会社では独自開発のプロキシで手動調査をしているが、ZAPも本質は同じ「ブラウザとサーバーの間に立って通信を記録する」仕組みで、自動スキャンはその作業をクローラーが代行しているだけだと分かった
  • スパイダーによるエンドポイントの洗い出しは、診断のスコープ選定や見積りの前提になる工程そのもので、ツールにできることと人の手が必要な部分の境界が見えた
  • 「設定を一行足すだけで直る項目が、デフォルトのままだと5件も出る」という事実が、A02(セキュリティ設定ミス)の意味を体感させてくれた

今日の達成

First Scan
OWASP ZAPを導入し、自分が構築したWebサーバーを初めて診断して5件の指摘を検出・理解した。

次回やること

  • Nginxの設定にadd_header各種とserver_tokens offを追加し、5件の指摘を解消する
  • ZAPで再スキャンし、アラートが消えたことを修正前後のレポートで確認する

今日のひとこと

自分で診断ツールのスキャンを実行するのは初めてだったので少し緊張した。自分の環境とはいえ、実行して大丈夫かなという不安もあった。実行してみるとあっさり完了したし、仕事で見覚えのある脆弱性や問題を確認できたことも勉強になった。

タイトルとURLをコピーしました