【AeyeScan】手動巡回結果を定期スキャンする方法

SaaS型Webアプリ診断ツール「AeyeScan」を運営している株式会社エーアイセキュリティラボによる、セキュリティテストの自動化、脆弱性診断の内製化、AI/機械学習などの技術情報の共有を目的とした記事です。
AeyeScanの情報はこちら https://www.aeyescan.jp
エーアイセキュリティラボの情報はこちら https://www.aeyesec.jp

[![2022-155641.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422105/dd3f69d5-879a-ed11-d6ac-353a85523c43.png)](https://www.aeyescan.jp)

こんにちは！株式会社エーアイセキュリティラボ　カスタマーサクセス担当　日髙です。

AeyeScanは高精度な自動巡回を特徴としていますが、昨年リリースしたリモートブラウザ機能を使えば、以下のようなニーズも解決できることはご存知ですか？

「特定の画面だけを何度もスキャンしたい」
「自動巡回できない箇所も定期スキャン対象にしたい」

リモートブラウザ機能は、自動巡回では操作が難しい画面や特定の画面だけを抜き出してスキャンしたいときに便利に使っていただける機能です。

今回は、このリモートブラウザ機能を利用して巡回した結果をAeyeScanにインポートして、スキャンを行う仕組みをご紹介します。

この仕組みを使えば、特定の画面や自動巡回できない箇所も定期的に巡回スキャンを実施することが可能になります。

# 目次
[AeyeScanのリモートブラウザ機能](#aeyescanのリモートブラウザ機能)
[手動巡回結果の定期実行を実現するためのステップ](#手動巡回結果の定期実行を実現するためのステップ)
[　1. 巡回結果ファイルを自動実行する仕組みを作る](#1-巡回結果ファイルを自動実行する仕組みを作る)
[　2. リモートブラウザ機能で対象画面にアクセスして、巡回結果ファイルを取得する](#2-リモートブラウザ機能で対象画面にアクセスして巡回結果ファイルを取得する)
[シェルスクリプトの実行確認](#シェルスクリプトの実行確認)
[利用上の注意](#利用上の注意)
[おわりに](#おわりに)
[参考文献](#参考文献)

# AeyeScanのリモートブラウザ機能
AeyeScanのリモートブラウザ機能とは、AeyeScanの画面上でWebブラウザを起動し、そのブラウザ上でスキャン対象のサイトを巡回する機能です。
例えば、スキャンしたい対象が一部の画面のみの場合や、自動巡回では対応できない操作を行って巡回をする必要がある場合などに活躍する機能です。

また、リモートブラウザで巡回した結果は、jsonファイルとしてエクスポートすることが可能です。
このファイルをインポートして、AeyeScanで画面遷移図を作成することもできます。

# 手動巡回結果の定期実行を実現するためのステップ

ここからは、リモートブラウザ機能で巡回した結果をもとに、定期的に巡回スキャンする方法を説明します。

具体的には２ステップに分けて実施します。
**1. 巡回結果ファイルを自動実行する仕組みを作る**
**2. リモートブラウザ機能で対象画面にアクセスして巡回結果ファイルを取得する**

## 1. 巡回結果ファイルを自動実行する仕組みを作る
まずは、自動巡回ファイルをAeyeScanにインポートして、インポートした結果を元にスキャンを自動実行する仕組み(シェルスクリプト)を作成します。

今回作成したシェルスクリプト(scan_with_remotebrowser.sh)は以下となります。
以降で処理の解説を行います。

なお、AeyeScanのAPIの詳細については、以下をご参照ください。
https://aeyescan.com/api-doc.html

```bash:scan_with_remotebrowser.sh
#!/bin/bash

# APIのURLとパラメータを設定
BASE_URL="https://api.aeyescan.com/api/v1/scan/"
COPY_SFX="/copy"
IMPORT_SFX="/manualCrawl/remoteBrowser"
STATUS_SFX="/status"
START_SFX="/startScan"
API_KEY="XXXXXXXXXXXXX"
API_TOKEN="XXXXXXXXXXXXX"
CONTENT_TYPE="Content-Type: application/json"
SCAN_ID=$1
JSON_FILE=$2

# (1)スキャンをコピーする
response=$(curl -s -X PUT -H "${CONTENT_TYPE}" -H "X-AEYE-API-KEY: ${API_KEY}" -H "X-AEYE-API-TOKEN: ${API_TOKEN}" "${BASE_URL}${SCAN_ID}${COPY_SFX}")
copied_id=$(echo "${response}" | jq -r '.scanInfo.id')

# (2)コピーしたスキャンのIDをチェックする
if [ "${copied_id}" == "null" ]; then
  echo "Failed to get copied scan ID."
  exit 1
else
  echo "Copied scan ID: ${copied_id}"
fi

# (3)巡回結果ファイルをインポートする
base64_json=$(base64 -w 0 "${JSON_FILE}")
file_name=${JSON_FILE##*/}
file_data="{\"manualCrawlName\":\"${file_name}\",\"uploadFile\":\"${base64_json}\"}"
response=$(curl -s -X POST -H "${CONTENT_TYPE}" -H "X-AEYE-API-KEY: ${API_KEY}" -H "X-AEYE-API-TOKEN: ${API_TOKEN}" -d "${file_data}" "${BASE_URL}${copied_id}${IMPORT_SFX}")

# (4)状態を確認する
count=0

while [ ${count} -lt 4 ]; do
  # カウンタを1プラス
  count=$((count+1))
  
  # 5分待つ
  sleep 300
  
  response=$(curl -s -X GET -H "${CONTENT_TYPE}" -H "X-AEYE-API-KEY: ${API_KEY}" -H "X-AEYE-API-TOKEN: ${API_TOKEN}" "${BASE_URL}${copied_id}${STATUS_SFX}")
  status=$(echo "${response}" | jq -r '.scanInfo.status')

  if [ "${status}" == "Crawled" ]; then
    echo "File upload finished."
    break
  else
    echo "File upload in progress, current status: ${status}"
  fi
done

# 4回チェックしても完了していない場合は異常
if [ "${count}" -ge 4 ]; then
  echo "File upload failed."
  exit 1
fi

# (5)スキャンを開始する
response=$(curl -s -X PUT -H "${CONTENT_TYPE}" -H "X-AEYE-API-KEY: ${API_KEY}" -H "X-AEYE-API-TOKEN: ${API_TOKEN}" "${BASE_URL}${copied_id}${START_SFX}")
echo "Processing started."
```

### (1)スキャンをコピーする

今回は、スキャン作成については、事前にAeyeScanの画面上から行っておきます。
作成したスキャンIDをシェルスクリプトの第一引数として渡し「スキャン情報をコピー」のAPIでコピーを行います。
また、コピーされたスキャンIDをAPIのレスポンスから取得します。

### (2)コピーしたスキャンのIDをチェックする
コピーされたスキャンIDをチェックします。
取得できていない場合は、異常終了させます。

### (3)巡回結果ファイルをインポートする
巡回結果ファイルは、シェルスクリプトの第二引数として渡されます。
巡回結果ファイルをAPIに渡す際は、base64エンコードが必要になります。

### (4)状態を確認する
ファイルのインポートが行われると、AeyeScan側で巡回処理が始まります。
今回は、5分おきに、スキャン情報のステータスを取得して、
ステータスが「巡回完了（Crawled）」の状態になったら、処理を抜けるよう設定しました。
また、4回チェックを繰り返しても巡回が完了しない場合は、異常終了として処理します。

### (5)スキャンを開始する
最後にスキャンを実行します。

## 2. リモートブラウザ機能で対象画面にアクセスして巡回結果ファイルを取得する
次に、リモートブラウザ機能を利用して、巡回結果ファイルを取得します。

### (1)スキャン作成
まずは、事前にAeyeScanで新規スキャンの作成を行います。
手順の詳細については[こちら](https://qiita.com/AeyeScan/items/f7c647db9365ff8b2ffb)の記事ご覧ください。

作成したスキャンのスキャンIDを後で使うのでここで控えておきます。

### (2)巡回結果ファイルの取得
以下の手順で、リモートブラウザ機能にて、スキャン対象画面を取得し、巡回結果ファイルを取得します。

作成したスキャンIDのスキャンメニューから「手動巡回」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422105/e81fba13-9b05-8b63-ba01-ee0dd75dddd0.png)

「リモートブラウザで巡回」をクリックして、対象サイトを巡回します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422105/c8be8505-5759-a0be-1c49-81ce917f6182.png)

巡回が完了したら、「画面遷移図に反映」をクリックして、AeyeScanで巡回をおこないます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422105/88e5192e-f195-6bf1-ca57-6a4b9e24745d.png)

AeyeScanでの巡回が完了後、再度、スキャンメニューから「手動巡回」をクリックし、表示された画面の「エクスポート」アイコンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422105/812b1eda-f74f-497a-8045-bbf04ca87676.png)

上記の手順で、ファイルを取得します。

## シェルスクリプトの実行確認
それでは実際にシェルスクリプトを実行して動作を確認します。

### APIキーの設定
APIを実行するためのAPIキー及びAPIトークンを取得します。
手順の詳細については[こちら](https://qiita.com/AeyeScan/items/4c94f64a31f0f8717911#api%E3%82%AD%E3%83%BC%E4%BD%9C%E6%88%90)の記事ご覧ください。

取得したキーとトークンを以下シェルスクリプトの先頭の定数定義の部分に設定します。
```bash
API_KEY="APIキー"
API_TOKEN="APIトークン"
```

### シェルスクリプトの実行
以下の通り、シェルコマンドを実行します。

```bash
./scan_with_remotebrowser.sh コピーするスキャンID 巡回結果ファイル

例：
./scan_with_remotebrowser.sh 1 remote_browser_1-1(example.com).json
```

### 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422105/0f2a43e0-af06-b615-ed81-f50601280f2f.png)

### AeyeScan画面
AeyeScan画面を確認すると無事スキャンが開始されていることが確認できます。

・スキャン一覧
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422105/60adb939-bde8-df2b-1bdd-cfe3bd5eb05f.png)

・画面遷移図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422105/6e7bb2e6-c0a6-a2cf-32b8-10d7eab00eea.png)

# 利用上の注意
今回利用したシェルスクリプトについては、自由に編集しご利用ください。ただし、無償無保証のため不明点の質問やカスタマイズについてのサポートはできません。シェルスクリプトの改善、不具合については、是非ご連絡ください。

# おわりに
AeyeScanの巡回結果ファイルを使ってシェルスクリプトから自動でスキャンを実行する方法について、ご紹介しました。
今回の方法を利用すれば、リモートブラウザで巡回した操作に対して、定期的スキャンを行うことが可能ですので、是非ご活用ください。

# 参考文献
Aeye Scan APIドキュメント
https://aeyescan.com/api-doc.html