びぼうろぐ

ネ申エクセルからの卒業

【CentOS8】VulsをCentOS8上に構築する

Vuls公式のInstall Manually on CentOSをなぞってオンプレ環境に構築してみましたので、やり方をメモっておきます。

Vulsとは

公式トップページ

Vuls is open-source, agent-less vulnerability scanner based on information from NVD, OVAL, etc.

Abstract

Vulsは上に挙げた手動運用での課題を解決するツールであり、以下の特徴がある。 - システムに関係ある脆弱性のみ教えてくれる - その脆弱性に該当するサーバを教えてくれる - 自動スキャンのため脆弱性検知の漏れを防ぐことができる - CRONなどで定期実行、レポートすることで脆弱性の放置を防ぐことできる

要は脆弱性の把握に超効果的なツールですね。
※あくまでも"把握"するためのツールであり、パッチ適用する・しないは自分たちで判断する必要があります。

環境情報

  • OS: CentOS8(1905)
    • Minimalインストール
  • 構成要素:
    • golang: 1.13.5
    • vuls: v0.9.1 build-20191218_114821_c17b415
    • go-cve-dictionary: v0.4.1 4a02438
    • go-cpe-dictionary: fae869d
    • goval-dictionary: v0.2.4 85c5c09
    • go-exploitdb: ???
    • gost: 76d68fe
    • vulsrepo: ???

※ヘルプにはgo-exploitdb -vでバージョン確認できるそうですが、出力されませんでした。
※vulsrepoのバージョンってどう確認するんだ...?

構築手順

CentOS8をMinimalインストールし、インターネット接続可能な状態にセットアップします。

OS最新化

$ sudo yum update -y
$ sudo reboot

NTPクライアントの設定

$ sudo yum install -y chrony
$ sudo systemctl enable chronyd && sudo systemctl restart chronyd
$ chronyc sources

Vulsに必要なライブラリのインストール

$ sudo yum install -y sqlite git gcc make wget tar dnf-utils

golangのインストール・Path設定

$ wget https://dl.google.com/go/go1.13.5.linux-amd64.tar.gz
$ sudo tar -C /usr/local -xzf go1.13.5.linux-amd64.tar.gz
$ mkdir $HOME/go
$ cat << 'EOF' | sudo tee -a /etc/profile.d/goenv.sh
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
EOF
$ source /etc/profile.d/goenv.sh

ディレクトリの事前作成・設定

$ sudo mkdir /var/log/{vuls,go-exploitdb,gost}
$ sudo chown "$(id -u):$(id -g)" /var/log/{vuls,go-exploitdb,gost}
$ sudo chmod 700 /var/log/{vuls,go-exploitdb,gost}

$ mkdir -p $GOPATH/src/github.com/{kotakanbe,knqyf263,mozqnet,future-architect}

go-cve-dictionary の展開

「go-cve-dictionary」はNVDやJVNから脆弱性情報を取得・管理するツールです。

$ cd $GOPATH/src/github.com/kotakanbe/
$ git clone https://github.com/kotakanbe/go-cve-dictionary.git
$ cd go-cve-dictionary
$ make install 

CVE の取得

現時点までのCVEを取得します。
※それぞれ完了まで10分程度時間がかかります。

$ cd $HOME
$ for i in `seq 2002 $(date +"%Y")`; do go-cve-dictionary fetchnvd -years $i; done
$ for i in `seq 1998 $(date +"%Y")`; do go-cve-dictionary fetchjvn -years $i; done

CVEとは

共通脆弱性識別子CVE概説

共通脆弱性識別子CVE(Common Vulnerabilities and Exposures)は、個別製品中の脆弱性を対象として、米国政府の支援を受けた非営利団体のMITRE社が採番している識別子です。脆弱性検査ツールや脆弱性対策情報提供サービスの多くがCVEを利用しています。 個別製品中の脆弱性に一意の識別番号「CVE識別番号(CVE-ID)」を付与することにより、組織Aの発行する脆弱性対策情報と、組織Xの発行する脆弱性対策情報とが同じ脆弱性に関する対策情報であることを判断したり、対策情報同士の相互参照や関連付けに利用したりできます。

goval-dictionary の展開

「goval-dictionary」はOVAL情報を取得・管理するツールです。

$ cd $GOPATH/src/github.com/kotakanbe
$ git clone https://github.com/kotakanbe/goval-dictionary.git
$ cd goval-dictionary
$ make install
$ ln -s $GOPATH/src/github.com/kotakanbe/goval-dictionary/oval.sqlite3 $HOME/oval.sqlite3

OVALの取得

環境に合わせて必要なOVALを取得しましょう。

$ goval-dictionary fetch-redhat 7 8
$ goval-dictionary fetch-oracle

OVALとは

セキュリティ検査言語OVAL概説

セキュリティ検査言語OVAL(Open Vulnerability and Assessment Language)は、コンピュータのセキュリティ設定状況を検査するための仕様です。 OVALを用いると、脆弱性対策のための確認作業の自動化により管理工数の低減ができるようになります。また、文書という脆弱性対策情報と手作業による確認作業で発生しうる漏れを防ぐことができ、情報システムの資産管理への適用など、情報システムの全般の管理にも役立てることができます。

go-cpe-dictionary の展開

$ cd $GOPATH/src/github.com/kotakanbe
$ git clone https://github.com/kotakanbe/go-cpe-dictionary.git
$ cd go-cpe-dictionary
$ make install

CPE の取得

$ go-cpe-dictionary fetchnvd

CPE とは

共通プラットフォーム一覧CPE概説

gost の展開

「gost」はRedHat等から公開された脆弱性情報を取得するツールです。

$ cd $GOPATH/src/github.com/knqyf263
$ git clone https://github.com/knqyf263/gost.git
$ cd gost
$ make install
$ ln -s $GOPATH/src/github.com/knqyf263/gost/gost.sqlite3 $HOME/gost.sqlite3

ディストリビューションごとのセキュリティ情報の収集

$ gost fetch redhat

※やはり時間がかかるので、期間を絞って取得した方がよさそうです。

go-exploitdb の展開

go-exploitdb は検出されたCVEに関する実証コードを管理するためのツールです。

$ cd $GOPATH/src/github.com/mozqnet
$ git clone https://github.com/mozqnet/go-exploitdb.git
$ cd go-exploitdb
$ make install
$ ln -s $GOPATH/src/github.com/mozqnet/go-exploitdb/go-exploitdb.sqlite3 $HOME/go-exploitdb.sqlite3

攻撃コード情報の取得

$ go-exploitdb fetch exploitdb

vuls の展開

$ cd $GOPATH/src/github.com/future-architect
$ git clone https://github.com/future-architect/vuls.git
$ cd vuls
$ make install

設定ファイルの作成

$ cd $HOME
$ cat << EOF | tee config.toml
[servers]

[servers.localhost]
host = "localhost"
port = "local"
EOF

動作確認・スキャン実行・レポート出力

$ vuls configtest
$ vuls scan
$ vuls report -format-json

vulsrepo の展開・サービス化

$ cd $HOME
$ git clone https://github.com/usiusi360/vulsrepo.git

$ cat << EOF | tee -a ~/vulsrepo/server/vulsrepo-config.toml
[Server]
rootPath = "$HOME/vulsrepo"
resultsPath  = "$HOME/results"
serverPort  = "5111"
EOF

$ cat << EOF | sudo tee -a /etc/systemd/system/vulsrepo.service
[Unit]
Description=vulsrepo daemon
Documentation=https://github.com/usiusi360/vulsrepo

[Service]
ExecStart = $HOME/vulsrepo/server/vulsrepo-server
ExecRestart = /bin/kill -WINCH ${MAINPID} ; $HOME/vulsrepo/server/vulsrepo-server
ExecStop = /bin/kill -WINCH ${MAINPID}
Restart = no
Type = simple
User = $USER
Group = $USER

[Install]
WantedBy = multi-user.target
EOF

$ sudo systemctl enable vulsrepo && sudo systemctl start vulsrepo

vulsrepo用のポート開放

$ sudo firewall-cmd --add-port=5111/tcp --permanent
$ sudo firewall-cmd --reload

http://[IPAddress]:5111にアクセスするとvulsrepoおよびvulsの動いているサーバの脆弱性情報が確認できます!