概要
vulsの利用方法を調査
Vulsのドキュメント
Dockerを使ってScanを実行
とりあえずドキュメントにしたがって実行してみます。
ログディレクトリの作成
$ cd /path/to/working/dir
$ mkdir go-cve-dictionary-log goval-dictionary-log gost-log
NVDのダウンロード
これがめちゃめちゃ時間かかります。データは永続化しておかないといけないですね。
ちなみにNVDとはNational Vulnerability Databaseの略。
$ for i in `seq 2002 $(date +"%Y")`; do \
docker run --rm -it \
-v $PWD:/vuls \
-v $PWD/go-cve-dictionary-log:/var/log/vuls \
vuls/go-cve-dictionary fetchnvd -years $i; \
done
INFO[10-25|02:47:38] Fetching... https://nvd.nist.gov/feeds/json/cve/1.0/nvdcve-1.0-2013.meta
INFO[10-25|02:47:38] Fetching... https://nvd.nist.gov/feeds/json/cve/1.0/nvdcve-1.0-modified.meta
INFO[10-25|02:47:38] Fetching... https://nvd.nist.gov/feeds/json/cve/1.0/nvdcve-1.0-recent.meta
INFO[10-25|02:47:39] Fetched... https://nvd.nist.gov/feeds/json/cve/1.0/nvdcve-1.0-2013.meta
INFO[10-25|02:47:39] Fetched... https://nvd.nist.gov/feeds/json/cve/1.0/nvdcve-1.0-modified.meta
INFO[10-25|02:47:39] Fetched... https://nvd.nist.gov/feeds/json/cve/1.0/nvdcve-1.0-recent.meta
INFO[10-25|02:47:39] Newly: https://nvd.nist.gov/feeds/json/cve/1.0/nvdcve-1.0-2013.json.gz
INFO[10-25|02:47:39] Up to date: https://nvd.nist.gov/feeds/json/cve/1.0/nvdcve-1.0-modified.json.gz
INFO[10-25|02:47:39] Up to date: https://nvd.nist.gov/feeds/json/cve/1.0/nvdcve-1.0-recent.json.gz
INFO[10-25|02:47:39] Fetching... https://nvd.nist.gov/feeds/json/cve/1.0/nvdcve-1.0-2013.json.gz
INFO[10-25|02:47:42] Fetched... https://nvd.nist.gov/feeds/json/cve/1.0/nvdcve-1.0-2013.json.gz
INFO[10-25|02:47:50] Fetched 6156 CVEs
INFO[10-25|02:47:50] Inserting NVD into DB (sqlite3).
INFO[10-25|02:47:50] Inserting fetched CVEs...
1743 / 6156 [-------------------->_____________________________________________________] 28.31% 5 p/s
OVALのダウンロード
OVALとはOpen Vulnerability and Assessment Languageの略
$ docker run --rm -it \
-v $PWD:/vuls \
-v $PWD/goval-dictionary-log:/var/log/vuls \
vuls/goval-dictionary fetch-amazon
SCAN実行!
$ docker run --rm -it \
-v ~/.ssh:/root/.ssh:ro \
-v $PWD:/vuls \
-v $PWD/vuls-log:/var/log/vuls \
vuls/vuls scan \
-config=./config.toml # path to config.toml in docker
One Line Summary
================
[Reboot Required] my2 amazon2 450 installed, 17 updatable
docker containerをSCAN
[servers]
[servers.172-31-4-82]
host = "172.31.4.82"
user = "ec2-user"
keyPath = "/home/username/.ssh/id_rsa"
containerType = "docker"
containersIncluded = ["${running}"]
[servers.172-31-4-82.containers.dockerA]
cpeNames = [
"cpe:/a:rubyonrails:ruby_on_rails:4.2.1",
"cpe:2.3:a:postgresql:postgresql:9.6.2:*:*:*:*:*:*:*",
]
これで実行すると、コンテナ内も検査してくれます。
cpeNamesはreport実行時に処理されるみたいです。NVDとcpeNameを結びつけてくれる機能のようなもの?別に書かなくてもいいかもしれません。
https://qiita.com/hogehogehugahuga/items/1c1dedea99e63b616a2a
データ保存先をmysqlへ変更
docker-compose.ymlの作成
そろそろパラメータの指定が面倒になってきたので、docker-composeを利用します。
version: '3'
services:
vuls:
image: vuls/vuls
volumes:
- ~/.ssh:/root/.ssh:ro
- ./:/vuls
- ./vuls-log:/var/log/vuls
depends_on:
- db
cve:
image: vuls/go-cve-dictionary
volumes:
- ./:/vuls
- ./vuls-log:/var/log/vuls
depends_on:
- db
oval:
image: vuls/goval-dictionary
volumes:
- ./:/vuls
- ./vuls-log:/var/log/vuls
depends_on:
- db
db: # mysql Database
image: mysql
command: --default-authentication-plugin=mysql_native_password
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: cve
volumes:
- ./data:/var/lib/mysql
NVDダウンロード
$ for i in `seq 2002 $(date +"%Y")`; do docker-compose run --rm cve fetchnvd -dbtype=mysql -dbpath="root:password@tcp(db:3306)/cve?parseTime=true" -years $i; done
OVALダウンロード
$ docker-compose run --rm vuls/goval-dictionary fetch-amazon -dbtype=mysql -dbpath="root:password@tcp(db:3306)/cve?parseTime=true"
config.toml
[cveDict]
type = "mysql"
url = "root:password@tcp(db:3306)/cve?parseTime=true"
[ovalDict]
type = "mysql"
url = "root:password@tcp(db:3306)/oval?parseTime=true"
感想
検査するサーバにアクセスできるSSH Keyが必要なので、ECSでの実行はめんどくさそうです。Gitにそんな秘密鍵登録したくないですし。。。
EC2常でdocker-composeを使って実行するのが良さそうです。
その場合、DBもsqliteで十分かもしれないです。
問題
踏み台経由&ssh keyにパスワードをつけているとスキャンできない。
以下の状態だとスキャンできないです。原因はわかりませんが。。
- 踏み台を経由してスキャン対象にアクセスする。
- ssh keyにパスワードをつけている。
known_hostsが必要
known_hostsに登録されていないとスキャンできないみたいです。オートスケールでEC2が増えるたびに、スキャンを実行するインスタンスからsshで繋いでknown_hostsに追加してあげることになりそうです。(.ssh/configファイルにStrictHostKeyChecking no
を設定してもダメでした。)
$HOME/.ssh/known_hosts にリモートホストのHost Keyを追加するために、スキャン前にリモートホストにSSH接続する必要がある。
検査対象にyum-utilsが必要
packageをrepoqueryで探しているらしく、yum-utilsがインストールされていないとスキャンできません。
そしてamazon linuxにはyum-utilsが入っていません。
$ sudo yum install yum-utils
サーバセットアップ時にyum-utilsをインストールしなければならないようです。