LoginSignup
1
1

More than 5 years have passed since last update.

VULS

Last updated at Posted at 2018-11-01

概要

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をインストールしなければならないようです。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1