Dockerでvulsを使った時の備忘録

Vulsとは

Linuxのパッケージ情報をスキャンするためのソフトウェアで,VULnerability Scannerの略称.

ソフトウェアの脆弱性は日々発見されており,サーバー管理者はその情報を追従して,対策を実施する必要がある。脆弱性の対応を行うには,一般的には下記のような運用を行う必要がある.

  1. 運用管理しているサーバにインストールされているソフトウェアの情報を把握しておく.
  2. 公開されている脆弱性データベース等を参照し,ソフトウェアの脆弱性情報を入手する.
  3. 脆弱性情報を入手した時,運用管理しているサーバに影響があるかどうかを調べる.
  4. 影響がありそうな場合,その対策を検討する.

Vulsはこの中の1~3を自動化するためのツールである.Vuls単体ではプログラム自体の脆弱性テストはできません.

Vulsの機能

Vulsの機能は大きく分けて以下の3つです.これらを定期的に行うことでサーバーの安全性を担保します. レポーティングも自動化することで効率的に使えると思います.

  1. 脆弱性データベースの入手
  2. 脆弱性診断
  3. レポーティング

Vulsを使う

Dockerインストール

(ホストでのビルドバトルに失敗したため[Goでビルドに失敗した際の知見がなくてdockerにて実行])

apt-get install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
apt-get update
apt-get install docker-ce

Dockerの動作確認

docker run --rm hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

任意な作業ディレクトリを構築

cd ~
mkdir vuls;cd vuls

How to use

  1. NVDを取得する (vuls/go-cve-dictionary)
  2. OVALを取得する (vuls/goval-dictionary)
  3. 設定を行う (vuls/vuls)
  4. 設定のテストを実施 (vuls/vuls)
  5. 脆弱性のチェックを行います (vuls/vuls)
  6. レポートを作成します(vuls/vulsrepo)

1.NVDを取得する

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

2.OVALを取得する

docker run --rm -it \
    -v $PWD:/vuls \
    -v $PWD/goval-dictionary-log:/var/log/vuls \
    vuls/goval-dictionary fetch-redhat 5 6 7

3.設定を行う

GitHub - future-architect/vuls: Vulnerability scanner for Linux/FreeBSD, agentless, written in Go

vim config.toml
[servers]

[servers.0001]
host         = "192.168.0.1"
port        = "22"
user        = "root"
keyPath     = "/root/.ssh/id_rsa" 

[servers.0002]
host         = "192.168.0.2"
port        = "22"
user        = "root"
keyPath     = "/root/.ssh/id_rsa" 

4.設定ファイルのテスト

docker run --rm -it\
    -v ~/.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

5.脆弱性のチェックを行います

docker run --rm -it \
    -v ~/.ssh:/root/.ssh:ro \
    -v $PWD:/vuls \
    -v $PWD/vuls-log:/var/log/vuls \
    -v /etc/localtime:/etc/localtime:ro \
    vuls/vuls report \
    -cvedb-path=/vuls/cve.sqlite3 \
    -ovaldb-path=/vuls/oval.sqlite3 \
    -format-short-text \
    -config=./config.toml

6.レポートを作成します

docker run -dt \
    -v $PWD:/vuls \
    -p 5111:5111 \
    vuls/vulsrepo

レポートの確認

resultに詳細情報が入っていますので注意して刮目せよ

# ls vuls-log/
0001  0002  result

最後に

Slackへの通知を含めて自動化がかなり進んでいるので長く使っていくシステムでは便利に使える機会が多いと思います. これらの処理を任意のスクリプトに落としこんで週に1回実施するcronでも回せば幸せになれそうです.