Skip to Content

Vuls-DockerでEC2インスタンスの脆弱性スキャン

概要

自端末のDockerコンテナからEC2インスタンスの脆弱性を確認する

結論

コンテナからEC2インスタンスへSSH接続の部分でハマったが、
それ以外は設定も少なく実に手軽に脆弱性スキャンできる
とても便利

環境

PC(Ubuntu)
VERSION="19.10 (Eoan Ermine)"
Docker version 19.03.6, build 369ce74a3c

Vuls コンテナ準備

公式手順 通り
導入時の各バージョンを記載

1
2
3
mura@desktop ~> docker pull vuls/go-cve-dictionary
mura@desktop ~> docker run  --rm  vuls/go-cve-dictionary -v
go-cve-dictionary v0.4.1 4a02438
1
2
3
mura@desktop ~> docker pull vuls/goval-dictionary
mura@desktop ~> docker run  --rm  vuls/goval-dictionary -v
goval-dictionary v0.2.3 85c5c09
1
2
3
mura@desktop ~> docker pull vuls/gost
mura@desktop ~> docker run  --rm  vuls/gost  -v
gost 76d68fe
1
2
3
mura@desktop ~> docker pull vuls/vuls
mura@desktop ~> docker run  --rm  vuls/vuls -v
vuls v0.9.1 build-20200201_003025_00e52a8

脆弱性スキャン準備

公式手順 をベースに変更箇所

  • 脆弱性情報データベースはJVN
  • OVALはUbuntuと、Amazon Linux(Amazon ALAS )
JVNとは

日本語 の脆弱性情報データベース
https://jvndb.jvn.jp/index.html

OVALとは

セキュリティ検査言語OVAL(Open Vulnerability and Assessment Language)
https://www.ipa.go.jp/security/vuln/OVAL.html

ログディレクトリ作成

以降の作業は作成したログディレクトリをカレントディレクトリにして作業を行う
$PWDでカレントディレクトリをパスに使用するため

1
mkdir /home/mura/vuls

JVNの取得

過去2年分

1
2
3
4
docker run --rm -it \
    -v $PWD:/vuls \
    -v $PWD/go-cve-dictionary-log:/var/log/vuls \
    vuls/go-cve-dictionary fetchjvn -last2y

OVALの取得

Ubuntu 19

1
2
3
4
docker run --rm -it \
    -v $PWD:/vuls \
    -v $PWD/goval-dictionary-log:/var/log/vuls \
    vuls/goval-dictionary fetch-ubuntu 19

Amazon

1
2
3
4
docker run --rm -it \
    -v $PWD:/vuls \
    -v $PWD/goval-dictionary-log:/var/log/vuls \
    vuls/goval-dictionary fetch-amazon

GOSTの取得

RedHat

1
2
3
4
docker run --rm -i \
    -v $PWD:/vuls \
    -v $PWD/gost-log:/var/log/gost \
    vuls/gost fetch redhat

Debian

1
2
3
4
docker run --rm -i \
    -v $PWD:/vuls \
    -v $PWD/gost-log:/var/log/gost \
    vuls/gost fetch debian

go-exploitdbの取得

1
2
3
4
docker run --rm -i \
    -v $PWD:/vuls \
    -v $PWD/go-exploitdb-log:/var/log/go-exploitdb \
    vuls/go-exploitdb fetch exploitdb

Vuls Scan対象の設定

コンフィグファイルの作成

1
2
3
> pwd
/home/mura/vuls
> vi config.toml

EC2インスタンスを登録
このサーバは以前から稼働しているハニーポットサーバ

1
2
3
4
5
6
7
[servers]

[servers.honey-server]
host        = "13.114.xxx.xxx"
port        = "22"
user        = "ec2-user"
keyPath     = "/root/.ssh/honey-server-key.pem" # path to ssh private key in docker

後々、レポートのために必要な設定も入れたconfig.toml全文

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[cveDict]
type = "sqlite3"
path = "$PWD/cve.sqlite3"

[ovalDict]
type = "sqlite3"
path = "$PWD/oval.sqlite3"

[gost]
type = "sqlite3"
path = "$PWD/gost.sqlite3"

[exploit]
type = "sqlite3"
path = "$PWD/go-exploitdb.sqlite3"


[servers]

[servers.honey-server]
host        = "13.114.xxx.xxx"
port        = "22"
user        = "ec2-user"
keyPath     = "/root/.ssh/honey-server-key.pem" # path to ssh private key in docker
接続テストコマンド

EC2インスタンスへSSH接続用のpemknown_hostsをdockerに渡す必要があるため、
ホスト端末の/home/mura/vuls/ssh配下に保存しているため、コンテナにマウントする

1
2
3
4
5
6
docker run --rm -it\
    -v $PWD/ssh:/root/.ssh:ro \
    -v $PWD:/vuls \
    -v $PWD/vuls-log:/var/log/vuls \
    vuls/vuls configtest \
    -config=./config.toml # path to config.toml in docker

ハマったところ

know_hostsの問題

エラーメッセージ

接続テストコマンドでコンテナからEC2インスタンスへSSH接続できなかった

execResult: servername: honey-server
      cmd: /usr/bin/ssh -tt -o StrictHostKeyChecking=yes -o LogLevel=quiet -o ConnectionAttempts=3 -o ConnectTimeout=10 -o ControlMaster=auto -o ControlPath=/root/.vuls/controlmaster-%r-honey-server.%p -o Controlpersist=10m ec2-user@13.114.xxx/xxx -p 22 -i /root/.ssh/honey-server-key.pem -o PasswordAuthentication=no stty cols 1000; ls /etc/debian_version

コンテナからEC2インスタンスへ初めて接続するため、yesを入力しないといけない状況になっている

Are you sure you want to continue connecting (yes/no)?

当初、~/.sshをdockerにマウントしていたが、pemは読んでくれるけど、
known_hostsは読んでくれないことが分かった
アクセス権の問題でもないし…と1時間の試行錯誤の結果
.pemknown_hostsを別のディレクトリにコピーして、dockerへマウントすれば
known_hostsも認識することがわかった(理由はわかっていない…)
このままでは休日が終わってしまうため、Vulsにマウントするものは全てVulsディレクトリ内に保存する方針にした

最終的な対応

ホストで一度対象のEC2インスタンスへ接続し、known_hostsを記録する
.pemknown_hostsを別のディレクトリにコピーしマウントする

ディレクトリ構造

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
> tree /home/mura/vuls/
/home/mura/vuls/
├── config.toml
├── cve.sqlite3
├── db [error opening dir]
├── go-cve-dictionary-log
│   └── cve-dictionary.log
├── go-exploitdb-log
│   └── go-exploitdb.log
├── go-exploitdb.sqlite3
├── gost-log
│   └── gost.log
├── gost.sqlite3
├── goval-dictionary-log
│   └── goval-dictionary.log
├── oval.sqlite3
├── results [error opening dir]
├── ssh
│   ├── honey-server-key.pem
│   ├── known_hosts
│   ├── ssh
│   └── vuls-log
│       └── localhost.log
├── vuln-list [error opening dir]
└── vuls-log
    ├── cve-dictionary.log
    ├── honey-server.log
    └── localhost.log
   └── localhost.log

脆弱性スキャン

カレントディレクトリ指定なので実行時はパスに注意

1
2
3
4
5
6
7
8
docker run --rm -it \
    -v $PWD/ssh:/root/.ssh:ro \
    -v $PWD:/vuls \
    -v $PWD/vuls-log:/var/log/vuls \
    -v /etc/localtime:/etc/localtime:ro \
    -e "TZ=Asia/Tokyo" \
    vuls/vuls scan \
    -config=./config.toml # path to config.toml in docker

レポート

WEB-UI

http://localhost:5111にアクセスしてレポートを見ることができる

1
2
3
4
docker run -dt \
    -v $PWD:/vuls \
    -p 5111:5111 \
    vuls/vulsrepo

22個の脆弱性とリブートが要求されることがわかる
1ヶ月前にインスタンス建ててそのまま、脆弱性スキャンしたかったから

TUI

ターミナルからレポートを見ることができる

1
2
3
4
5
6
7
docker run --rm -it \
    -v $PWD/ssh:/root/.ssh:ro \
    -v $PWD:/vuls \
    -v $PWD/vuls-log:/var/log/vuls \
    -v /etc/localtime:/etc/localtime:ro \
    vuls/vuls tui \
    -config=./config.toml # path to config.toml in docker

確認対象が1台なのでTUIでも問題なさげ
量が多いとWEB-UIの方が使い勝手が良さそうな感じ

感想

こういうのは単発では意味がないので定期実行しよう
後、自端末のUbuntuもコンテナからスキャンかけたいところ
そこまで続けたかったけど長くなったので今回はここまで

参考

https://qiita.com/ohhara_shiojiri/items/a1157472446b9847b863