1. Qiita
  2. 投稿
  3. vuls

あなたのサーバは本当に安全ですか?今もっともイケてる脆弱性検知ツールVulsを使ってみた

  • 1894
    いいね
  • 3
    コメント

はじめに

サーバ管理をしている身としては、 セキュリティ は常に付きまとう悪魔みたいなもので、このセキュリティに関しては何をどこまで頑張ればいいのか不透明な部分が多い。

脆弱性に関しては、CVEなど、毎日情報は入ってくるが、それがどのサーバの何に関連したものなのかなんていちいち調べてられないし、どの脆弱性がすぐに対応しなければいけないもので、どの脆弱性があとあと対応すればいいものなのかなんてわからない。

実際のところ、大きな話題になった脆弱性くらいしか緊急で対応してないという人は多いのではないかと思う。

そんな中、満を持して登場したのが vuls !!

各サーバの脆弱性情報を取得して、個々のサーバそれぞれでどんな脆弱性があり、どのくらいやばい脆弱性なのかを検知できるようになった!

今回はこのvulsを紹介します。

Vulsとは

VULS-logo.png

公式でロゴが発表されたので、差し替えました

Github: vuls
日本語のREADME: vuls japanese

Vulsはgolang製の脆弱性検知ツールです。
VulsはVULnerability Scannerの略です。
「バルス!」って聞くとラピュタを思い出すのは私だけではないはず。

vulsのいいところ

  • Golangで作られているので、バイナリ化すればどのサーバにも配布できる(しかし公式はバイナリ提供していないので自分でコンパイルする必要あり)
  • 脆弱性検知結果をslackやメールで送信できる。なおTUI(Text User Interface)で見ることも可能
  • エージェントレス。設定ファイル1つというシンプルな構成
  • スターが3151付いてる(2016/10/09時点)
  • 開発者が日本の人
  • Githubスターが開発のモチベーションらしいです。
  • vuls公式slackで気軽に質問できる(日本語でもOK)

ざくっとどんな感じ?

こんな感じ

スクリーンショット 2016-04-30 3.31.13.png

  1. go-cve-dictionaryを使って、CVE情報を取得する。
  2. 取得したCVE情報をSQLiteに保存する
  3. vulsで対象サーバをスキャンして情報を取得する
  4. 取得したサーバ情報とCVE情報を照合する。
  5. 発見した脆弱性情報をSQLiteに保存する
  6. 脆弱性情報をSlackまたはメールで通知する
  7. SQLiteに保存した脆弱性情報をTUIで可視化する

さらに詳細な図がみたい人はGithubへ。

実際に使ってみる

公式のREADMEがとても親切なので、それ通りに進めていけば特に問題ない。

実行環境情報

  • vulsホスト情報
OS OSX El Capitan
Version 10.11.4
  • 脆弱性スキャン対象サーバ
OS amazon linux
Version 2015.03.1.x86_64-gp2

環境準備

  • ログディレクトリ作成
console
$ sudo mkdir /var/log/vuls
$ sudo chown YOUR_USER /var/log/vuls
$ sudo chmod 700 /var/log/vuls
  • vuls用の作業ディレクトリ作成
console
$ mkdir vuls
$ cd vuls
  • Golangのインストール

説明省略

公式ダウンロードページ

初期設定

  • go-cve-directionaryのセットアップ

  • CVE情報の取得と保存

console
$ for i in {2002..2016}; do go-cve-dictionary fetchnvd -years $i; done

こちらも20分弱かかった。
こちらもこれだけの量を一度に持ってくるのは最初の1回だけなので特に問題ない

  • go-cve-dictionaryサーバを起動

$ go-cve-dictionary server

※最新のvulsでは、go-cve-dictionaryのサーバを起動しなくてよくなった!

  • CVE情報の確認
console
$ ls 

cve.sqlite3
  • サーバの起動
    bash:console
    $ go-cve-dictionary server

  • CVEデータ確認

console
$ curl http://127.0.0.1:1323/cves/CVE-2014-0160 | jq "."

{
  "ID": 61484,
  "CreatedAt": "2016-04-29T12:18:18.205522249+09:00",
  "UpdatedAt": "2016-04-29T12:18:18.205522249+09:00",
  "DeletedAt": null,
  "CveInfoID": 0,
  "CveID": "CVE-2014-0160",
  "Nvd": {
    "ID": 61484,
    "CreatedAt": "2016-04-29T12:18:18.205605186+09:00",
    "UpdatedAt": "2016-04-29T12:18:18.205605186+09:00",
    "DeletedAt": null,
    "CveDetailID": 61484,
    "Summary": "The (1) TLS and (2) DTLS implementations in OpenSSL 1.0.1 before 1.0.1g do not properly handle Heartbeat Extension packets, which allows remote attackers to obtain sensitive information from process memory via crafted packets that trigger a buffer over-read, as demonstrated by reading private keys, related to d1_both.c and t1_lib.c, aka the Heartbleed bug.",
    "Score": 5,
    "AccessVector": "NETWORK",
    "AccessComplexity": "LOW",
    "Authentication": "NONE",
    "ConfidentialityImpact": "PARTIAL",
    "IntegrityImpact": "NONE",
    "AvailabilityImpact": "NONE",
    "Cpes": null,
    "References": [
      {
        "ID": 319866,
        "CreatedAt": "2016-04-29T12:18:18.20675359+09:00",
        "UpdatedAt": "2016-04-29T12:18:18.20675359+09:00",
        "DeletedAt": null,
        "JvnID": 0,
        "NvdID": 61484,
        "Source": "CERT",
        "Link": "http://www.us-cert.gov/ncas/alerts/TA14-098A"
      },
      {
        "ID": 319867,
        "CreatedAt": "2016-04-29T12:18:18.206821732+09:00",
        "UpdatedAt": "2016-04-29T12:18:18.206821732+09:00",
        "DeletedAt": null,
        "JvnID": 0,
        "NvdID": 61484,
        "Source": "CERT-VN",
        "Link": "http://www.kb.cert.org/vuls/id/720951"
      },

たくさんはいってる!

Vuls実行

config.toml
[servers]
[servers.54-199-160-38]
host         = "54.199.160.38"
port        = "22"
user        = "ec2-user"
keyPath     = "/Users/matsunosadayuki/.ssh/vuls-dev.pem"
  • prepare
console
$ vuls prepare

INFO[0000] Start Preparing (config: /Users/matsunosadayuki/vuls/config.toml)
[Apr 29 13:32:45]  INFO [localhost] Detecting OS...
[Apr 29 13:32:46]  INFO [localhost] (1/1) Successfully detected. 54-199-160-38: amazon 2015.03
[Apr 29 13:32:46]  INFO [localhost] Installing...
[Apr 29 13:32:46]  INFO [54-199-160-38:22] Nothing to do
[Apr 29 13:32:46]  INFO [localhost] Success
  • scan (cve-dictionaryのデータを指定する)
console
$ vuls scan --cve-dictionary-dbpath=/Users/matsunosadayuki/vuls/cve.sqlite3 -report-json

CVE-2015-5195
-------------
Score           8
NVD             https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2015-5195
CVE Details     http://www.cvedetails.com/cve/CVE-2015-5195
RHEL-CVE        https://access.redhat.com/security/cve/CVE-2015-5195
ALAS-2015-593   https://alas.aws.amazon.com/ALAS-2015-593.html

CVE-2015-5146
-------------
Score           7
NVD             https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2015-5146
CVE Details     http://www.cvedetails.com/cve/CVE-2015-5146
RHEL-CVE        https://access.redhat.com/security/cve/CVE-2015-5146
ALAS-2015-593   https://alas.aws.amazon.com/ALAS-2015-593.html

合計143個検知された
Scoreは脆弱性のレベル

  • 脆弱性情報確認
console
$ ls 

config.toml cve.sqlite3 results

results以下にscan結果のjsonファイルが保存されている

  • tui
console
$ vuls tui

スクリーンショット 2016-04-29 14.12.26.png

おお!表現しようのない爽快感!全てのCVEが見れる!
Ctrl押しながらhjklで移動もできる!!
※ただしkeybindが他のものとかぶっていない時に限る

対象サーバのyum updateを実行

  • 手動update

実際にupdateしてみて、どれだけ脆弱性が消えるのか確認してみた。

console
$ ssh ec2-user@52.199.160.38
$ sudo yum update

Vulsで再スキャン

  • scan
console
INFO[0000] Start scanning (config: /Users/matsunosadayuki/vuls/config.toml)
[Apr 29 14:22:49]  INFO [localhost] Validating Config...
[Apr 29 14:22:49]  INFO [localhost] Detecting the type of OS...
[Apr 29 14:22:50]  INFO [localhost] (1/1) Successfully detected. 54-199-160-38: amazon 2016.03
[Apr 29 14:22:50]  INFO [localhost] Scanning vulnerabilities...
[Apr 29 14:22:50]  INFO [localhost] Check required packages for scanning...
[Apr 29 14:22:50]  INFO [localhost] Scanning vulnerable OS packages...
[Apr 29 14:22:55]  INFO [54-199-160-38:22] Fetching CVE details...
[Apr 29 14:22:55]  INFO [54-199-160-38:22] Done
[Apr 29 14:22:55]  INFO [localhost] Scanning vulnerable software specified in the CPE...
[Apr 29 14:22:55]  INFO [localhost] Reporting...

54-199-160-38 (amazon 2016.03)
==============================
No unsecure packages.

おお!!No unsecure packages.ってなってる!
これは便利

さいごに

Vulsはシンプルでかつ、とても有用なツールです。
これを使うことで、どのサーバがどの脆弱性を持っていて、なおかつそれがどれほどのレベルのものなのかが把握できます。
一度動かしてみればそのシンプルさ、簡単さがわかると思います。

是非この機会に、脆弱性スキャンしてみませんか?

追記

Vulsが稼働中のDockerの脆弱性検知にも対応しました!
詳細は、以下の記事をご覧ください!
進化するVuls!稼働中のDockerコンテナの脆弱性を検知する

Changelog

  • 2016/07/01
    • scan時にgo-cve-dictionaryのデータをを引数に指定
  • 2016/07/19
    • Githubスター数更新
  • 2016/10/09
    • Githubスター数更新