Azure FunctionsのAPIに対して脆弱性診断ツール「VADDY」を導入してみた

# セキュリティテストどうしようかな・・・
Azure FunctionsでガンガンAPI作ったはいいが、
いざサービスインするにはセキュリティテストが必要となることが多々ある（と思う）

ただ、場合によってはそこで第三者機関にお願いするほどかね～と悩むこともあるわけで。
そこで工期的にもお値段的にもコスパよくこの悩みを解決してくれそうなツールを見つけました。

というか、既に実績も多数ある様ですが、
それが今回使用した「[VADDY](https://vaddy.net/ja/)」という脆弱性診断ツールです。

実際に３つのAPIを対象に診断レポートを出してみたのがこれ↓
![1vaddyャ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504562/05116a7c-87c0-8b8a-688e-07f8447d859b.png)


各APIに対して下記項目をチェックしてくれている
・SQLインジェクション
・XSS（反射型）
・XSS（蓄積型）
・リモートファイルインクルージョン
・コマンドインジェクション
・ディレクトリトラバーサル

尚、上記項目はVADDYのProfessionalプランの項目であり、
これをEnterPrizeにすれば更に下記項目が追加される
・ブラインドSQLインジェクション
・安全でないデシリアライゼーション
・XML外部実体攻撃(XXE)
・HTTPヘッダインジェクション

プランとその料金についての詳しい内容は[公式ページ](https://vaddy.net/ja/plan.html)まで。

Azure Functions相手にVADDYを動かすのは探してもなかなか見つからず、
少し詰まったのでここにその手順を残す。

ちなみに、Azure Functionsに対してセキュリティテストをする際には、
事前申告が必要かと思ったが、なんと2017年6月段階でその必要性は無くなっていた・・・↓↓
https://docs.microsoft.com/ja-jp/azure/security/fundamentals/pen-testing

侵入テストのルールドキュメントもあったので参考として↓
https://www.microsoft.com/ja-jp/msrc/pentest-rules-of-engagement?rtc=3

というわけで、お構いなく当該ツールを利用させて頂くこととした。


# 手順
### VADDYのアカウント取得
まずは1週間の無料トライアルにした。
なんとプロフェッショナルの機能をこの期間は使用可能。

下記URLから飛んで行って、
https://vaddy.net/ja/plan_plus.html
普通にパスワードやら設定してやれば良い。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504562/c8c4aafd-a3fc-d16e-7fa6-1525a1badbbf.png)

作成したアカウントで当該サイトにログインするとこんな管理画面に来る↓
（ちなみに既にこれはプロジェクトを一つ作った状態です）
![vaddyreal管理元年.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504562/fe47fbb0-1da5-b8c7-6858-0daf824cbb77.png)

### プロジェクトを作成する
管理画面の左下部分にあるプロジェクトを作成ボタンをクリック↓
![vaddyreal管理画面2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504562/966fe7a8-0b26-7e81-9ad9-8b918e9f73ca.png)

そして今回はAzure Functions叩くので上側のボタンクリック↓
![vaddyProjectMake2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504562/7a98ce16-d4d5-8606-029a-48b92375f197.png)

そしてこんな感じで設定して画面下部Createを押下
・プロジェクト名：　なんでもよい
・ServerFQDN：　対象サーバーのURL
・BASIC認証：　デフォルトのまま
![9VADDY_PROJEFT_SETTING.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504562/b53a4f1e-bf38-8cb6-dea8-d3b515b01472.png)


したら完了画面的なのが出てくる↓
![VADDY_SETTING_OK1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504562/0084c8aa-8e94-88b3-6ee4-0d586ba4dd5c.png)


これでプロジェクト自体は作成できた

### Valificationファイルを設定する
先程のプロジェクトの画面をよく見ると、検証対象サーバーに対するステータスがUnvelifiedになっている。
要は、その右側からダウンロードできるHTMLファイルをサーバーに設置して、
こちら側からそのURLを指定してこのファイル内に書いてあるValificationコードを読んでやらないといけない。

ここで思った。
え、AzureFunctionsのルートフォルダにそんなHTMLファイルを勝手におけんのか？
結構迷ったが、別にルートフォルダにそのHTMLを置かないといけないわけではない。
要は、このサーバー内にファイルを置いて、そこにURLでアクセスしてVerifyコードが読み取れれば良い。

てなわけで、AzureFuctionsの関数を追加して、このValifyコードをリターンするだけの処理を実装してデプロイした↓
見ての通り、JSのコードだがただVerifyコードを返すだけだ
![5AzureFuctions2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504562/be52ab13-afa9-58e7-6697-e3adaa54f492.png)

URLは動画面の右上部にある「関数のURLの取得」から取れるのでコピーして取っておく

そして再びVADDYのプロジェクト画面を開き、ボタン「URL変更」をクリックしてここで先ほどのパスを指してやる
![6vaddy_change_url.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504562/56197a61-b48f-8a3e-6388-386a31181252.png)


![7vaddy_modifed_URL.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504562/c8c409a3-99df-7e25-e686-0813ad1e0bec.png)


※Azure FunctionsのURLに倣って、拡張子は無し

これで画面下部のボタン「Edit」をクリックする。

だが、まだ終わらない。。
最後にプロジェクト画面でボタン「Verify」を押下してVerifiedになればOK。
![10verified.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504562/3118edd9-2daf-22d5-52be-da0c55db598f.png)


もし失敗したら画面上部に赤字でエラーメッセージが出るのでそれを参考にするとよい。
これで設定完了。

### セキュリティテスト実行
遂にここまでたどり着いた。
APIのセキュリティテストの方法については[こちら](https://qiita.com/ichikaway/items/99243a41bba757bdd1e1)で紹介されていたが
慣れないcurlでのリクエストやらが上手くいかなかったので、原始的にブラウザを叩くやりかたにした。

まずはVADDYのサイドメニューから「Proxy Crawling」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504562/675b9b44-e138-8406-9638-647c103405b6.png)

まあぶっちゃけここからの手順は遷移先画面に書いてある
![21crawlingway.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504562/f5d8ff1d-8a35-0969-c015-772d0546e490.png)


#### クローリング手順
1. ブラウザのプロキシーをVADDYの設定に切り替え(IP( 54.92.84.100 )とポート番号( 28889))
2.  当該画面の2に記載されているURLをクリック（クローリング開始）
3.  検証したいAPIのURLをブラウザに打ち込んでリクエスト（必要なだけやる）
4.  当該画面の4に記載されているURLをクリック（クローリング終了）
5.  プロキシを元に戻す

ただ1のプロキシー設定をChromeでやると、クローリングがなぜか途中から出来なくなった。
そこで公式ページの手順を見てみると、クローリング出来ないケースというのがあり、まさしくこの1ケース目の「HTTPS側のProxy設定が抜けている」だった。
つまりHTTPとHTTPS両方に対してProxyの手動設定をする必要がある。
とはいえChromeでそれを解決する方法は分からず、Firefoxに切り替えると下記の様にそれぞれに設定するダイヤログがあったのでこちらからクローリングすることで一応問題解決とした↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504562/9d0ed86e-c1e4-b219-fe77-990d26af5bf1.png)


上記の手順に従ってクローリング後、同画面を更新すると、上手くいっていればこんな感じでクローリング結果が出る（1回のクローリングにつき1件）
![4.crawlingList.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504562/68d6b7ff-cdbd-cb25-bd37-d838a8644ccf.png)



この欄にあるボタン「View」をクリックするとクローリングされたAPIのリストが見れる。
今回は4件APIを叩いたがそれが無事確認出来る↓
![3crawlinglist.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504562/bb378e2e-eec2-2c1b-305e-d0c4a95911b7.png)


また先ほどの画面のクローリング一覧で同じ欄にある「Start Scan」⇒　遷移先画面でボタン「Run VADDy scan」を押下するとセキュリティチェックが開始する
![start_scan.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504562/e7a5a215-9c73-c8bf-212e-5bb68ba6fb5d.png)

無事スキャン出来たら下部のボタン「サマリーレポート」を押下すると、セキュリティ診断結果が確認出来る
![scan_list.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504562/8cb8a82b-33d7-f264-fa69-83cfd6d901c4.png)

↓↓
![1vaddyャ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504562/05116a7c-87c0-8b8a-688e-07f8447d859b.png)

# 最後に
Azure Functionsに対して行うのは初めての試みだったのでかなり手間取ったが
手順さえ覚えてしまえばこれだけのセキュリティテストとレポートの完成度であればかなり価値あると思う。
今後もどしどし使いたい。

以上、どどん。