概要
Vulsエージェントモードが実装された。これにより、スキャン対象サーバにバイナリを置く事で、SSH無しで脆弱性スキャンが出来るようになった。
この方式の問題点は「スキャン対象用のVulsバイナリが必要になる」事。スキャン対象ごとにgo langのセットアップが必要になるのは、それはそれで問題がある。
その為、go langのクロスコンパイル環境を利用して、スキャン対象サーバ用のバイナリを作ることにした。
下準備
面倒だから、rootで/usr/local/go の準備をしちゃいました。。
vulsのコンパイル等は、いつも通りvulsユーザでできます。
まずは最新版のGOを入れる
Vulsのインストール指示通り、go言語を入れます
; 通常のgo言語の導入方法と同じ。
# wget https://storage.googleapis.com/golang/go1.7.1.linux-amd64.tar.gz
# tar -C /usr/local -xzf go1.7.1.linux-amd64.tar.gz
# mkdir $HOME/go
# sudo vi /etc/profile.d/goenv.sh
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
# source /etc/profile.d/goenv.sh
go1.4を入れる
クロスコンパイル用に、取りあえずgo1.4を入れます。
GOROOT_BOOTSTRAPはデフォルトで$HOME/go1.4を向いているらしいので、~/go1.4 に入れる
# mkdir $HOME/tmp
# wget https://storage.googleapis.com/golang/go1.4.2.linux-amd64.tar.gz
# tar zxvf go1.4.2.linux-amd64.tar.gz -C $HOME/tmp
# mv $HOME/tmp/go $HOME/go1.4
make.bash
あとは、/usr/local/go/src で、各OS/Archtecture毎の準備。
今回はFreeBSDのバイナリを作りたいので、GOOS=freebsd, GOARCH=arm64を指定。
- Vulsで利用する場合は、GOOSはfreebsd位かも。windowsやdarwinはそもそもVulsが対応していない
- GOARCHはもしかしたら必要?386とか?
# cd /usr/local/go/src
# GOOS=freebsd GOARCH=amd64 ./make.bash
; 前述のgo1.4を入れていないと、ここでエラーになる。
; GOOS/GOARCHで対象のOS/アーキテクチャを指定する。
vulsをクロスコンパイルする
いつも通りmake installしてから作る
/usr/local/go に入れたgoがクロスコンパイル可能になったので、ここからは一般ユーザでよさげ。
一度、通常通りvulsバイナリを作ってからの方がいいみたい。
いつもの導入
- $HOME/go/bin に、当該サーバ用のvulsが出来ます
$ mkdir -p $GOPATH/src/github.com/future-architect
$ cd $GOPATH/src/github.com/future-architect
$ git clone https://github.com/future-architect/vuls.git
$ cd vuls
$ make install
ここからがクロスコンパイル
- go/src/.../vuls 以下に バイナリが出来ます
$ cd $HOME/go/src/github.com/future-architect/vuls
$ GOOS=freebsd GOARCH=amd64 go build main.go
$ mv main vuls.freebsd
自分用のVulsは要らない場合
make installだと go/bin/vuls が出来るけど、要らない場合は glide installでいいみたい。
$ mkdir -p $GOPATH/src/github.com/future-architect
$ cd $GOPATH/src/github.com/future-architect
$ git clone https://github.com/future-architect/vuls.git
$ cd vuls
$ go get glide
$ glide install
あとは前述のクロスコンパイルと同じ
$ GOOS=freebsd GOARCH=amd64 go build main.go
$ mv main vuls.freebsd
確認
CentOS68上でfreeBSD版作った。
$ cat /etc/redhat-release
CentOS release 6.8 (Final)
$ file vuls.freebsd
vuls.freebsd: ELF 64-bit LSB executable, x86-64, version 1 (FreeBSD), statically linked, not stripped
$ ./vuls.freebsd -v
Segmantation fault (core dumped)
$
後は、これを実機のFreeBSDに転送してあげれば動きますね。
おわり。
その他情報
https://vuls-github.slack.com/messages のSlackチームで色々助言頂きました。