OpenVASによる脆弱性診断をDockerで手軽に実行する

Webセキュリティ入門本として有名な、`体系的に学ぶ 安全なwebアプリケーションの作り方(通称: 徳丸本)`を読んでいて、脆弱性診断ツールとしてOpenVASというものが紹介されていました。

個人的に開発しているWebアプリの脆弱性診断に試してみたいと思い色々調べていたら、専用のDocker Imageが公開されていたのでとても手軽に実行できました。

以下にやり方などまとめていきます。

# OpenVASとは
プラットフォーム脆弱性診断ツールです。
OSSなので無料で利用できます。

指定したホストをリモート（外部）からスキャンし、対象ホストのOS/ソフトウェアに既知の脆弱性がないかをチェックします。

診断の実行や診断結果の閲覧はCLIでも可能ですが、Webブラウザでのインターフェースも用意されているので今回はそちらを紹介してきます。


# 環境

OSX

```
$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.15.3
BuildVersion:   19D76
```

Chrome

```
$ osascript -e 'version of app "Google Chrome"'
81.0.4044.122
```

Docker for Mac

```
$ docker version
Client: Docker Engine - Community
 Version:           19.03.8
 API version:       1.40
 Go version:        go1.12.17
 Git commit:        afacb8b
 Built:             Wed Mar 11 01:21:11 2020
 OS/Arch:           darwin/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.8
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.17
  Git commit:       afacb8b
  Built:            Wed Mar 11 01:29:16 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v1.2.13
  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683
```

# 準備

先述の通りDockerHubにimageが公開されているので、それを使いましょう。
([参考リンク](https://github.com/mikesplain/openvas-docker))

以下ワンライナーで最新版のimageを取得してきて、openvasという名前でコンテナを立ち上げます。
ポートは443番にbindします。

```:bash
$ docker run -d -p 443:443 --name openvas mikesplain/openvas
```

また、診断対象にするホストはlocalで立ち上げているdocker containerの場合も多いと思います。

対象のコンテナを載せたnetworkを指定し、

```:bash
$ docker run -d -p 443:443 --name openvas --net=<network_name> mikesplain/openvas
```
のようにして、同一のnetworkに繋いであげましょう。

https://localhost  にアクセスするとログイン画面が出てくるので、

```
Username: admin
Password: admin
```

でログインします。
![スクリーンショット 2020-04-25 13.59.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319032/785979f8-dcf2-f14e-2923-5ec66d0cad56.png)


# 実行
ログイン後、上のバーからTasksを選択し、Task一覧画面に遷移します。（OpenVASでは1回の脆弱性診断の実行をTaskと呼んでいるそうです）
![スクリーンショット 2020-04-25 16.47.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319032/eec21f9b-6537-2351-a2c4-8c0b69d26b85.png)

左上の星マークのボタンからNewTaskを選択。
![スクリーンショット 2020-04-25 16.47.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319032/bed72816-8668-fc62-47b2-f42e73905f5e.png)

Task作成ダイアログが現れます。
![スクリーンショット 2020-04-25 16.48.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319032/3623521d-bf72-d467-d133-73140d41fc91.png)

ScanTargetを作成します。ScanTargets欄の右側の星マークボタンを押して出てくるポップアップで、Hostsはmanualを選択、右のテキストボックスにIPアドレスもしくはホスト名を入力しCreateボタンを押します。
![スクリーンショット 2020-04-25 16.52.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319032/9febbb30-7bb4-ccb6-6fc8-934ec8c343f1.png)

Nameに適当な名前を付け、ScanTargetsに作成したものをを指定してCreateボタンを押します。
![スクリーンショット 2020-04-25 16.52.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319032/97422035-7ece-3bd1-73f4-87c9e054f5f9.png)

作成したTaskが一覧に現れているので、赤枠で囲った再生ボタンみたいなボタンを押して実行します。
![スクリーンショット 2020-04-25 17.09.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319032/096e8148-8b04-3e2b-0e6d-8bea270414da.png)

暫く待ってページをリロードすると、診断が完了しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319032/40e68820-c33c-201a-8ec3-417918344a85.png)

上バーのScans->Resultsをクリックすると、このように診断結果を見ることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319032/646b7eb6-cb21-8d58-cef6-457b3baf2c4c.png)


今回の診断では、TCP timestamps脆弱性がLowレベルとして検出されました。（脆弱性の内容はこの記事の対象外なので略）

# まとめ
以上のように、OpenVASのimageを使えばプラットフォームに関する脆弱性を簡単に診断できます。
みなさんも自分の運営しているサービスなどに使ってみてはいかがでしょうか？

とはいえこのツールだけでサービスに関わるすべての脆弱性が洗い出せるわけではもちろんありません。
徹底したコードのチェック(SQLインジェクションやXSS対策など)やシステムアーキテクチャのチェック(DNSキャッシュポイズニングやセッションハイジャック対策など）は普段から欠かさず行っていきましょう！