去年、実家でCoreOSサーバにdocker入れて遊んでいたのですが
完全に放置気味だったので、(以下ブログより)
今回はVuls Dockerを入れてこのブログ(blog.adachin.me)を定期的にスキャンしてみました。
■vuls/vuls Docker Hub
https://hub.docker.com/r/vuls/vuls/
https://github.com/future-architect/vuls/tree/master/setup/docker
Dockerなのでpullしてrunして終わりなので楽ちん。
■Pull new vuls docker images
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
・go-cve-dictionary # docker pull vuls/go-cve-dictionary # docker run --rm vuls/go-cve-dictionary -v go-cve-dictionary v0.1.1 a64c5fc ・goval-dictionary # docker pull vuls/goval-dictionary # docker run --rm vuls/goval-dictionary -v goval-dictionary fd8ff5a ・vuls # docker pull vuls/vuls # docker run --rm vuls/vuls -v vuls v0.4.1 00c690f |
まず必要なコンテナはgo-cve-dictionary、goval-dictionary、vulsの3つとなります。
バージョンアップしたい場合は# docker rmiしてまた# docker pullすれば最新となります。(これまた楽ちん)
■ Fetch NVD
1 2 3 4 5 6 |
adachin-docker ~ # pwd /root adachin-docker ~ # ll total 24K drwxr-xr-x. 7 root 4.0K Nov 5 12:57 vuls-docker/ |
今回はroot配下にvuls-dockerディレクトリを作成してそこで管理するようにしました。
1 2 3 4 5 6 |
# 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 |
sqlite3データベースファイルの出力先にマウントして
最新のCVEデータベースを構築するので、めちゃくちゃ時間かかります。
ちなみにMackerelで監視しているのですが若干ロアベが高かった。。
■Fetch JVN
1 2 3 4 5 6 |
# for i in `seq 1998 $(date +"%Y")`; do \ docker run --rm -it \ -v $PWD:/vuls \ -v $PWD/go-cve-dictionary-log:/var/log/vuls \ vuls/go-cve-dictionary fetchjvn -years $i; \ done |
日本のJVNデータベースはNVDのデータが日本語翻訳されていますのでCVEデータベースぶち込むとサイコー。
■Fetch OVAL (Ubuntu)
https://github.com/kotakanbe/goval-dictionary#goval-dictionary
1 2 3 4 |
# docker run --rm -it \ -v $PWD:/vuls \ -v $PWD/go-cve-dictionary-log:/var/log/vuls \ vuls/goval-dictionary fetch-ubuntu 12 14 16 |
ADACHIN SERVER LABはUbuntu16なのでUbuntu用OVALもぶち込みます。
■Configuration
1 2 |
adachin-docker vuls # pwd /root/vuls |
・config.toml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
[slack] hookURL = "https://hooks.slack.com/services/zeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeet" channel = "#infra_alert" authUser = "vuls-report" [servers] [servers.adachin-docker] host = "localhost" port = "local" [servers.adachin-server01] host = "xxx.xxxx.xxxx.xxxx." port = "22" user = "zeeeeeeeeeeet" keyPath = "/root/.ssh/zeeeeeeeeet" |
あとはconfig.toml作ってテストしてスキャン!
vuls v0.4.0からsudoers NOPASSにしなくてもスキャンできるようになったので、
CoreOS(dockerサーバ)から自分のブログにsshできるか設定します。
■Configtest
1 2 3 4 5 6 |
adachin-docker vuls # 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 |
■Scan
1 2 3 4 5 6 7 8 |
adachin-docker vuls # 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 \ -e "TZ=Asia/Tokyo" \ vuls/vuls scan \ -config=./config.toml |
■Report
1 2 3 4 5 6 7 8 9 10 11 12 13 |
adachin-docker vuls # 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 \ -to-slack \ -lang=ja \ -cvss-over=7 \ -config=./config.toml |
■TUI
1 2 3 4 5 6 7 |
adachin-docker vuls # 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 tui \ -cvedb-path=/vuls/cve.sqlite3 |
■Slack
ひえええええええええ多いいいいいいいいいいいい
と思ったらNot Fixed Yet。
つまり、まだ修正版が出てないけどとりあえず脆弱性はあるよということ。
早く!!!
※追記2017/12/21 vuls v0.4.2
あれ!?
1 |
time="xxxxx xx xxxxxx" level=info msg="(1/3) Detected: adachin-docker: debian 9.2" |
docker hostはCoreOSで動いてるのになぜdebianなんだ!?w
サウナおじさんに聞いてみよう→バグとのことなのでissuesに書いた。
https://github.com/future-architect/vuls/issues/566
■定期実行
定期実行する前に上記の脆弱性情報更新からreportまでスクリプトを作ってみました。(勢い)
1 2 3 4 5 6 7 8 9 10 11 12 |
adachin-docker vuls-docker # ll total 808M -rw-r--r--. 1 root 310 Nov 5 10:29 config.toml -rw-r--r--. 1 root 770M Nov 5 10:08 cve.sqlite3 -rw-r--r--. 1 root 32K Nov 5 12:57 cve.sqlite3-shm -rw-r--r--. 1 root 0 Nov 5 10:12 cve.sqlite3-wal drwxr-xr-x. 2 root 4.0K Nov 5 09:33 go-cve-dictionary-log drwxr-xr-x. 2 root 4.0K Nov 5 10:10 goval-dictionary-log -rw-r--r--. 1 root 38M Nov 5 10:11 oval.sqlite3 drwx------. 3 root 4.0K Nov 5 12:57 results -rwxr-xr-x. 1 root 1.2K Nov 5 12:56 vuls-auto.sh drwxr-xr-x. 2 root 4.0K Nov 4 23:23 vuls-log |
・vuls-auto.sh
https://gist.github.com/RVIRUS0817/c1741816ede415aa4d9a99d4a230c854
・スクリプト実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
adachin-docker vuls # ./vuls-auto.sh fetchnvd: time="Nov 5 03:56:53" level=info msg="Fetching... https://static.nvd.nist.gov/feeds/xml/cve/nvdcve-2.0-2017.xml.gz" 0 / 2 0.00%time="Nov 5 03:56:53" level=info msg="Fetching... https://static.nvd.nist.gov/feeds/xml/cve/nvdcve-2.0-2016.xml.gz" 2 / 2 100.00% 8s time="Nov 5 03:57:01" level=info msg="Fetched 18084 CVEs" time="Nov 5 03:57:01" level=info msg="Inserting NVD into DB (sqlite3)." time="Nov 5 03:57:01" level=info msg="Inserting CVEs..." 18084 / 18084 100.00% 7s time="Nov 5 03:57:09" level=info msg="Refreshed 0 Nvds." fetchjvn: time="Nov 5 03:57:10" level=info msg="Fetching CVE information from JVN." time="Nov 5 03:57:10" level=info msg="Fetching... http://jvndb.jvn.jp/ja/rss/jvndb_new.rdf" time="Nov 5 03:57:10" level=info msg="Fetching... http://jvndb.jvn.jp/ja/rss/jvndb.rdf" 2 / 2 100.00% 0s time="Nov 5 03:57:10" level=info msg="Fetched 100 CVEs" time="Nov 5 03:57:10" level=info msg="Inserting JVN into DB (sqlite3)." time="Nov 5 03:57:10" level=info msg="Inserting fetched CVEs..." 100 / 100 100.00% 0s time="Nov 5 03:57:10" level=info msg="Refreshed 0 Jvns." vuls scan: [Nov 5 12:57:25] INFO [localhost] Start scanning [Nov 5 12:57:25] INFO [localhost] config: ./config.toml [Nov 5 12:57:25] INFO [localhost] Validating config... [Nov 5 12:57:25] INFO [localhost] Detecting Server/Container OS... [Nov 5 12:57:25] INFO [localhost] Detecting OS of servers... [Nov 5 12:57:26] INFO [localhost] (1/1) Detected: adachin-server01: ubuntu 16.04 [Nov 5 12:57:26] INFO [localhost] Detecting OS of containers... [Nov 5 12:57:26] INFO [localhost] Detecting Platforms... [Nov 5 12:57:29] INFO [localhost] (1/1) adachin-server01 is running on other [Nov 5 12:57:29] INFO [localhost] Scanning vulnerabilities... [Nov 5 12:57:29] INFO [localhost] Scanning vulnerable OS packages... One Line Summary ================ adachin-server01 ubuntu16.04 0 updatable packages ~省略~ |
勢いで作ってみましたが良さげ。
あとはCoreOSで定期実行してみます。
・Scheduling tasks with systemd timers
https://coreos.com/os/docs/latest/scheduling-tasks-with-systemd-timers.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
adachin-docker vuls # cat /etc/systemd/system/vuls.service [Unit] Description=vuls run [Service] Type=simple TimeoutStartSec=0 ExecStart=/root/vuls-docker/vuls-auto.sh > /tmp/vuls.log [Install] WantedBy=default.target adachin-docker vuls # cat /etc/systemd/system/vuls.timer [Unit] Description=vuls Timer [Timer] OnCalendar=Mon,Tue,Wed,Thu,Fri *-*-* 08:00:00 Unit=vuls.service [Install] WantedBy=timers.target |
CoreOSにはcronがデフォルトで入っていないのでsystemdでやってみました。
土日以外朝8時に実行する感じ。通勤時にも見れますね。
・systemctl
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
adachin-docker system # systemctl daemon-reload adachin-docker system # systemctl enable vuls.timer Created symlink /etc/systemd/system/timers.target.wants/vuls.timer → /etc/systemd/system/vuls.timer. adachin-docker system # systemctl start vuls.timer adachin-docker system # systemctl status vuls.timer ● vuls.timer - vuls Timer Loaded: loaded (/etc/systemd/system/vuls.timer; enabled; vendor preset: disabled) Active: active (waiting) since Sun 2018-02-25 17:46:54 JST; 5s ago Feb 25 17:46:54 adachin-docker systemd[1]: Started vuls Timer. adachin-docker ~ # journalctl -f -u vuls.service #ログイン確認 -- Logs begin at Fri 201x-xx-xx xx:xx:xx JST. -- |
先程作ったvuls.timerがエラーなく起動していればOK!
■まとめ
CoreOSもvuls scanできるようになれば敦盛と思いましたが、
CoreOS自体相当セキュアなので毎回新しいアップデートが来ると自動的にアップデートされて
再起動されますw(自分はオフにしてる)
これで自宅dockerサーバも放置することなくなった!・3・U
同僚の個人サーバも管理してるのでVulsスキャンしよう!
あとでVulsRepoも試してみまふ。
0件のコメント