はじめまして、1月からCOLSISでエンジニアをやっている横山です。
これからよろしくお願いいたします!
自己紹介
独立系SIer企業で8年半システムエンジニアを経験した後、1年間フリーランスエンジニアをやっていました。これまでは主に、WindowsForm(C#.Net)製の基幹システム開発をしていました(基本的にお客様社内イントラ)。
他にはJavaやPHPを扱っていましたが、インフラ構築の経験があまりなかったので、COLSISでインフラからアプリまで、幅広くチャレンジしていきたいと思います!(3月に長女が産まれ、一児の父になりました!)
AWS EC2にVulsを導入する
今回は、サーバの脆弱性情報を自動調査、検知する「Vuls(Vulnerability Scanner)」の導入手順を紹介します。
Vulsとは?
- システムに関係ある脆弱性のみ教えてくれる
- その脆弱性に該当するサーバを教えてくれる
- 自動スキャンのため脆弱性検知の漏れを防ぐことができる
- CRONなどで定期実行、レポートすることで脆弱性の放置を防ぐことできる
対象サーバのパッケージに含まれる脆弱性情報をレポート出力するツールです。リモートサーバにSSH接続(鍵認証)して取得したパッケージ情報と、NVD/JVNなどの脆弱性情報データベースを突合することで、脆弱性を含むパッケージを一覧化します。
※SSH接続でyumのセキュリティアップデート情報などを取得するのみのため、非破壊的
また、後述する「VulsRepo」でレポートをブラウザ上で一覧表示できたりします。
VulsをAWS EC2にインストールする
Vuls起動用のEC2インスタンスを用意して、Vulsを導入していきます。
golangのインストール
golangのインストール、環境変数設定
$ sudo yum install golang
$ vim ~/.bash_profile
# GO PATHを追加
export GOPATH=/usr/local/go
export PATH=$PATH:$GOPATH/bin
source ~/.bash_profile
Vulsインストール
脆弱性情報DBの取得(NVD/JVN)
$ cd $GOPATH
$ go get github.com/kotakanbe/go-cve-dictionary
$ for i in {2017..2018}; do go-cve-dictionary fetchnvd -years $i; done
$ for i in {2017..2018}; do go-cve-dictionary fetchjvn -years $i; done
※CVE情報取得は、初回は10〜20分くらいかかります
Vulsインストール
$ mkdir -p $GOPATH/src/github.com/future-architect/
$ cd $GOPATH/src/github.com/future-architect/
$ git clone https://github.com/future-architect/vuls.git
$ cd vuls
$ make install
スキャン対象リモートサーバ情報設定
config.tomlファイルを作成して、脆弱性スキャン対象サーバ情報を設定します。
$ vim $GOPATH/config.toml
[servers]
[servers.vuls]
host = "localhost"
port = "local"
[servers.XXX-XXX-XXX-XXX]
host = "XXX.XXX.XXX.XXX"
port = "22"
user = "VulsサーバからSSH接続するユーザー"
keyPath = "SSH接続用秘密鍵のPATH"
Vulsのコンフィグテスト
$ vuls configtest
Vulsスキャンを実行してレポートを出力する
Vulsスキャン
$ vuls scan
レポート出力
$ vuls report -format-json
※今回はjson形式でレポート出力しています。他のオプションについては下記公式チュートリアル参照
https://vuls.io/docs/ja/usage-report.html
VulsRepoインストール
VulsRepo(https://github.com/usiusi360/vulsrepo)をインストールして、レポートをブラウザ上で一覧表示します。
VulsRepoインストール
$ mkdir -p $GOPATH/src/github.com/usiusi360/
$ cd $GOPATH/src/github.com/usiusi360/
$ git clone https://github.com/usiusi360/vulsrepo.git
VulsRepo Config設定
$ vim vulsrepo-config.toml
[Server]
rootPath = "/usr/local/go/src/github.com/usiusi360/vulsrepo"
resultsPath = "/usr/local/go/results"
serverPort = "5111"
VulsRepo起動
$ $GOPATH/src/github.com/usiusi360/vulsrepo/server/vulsrepo-server
対象サーバ内パッケージに含まれる脆弱性情報を、CVE識別番号(CVE-ID)毎に列挙したりできます。行/列に表示するアイテムを変更することで表示をカスタマイズしたり、グラフを表示したりもできるので、公式サイト(GitHub)のオンラインデモhttp://usiusi360.github.io/vulsrepo/を試してみることをオススメします。
ちなみに、サーバ内に脆弱性パッケージが存在しない場合は、このように"healthy"と表示されます。
まとめ
サーバの脆弱性情報を日々監視するのは大変ですが、Vulsで自動スキャンすることでどのサーバがどれだけ脆弱性があるのか一目でわかるのは便利だと思いました。
なお、Vulsサーバには対象リモートサーバにSSH接続するための秘密鍵を置いておく必要があるため、VulsサーバにIP制限(EC2セキュリティグループ設定など)をかける等セキュリティ対策を行うとよいです。
執筆者
