この記事は、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出来る場合は、不要です。
[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等が出来ないようです。
[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"ではない事に注意。
[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言語の導入
いつも通り、入れます。
[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:~]$ 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を導入
[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グループがアクセスできるようにする必要があります。
[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を使い続けることになるのでしょう。