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

この記事は、[Vuls Advent Calendar 2016](http://qiita.com/advent-calendar/2016/vuls)の15日目になります。

# 概要

[前回の記事 ](http://qiita.com/hogehogehugahuga/items/6f7c861bc4079dbb287d) で、Ubuntu16.10を導入するのが難しいことが分かった。

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

# 方針

Vuls Advent Calender 2016の 7日目に書いた[標準化した、Vuls/VulsRepoの導入](http://qiita.com/hogehogehugahuga/items/239c0ad02ac409e34f12#vulsrepo%E3%82%92%E5%B0%8E%E5%85%A5)のシナリオをベースとして、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出来る場合は、不要です。

```bash: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等が出来ないようです。 

```bash: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"ではない事に注意。

```bash: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言語の導入

いつも通り、入れます。

```bash: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を入れる

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

```bash:
[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にしましょう。

```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を導入

```bash: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の導入](http://qiita.com/hogehogehugahuga/items/239c0ad02ac409e34f12#vulsrepo%E3%82%92%E5%B0%8E%E5%85%A5)の方針で、apache:apacheで動かす。
その為のアクセス権設定をし、WEBサーバを稼働させます。

- ubuntuで Apache2を選択した場合、apacheの起動ユーザは www-data:www-data になります。
    - その為、/opt/vuls/resultsへは、www-dataグループがアクセスできるようにする必要があります。

```bash: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を使い続けることになるのでしょう。