概要
自端末の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
でカレントディレクトリをパスに使用するため
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接続用のpem
とknown_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時間の試行錯誤の結果
.pem
とknown_hosts
を別のディレクトリにコピーして、dockerへマウントすれば
known_hosts
も認識することがわかった(理由はわかっていない…)
このままでは休日が終わってしまうため、Vulsにマウントするものは全てVulsディレクトリ内に保存する方針にした
最終的な対応
ホストで一度対象のEC2インスタンスへ接続し、known_hosts
を記録する
.pem
とknown_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