第3回「日々の診断スケジュール（開始・停止）をGASとAeyeScanで自動化」

![title3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422105/e320294b-ee69-e1f9-469d-700ff2de0233.png)

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」の機能や、脆弱性診断内製化のコツ、CIツールを使ったDevSecOps等を紹介していきます。

[前回](https://qiita.com/AeyeScan/items/4c94f64a31f0f8717911 )はGithub Actionsを使ってAeyeScanの診断を自動化する手順について紹介しました。
第3回目「日々の診断スケジュール（開始・停止）をGASとAeyeScanで自動化」は以下のような内容でお送りします！

#目次
[■なぜ日々の診断スケジュール（開始・停止）の自動化が必要?](#なぜ日々の診断スケジュール開始停止の自動化が必要)
[■Google Apps Script(GAS)の紹介](#google-apps-scriptgasの紹介)
[■作るものの説明](#作るものの説明)
[・スキャン作成](#スキャン作成)
[・APIキー作成](#apiキー作成)
[・スプレッドシート用意](#スプレッドシート用意)
[・トリガー作成](#トリガー作成)
[・スキャンの自動実行](#スキャンの自動実行)
[■利用上の注意](#利用上の注意)
[■おわりに](#おわりに)

#■なぜ日々の診断スケジュール（開始・停止）の自動化が必要?
AeyeScanをご利用の方の中には、企業のCSIRTやセキュリティ担当の方が、AeyeScanを使って脆弱性診断を実施するケースもあります。このような場合、対象サイトが運用中またはステージング環境など、診断の実施日時に配慮が必要なサイトが多いと思います。

配慮が必要なサイトの要件としては、共有環境のため診断負荷の低減や、診断の実施可能な時間帯が限定されている事が挙げられます。負荷はAeyeScanで”ゆっくり”などスピードの調整が可能です。
しかし、スケジュールについては、例えば、「平日の10:00～18:00の間に診断可能、ただし特定の日程はテストで使うのでこの期間は診断を実施してはならない」というスケジュールで診断を実施する場合、GUIから定められた時間にAeyeScanの開始と停止ボタンを毎日押して制御する必要があります。

今回は、この毎日決められた時間に行う作業を、Google Apps Script(GAS)＋APIを使って自動化していきます。

#■Google Apps Script(GAS)の紹介
Google Apps Script(GAS)とは、業務の自動化やアプリケーションの統合のためのプラットフォームで、Google社が提供しています。
GASを利用することで、Gmail とスプレッドシートの連係や自動化が可能です。
Gmailアカウントがあれば無料で利用でき、本格的な開発経験が無くても簡単にソリューション開発ができます。

#■作るものの説明
まず、これからどのようなものを作るかを説明します。
一言で言えば「スプレッドシートにスキャンIDと開始、停止時刻を書き込めば自動でAeyeScanでスキャンを開始&停止してくれるもの」を作ります。

こちらのスプレッドシートを使用します。

![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422105/60100a12-8263-9c7e-64e6-ccbd313c81bb.png)
![image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422105/64dfe05d-00f0-0490-071a-0085df438ded.png)

色々と項目がありますが、図中の赤枠で囲った部分と除外日のシートが人間が入力する項目、図中の青枠の部分はスクリプトが自動で入力する部分となります。
「自動再開」のチェックボックスはスクリプトが自動で生成しますが、手動での操作が必要です。
これについては「■利用上の注意」で説明します。

:::note
1. ユーザは、「コピー元ID」、「スキャン開始日付/時刻」、「スキャン停止日付/時刻」を入力する。
2. スキャン開始時刻に自動でコピー元IDのスキャンをコピーしてスキャンが開始。この時に「コピー先ID」、「スキャンID」が自動で入力される
3. スキャン中は「ステータス」、「進捗」が自動で更新される
4. スキャン停止時刻に自動でスキャンが停止される
5. 次の日のスキャン開始時刻にスキャンが再開され、停止時刻にスキャンが停止される。ただし、「除外日」として指定した日はこの動作を行わない。
6. スキャンが終了すると「スキャン結果」、「終了時刻」が自動で入力される
:::

では早速作っていきましょう。

#■GASでAeyeScanを自動実行

##・スキャン作成

まずはAeyeScanでスキャンを作成いたします。
スキャン作成について詳しくは[第一回](https://qiita.com/AeyeScan/items/f7c647db9365ff8b2ffb)の記事をご覧ください。

作成したスキャンのIDを後で使うのでここで控えておきます。
![image3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422105/26af2066-830c-f6e5-ad7d-e54c0f21ef9d.png)

##・APIキー作成
次に、AeyeScanでAPIキーを作成します。
APIキーはAeyeScanのメニューバーの「アカウント管理」→「APIキー管理」から作成できます。
APIキーを作成する際には書き込み・実行権限を「あり」に設定します。
作成したAPIキーとトークンは後から確認できないため、安全な場所に保管してください。
ここまでの手順は[前回](https://qiita.com/AeyeScan/items/4c94f64a31f0f8717911)と同じです。
![image4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422105/a1642968-6fc2-6813-29be-1fd83f31bd24.png)

##・スプレッドシート用意
次に、前章([■作るものの説明](#作るものの説明))で述べたスプレッドシートを用意します。
以下のリンクからスプレッドシートを開き、メニューバーの「ファイル」→「コピーを作成」からご利用のGoogle Driveにファイルをコピーしてください。以下、コピーされたファイルを編集していきます。

https://docs.google.com/spreadsheets/d/1oXaqjKk4HsZvGFWd4_LFYS3cL8IW_BqBmuLcUQn9VuQ/edit?usp=sharing

編集する箇所は3つです。
1つめに、メニューバーの「ツール」→「スクリプトエディタ」を開き、スクリプトの7, 8行目のXXXXXの部分を作成したAPIキーとAPIトークンの値にそれぞれ置き換えてください。
![image5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422105/ed914d93-a451-0d95-fd5e-9f991099afc4.png)

2つめに、シートにスキャンの情報を入力します。
まず、注意書きの通りに2~4行目のサンプルをすべて削除してください。
次にコピー元のスキャンIDと開始、停止時刻を入力していきます。
例として、スキャンID60をコピーして2021/10/13から2021/10/18まで毎日10時から18時にスキャンを実行したい場合、以下のように入力します。
![image6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422105/1de24972-8cd6-7f75-0da2-313a50e7aae1.png)

3つめに、除外日を指定します。
適当な名前でシートを作成し、そこにスキャンを実施できない日を書いていきます。
今回は「除外日_デモサイト」という名前にしました。
先ほどの例で、例えば11/16と11/17はスキャンを実施できないとすると、除外日指定シートは以下のようになります。
![image7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422105/65645486-6a02-9400-2901-dc20776c5ca8.png)

最後に先ほどのスキャン情報を入力したシートの「除外日指定シート名」のセルにこの除外日指定シートの名前を入力します。
![image8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422105/17e3d1d1-aa51-8182-deac-d83294c92089.png)

診断したいサイトが2つ以上ある場合には3行目以降に同様に入力してください。
これでスキャンに必要な情報が入力できましたが、まだスキャンは自動で実行されません。

##・トリガー作成
最後に、GASのトリガーを作成します。
スプレッドシートから再び「ツール」→「スクリプトエディタ」を開き、サイドバーから「トリガー」を選択して「トリガーの追加」を押します。
以下の画像のようなウィンドウが表示されるので、トリガーの設定を「時間主導型」、「分ベース」、「5分おき」に変更して保存します。
![image9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422105/da94f08d-4d8e-a11d-2dc3-b1c5a9926a29.png)
ここで、はじめてトリガーを追加する際には以下のような警告が表示されます。
これは、このスクリプトがGoogle Drive内のスプレッドシートの参照と編集(スキャン時刻や除外日などの参照とスキャンステータスの更新など)と、外部サービス(AeyeScan)への接続を行うことに対しての警告です。
**必ず本スクリプトと警告の内容を理解したうえで続行してください。**
![image10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422105/d68cf356-b98a-f7b0-ddf2-f24e806c8113.png)

##・スキャンの自動実行
自動実行のログはGASのページのサイドバーの「実行数」から確認できます。
![image11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422105/6fc111ec-f6ed-dd61-041f-890b49ad7b39.png)

また、スキャン終了後には「スキャン結果」のURLからAeyeScanによるスキャン結果を確認できます。
![image12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2422105/82f17bf6-257d-a2c8-3654-9b296588a731.png)

#■利用上の注意
**・手動でAeyeScanを停止する場合、事前にスプレッドシートの「自動再開」の列の該当するチェックボックスを手動でオフにしてください。**このチェックボックスがオンの場合、開始時刻から停止時刻の間でスキャンが停止している場合自動で再開されます。

**・GASのコードなどご自由に編集し利用してください。ただし、無償無保証のため**不明点の質問やカスタマイズについてのサポートはできません。コードの改善、不具合については、是非ご連絡ください。

#■おわりに
今回はGASを使用して診断の開始と停止を自動化してみました。
前回のGitHub Actionsより少し手順が増えましたが、その分停止も自動化できるようになってより便利になったと思います。
[次回](https://qiita.com/AeyeScan/items/964f502cd780911599ac )はCircle CIを使ってAeyeScanの診断を自動化していこうと思います！

AeyeScanのトライアル、脆弱性診断の自動化のご相談は[こちら](https://www.aeyescan.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)