Edited at
VulsDay 15

Ubuntu 16.04でVuls/VulsRepoを稼働させた話

More than 1 year has passed since last update.

この記事は、Vuls Advent Calendar 2016の15日目になります。


概要

前回の記事 で、Ubuntu16.10を導入するのが難しいことが分かった。

そのため、一般的に利用されている Ubuntu 16.04LTSでのセットアップを行い、例示することにした。


方針

Vuls Advent Calender 2016の 7日目に書いた標準化した、Vuls/VulsRepoの導入のシナリオをベースとして、Ubuntu16.04にVulsを仕込みます。


  • Vuls, VulsRepoの推奨するREADME.md構成とは、一部異なります。


    • HTTPDの動作権限は、vulsではなくて、別の物にしています。

    • それに合わせ、vulsのホームディレクトリアクセス権を比較的強固にしています。




Vulsスキャンサーバ構築上での、CentOSとの違い

CentOS上でVulsを導入することは多いのですが、今回初めてUbuntuにVulsサーバを入れました。(スキャン対象には何度かしたことがあります。)

以下の点が引っかかりやすいな、と思いました。


  • useraddでログインシェルを 明示的に 指定しないと、Nullになるようだ。


    • スキャン対象側のvulsユーザでは、ログインシェルがbashである必要があります。



  • Ubuntuで、HTTPDをapache2にした場合、www-dataユーザ/グループがapache2を駆動します


    • apache:apacheかwww-data:www-dataか、の違いだけですが。



  • VulsRepoで必要になるPerlモジュールのパッケージ名が、CentOSと異なります。


    • README.md通り進めれば大丈夫




構築例


初回パッケージ導入と、アップデート

アップデート時にCDを要求されたので、取りあえずマウントしています。

そのままapt-get upgrade出来る場合は、不要です。


install_and_upgrade_package

[default:~]$ sudo su -

[default:~]$ sudo vi /etc/apt/sources.list
=============
# dev cdrom行の先頭に"#"を付けて、コメントアウト。
#deb cdrom:[Ubuntu-Server 16.04.1 LTS _Xenial Xerus_ - Release amd64 (20160719)]/ xenial main restricted
=============
[default:~]$ sudo apt-get install openssh-server sqlite gcc make
[default:~]$ sudo apt-get upgrade


vulsユーザの作成


ユーザ作成

useraddで作成する場合、-sでログインシェルを bash とする必要があります。


  • ログインシェルがbashではない場合は、vulsでのscan等が出来ないようです。


add_vuls_user

[default:~]$ sudo useradd -d /opt/vuls vuls -s /bin/bash

[default:~]$ sudo visudo
--------------------------
vuls ALL=(root) NOPASSWD: /usr/bin/apt-get, /usr/bin/apt-cache
--------------------------
[default:~]$ sudo mkdir /opt/vuls
[default:~]$ sudo chmod 700 /opt/vuls
[default:~]$ sudo chown vuls:vuls /opt/vuls


vulsユーザの鍵を作る

今回は、id_rsaではなく、もっと強度の強い 楕円曲線DSA(ECDSA)の鍵を作ります。


  • ECDSAの場合、鍵のビット長は 256, 384, 521 から選択することになります。


    • "512"ではない事に注意。




create_ssh_keys

[default:~]$ sudo su - vuls

[vuls:~]$ pwd
/opt/vuls
[vuls:~]$ mkdir .ssh ssh_keys
[vuls:~]$ chmod 700 .ssh/ ssh_keys
[vuls:~]$ ssh-keygen -t ecdsa -b 521
Generating public/private ecdsa key pair.
Enter file in which to save the key (/opt/vuls/.ssh/id_ecdsa)
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /opt/vuls/.ssh/id_ecdsa
Your public key has been saved in /opt/vuls/.ssh/id_ecdsa.pub.
The key fingerprint is:
SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxx vuls@HOSTNAME
The key’s randomart image is;
+---[ECDSA 521---+
|(randamart here)|
+----[SHA256-----+
[vuls:~]$ cat .ssh/id_ecdsa.pub >> .ssh/authorized_keys
[vuls:~]$ chmod 600 .ssh/authorized_keys
[vuls:~]$ mv .ssh/id_ecdsa ssh_keys/local_id_ecdsa
[vuls:~]$ exit


go言語の導入

いつも通り、入れます。


install_go_lang

[default:~]$ wget https://storage.googleapis.com/golang/go1.7.4.linux-amd64.tar.gz

[default:~]$ sudo tar -C /usr/local -xzf go1.7.4.linux-amd64.tar.gz
[default:~]$ sudo vi /etc/profile.d/goenv.sh
--------------------------
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
--------------------------
[default:~]$ sudo mkdir /var/log/vuls
[default:~]$ sudo chown vuls:vuls /var/log/vuls
[default:~]$ sudo chmod 700 /var/log/vuls
[default:~]$ sudo su - vuls
[vuls:~]$ mkdir go
[vuls:~]$ go version
go version go1.7.4 linux/amd64


go-cve-dictionaryを入れる

これもいつも通り、入れます。

[vuls:~]$ mkdir -p $GOPATH/src/github.com/kotakanbe

[vuls:~]$ cd $GOPATH/src/github.com/kotakanbe
[vuls:kotakanbe]$ git clone https://github.com/kotakanbe/go-cve-dictionary.git
[vuls:kotakanbe]$ cd go-cve-dictionary
[vuls:go-cve-dictionary]$ make install
[vuls:go-cve-dictionary]$ mkdir -p $GOPATH/src/github.com/future-architect
[vuls:go-cve-dictionary]$ cd $GOPATH/src/github.com/future-architect
[vuls:future-architect]$ git clone https://github.com/future-architect/vuls.git
[vuls:future-architect]$ cd vuls
[vuls:vuls]$ make install
[vuls:vuls]$ cd
[vuls:~]$ for i in {2002..2017}; do go-cve-dictionary fetchnvd -years $i; done


vulsの設定と、自身へのスキャン

config.tomlを作成し、自分自身をスキャンします。


  • config.tomlと同じ階層で vuls scanをしましょう。


    • 若しくは、明示的にコンフィグファイルを指定しましょう。



  • prepare等でエラーになる場合は、vulsユーザのログインシェルを確認しましょう。


    • /etc/passwdで/bin/bashになっていることを確認しましょう。

    • CentOSだとuseraddでシェルを指定しなくてもbashになったけど、ubuntuではNullになるので注意。


      • その場合は $ sudo chsh vuls辺りを実行して、シェルを/bin/bashにしましょう。






vuls_config_and_scan

[vuls:~]$ vi /opt/vuls/config.toml

--------------------
[default]
port = “22”
user = “vuls”

[servers]

[servers.vuls-server]
host = "127.0.0.1"
keyPath = "opt/vuls/ssh_keys/local_id_ecdsa"
--------------------
[vuls:~]$ vuls configtest
[vuls:~]$ vuls prepare
[vuls:~]$ vuls scan -cve-dictionary-dbpath=/opt/vuls/cve.sqlite3 -report-json



VulsRepoを入れる

gitからVulsRepoを導入


install_VulsRepo

[default:~]$ sudo apt-get install apache2 libcgi-pm-perl libjson-perl

[default:~]$ cd /var/www/html
[default:html]$ sudo git clone https://github.com/usiusi360/vulsrepo.git
[default:html]$ sudo cp vulsrepo/dist/cgi/vulsrepo.conf.sample /etc/apache2/conf-available/vulsrepo.conf
[default:html]$ ln -s /etc/apache2/conf-abailable/vulsrepo.conf /etc/apache2/conf-enabled/vulsrepo.conf
[default:html]$ sudo a2enmod cgid
[default:html]$ cd vulsrepo
[default:vulsrepo]sudo ln -s /opt/vuls/results results

VulsRepoのREADME.mdではなく、標準化した、Vuls/VulsRepoの導入の方針で、apache:apacheで動かす。

その為のアクセス権設定をし、WEBサーバを稼働させます。


  • ubuntuで Apache2を選択した場合、apacheの起動ユーザは www-data:www-data になります。


    • その為、/opt/vuls/resultsへは、www-dataグループがアクセスできるようにする必要があります。




replace_acl

[default:~]$ sudo chown vuls:www-data /opt/vuls

[default:~]$ sudo chmod --recursive go= /opt/vuls
[default:~]$ sudo chmod --recursive 700 /opt/vuls/ssh_keys
[default:~]$ sudo chown --recursive vuls:www-data /opt/vuls/results/
[default:~]$ sudo chmod g+xr /opt/vuls
[default:~]$ sudo chmod --recursive g+xr /opt/vuls/results/
[default:~]$ sudo /etc/init.d/apache2 start


VulsRepoをブラウザで見る

ブラウザで http://<対象ホスト>/vulsrepo/ を開きます。

以上で、healthyな一覧が見えるはずです。


まとめ

Ubuntu16.10ではうまく動かなかったが、Ubuntu16.04LTSでは問題なく稼働させることができた。

Ubuntu16.10は癖がある?ようですね。 もうしばらくは16.04を使い続けることになるのでしょう。