amazon linuxにOpenVAS 7をソースからインストールする

amazon linuxにOpenVAS 7をソースからインストールする方法です。
今回は/usr/local/openvas/下にインストールします。
なお、以下のコマンドはroot権限で実行していますので必要に応じてsudoをつけてください。


まずyumで依存パッケージをインストールします。
unbound-libsは公式リポジトリには存在しないのでepelからインストールしましょう。
以下は一例ですので環境によっては他のパッケージが必要な可能性もあります。

yum install gcc bison flex cmake pkgconfig glib2-devel gnutls-devel libpcap-devel gpgme-devel libuuid-devel doxygen libksba-devel zlib-devel gmp-devel sqlite-devel nmap
yum install --enablerepo="epel" unbound-libs 

次に依存関係を解決するためにgnutlsをソースからビルドします。
gnutlsはyumインストールできますがバージョンが要求を満たしていないためソースからビルドする必要があります。
gnutlsをビルドするためにnettleが必要なのでまずはnettleからビルドします。
nettleはバージョン3.0だとlibhogweedがインストールされずgnutlsのconfigure時にエラーが出てしまうので2.7.1を利用してください。

cd /tmp/
wget ftp://ftp.gnu.org/gnu/nettle/nettle-2.7.1.tar.gz
tar -zxvf nettle-2.7.1.tar.gz
cd /tmp/openvas/nettle-2.7.1
export CC="gcc -Wl,-rpath,/usr/local/openvas/lib64"
./configure --prefix=/usr/local/openvas
make && make install

cd /tmp/
wget ftp://ftp.gnutls.org/gcrypt/gnutls/v3.3/gnutls-3.3.0.tar.xz
tar -xJvf gnutls-3.3.0.tar.xz
cd /tmp/openvas/gnutls-3.3.0
export PKG_CONFIG_PATH=/usr/local/openvas/lib64/pkgconfig
export CC="gcc -Wl,-rpath,/usr/local/openvas/lib64"
./configure --prefix=/usr/local/openvas
make && make install

libmicrohttpdもソースからビルドします。
libmicrohttpdもyumインストールできますがyum版は必要な機能が有効になっていないためソースからビルドする必要があります。

cd /tmp/
wget http://ftp.gnu.org/gnu/libmicrohttpd/libmicrohttpd-0.9.38.tar.gz
tar -zxvf libmicrohttpd-0.9.38.tar.gz
cd /tmp/openvas/libmicrohttpd-0.9.38
./configure --prefix=/usr/local/openvas --with-gnutls=/usr/local/openvas
make && make install

これで依存関係を解決できました。
OpenVAS 7をビルドしていきます。
OpenVAS 7は以下の5つのコンポーネントから構成されています。

  • Libraries
  • Scanner
  • Manager
  • GSA(Webインターフェース)
  • CLI

今回はCLI以外をビルドします。

cd /tmp/
wget http://wald.intevation.org/frs/download.php/1787/openvas-libraries-7.0.5.tar.gz
tar -zxvf openvas-libraries-7.0.5.tar.gz
mkdir /tmp/openvas/openvas-libraries-7.0.5/build
cd /tmp/openvas/openvas-libraries-7.0.5/build
export PKG_CONFIG_PATH=/usr/local/openvas/lib/pkgconfig:$PKG_CONFIG_PATH
export CFLAGS='-L/usr/local/openvas/lib -I/usr/local/openvas/include'
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/openvas -DCMAKE_INSTALL_RPATH=/usr/local/openvas/lib ..
make
make install

cd /tmp/
wget http://wald.intevation.org/frs/download.php/1791/openvas-scanner-4.0.4.tar.gz
tar -zxvf openvas-scanner-4.0.4.tar.gz
mkdir /tmp/openvas/openvas-scanner-4.0.4/build
cd /tmp/openvas/openvas-scanner-4.0.4/build
export CC='gcc -Wl,-rpath,/usr/local/openvas/lib64 -Wl,-rpath,/usr/local/openvas/lib'
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/openvas -DCMAKE_INSTALL_RPATH=/usr/local/openvas/lib ..
make
make install

cd /tmp/
wget http://wald.intevation.org/frs/download.php/1795/openvas-manager-5.0.5.tar.gz
tar -zxvf openvas-manager-5.0.5.tar.gz
mkdir /tmp/openvas/openvas-manager-5.0.5/build
cd /tmp/openvas/openvas-manager-5.0.5/build
export CC='gcc -Wl,-rpath,/usr/local/openvas/lib64 -Wl,-rpath,/usr/local/openvas/lib /lib64/libgpg-error.so.0'
export PKG_CONFIG_PATH=/usr/local/openvas/lib/pkgconfig:/usr/local/openvas/lib64/pkgconfig
export CFLAGS="-I/usr/local/openvas/include"
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/openvas -DCMAKE_INSTALL_RPATH=/usr/local/openvas/lib ..
make
make install

cd /tmp/
wget http://wald.intevation.org/frs/download.php/1799/greenbone-security-assistant-5.0.4.tar.gz
mkdir /tmp/openvas/greenbone-security-assistant-5.0.4/build
cd /tmp/openvas/greenbone-security-assistant-5.0.4/build
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/openvas -DCMAKE_INSTALL_RPATH=/usr/local/openvas/lib ..
make
make install

これでOpenVASのビルドは完了です。
次は初期設定を行っていきます。


初期設定で利用するスクリプトの書き換えを行います。
今回は/usr/local/openvas/下にインストールしたので、スクリプトで利用しているコマンドにパスが通っていません。
そのためフルパスでコマンドを実行するように書き換えていきます。

sed -i "s/OPENVASSD\=\`which openvassd\`/OPENVASSD=\/usr\/local\/openvas\/sbin\/openvassd/g" /usr/local/openvas/sbin/openvas-nvt-sync
sed -i "s/NVT_DIR\=\`openvassd/NVT_DIR=\`\/usr\/local\/openvas\/sbin\/openvassd/g" /usr/local/openvas/sbin/openvas-nvt-sync

sed -i "s/OPENVASSD\=\`which openvassd\`/OPENVASSD=\/usr\/local\/openvas\/sbin\/openvassd/g" /usr/local/openvas/sbin/openvas-certdata-sync
sed -i "s/SCAP_DIR\=\`openvassd/SCAP_DIR=\`\/usr\/local\/openvas\/sbin\/openvassd/g" /usr/local/openvas/sbin/openvas-certdata-sync

SSL証明書を作成します。

/usr/local/openvas/sbin/openvas-mkcert

対話形式のスクリプトです。適当な値を入力して証明書を作成してください。


NVTをダウンロードします。NVTとは脆弱性情報やそのテストに関する設定情報のことです。

/usr/local/openvas/sbin/openvas-nvt-sync

スキャナのデーモンを起動します。

/usr/local/openvas/sbin/openvassd

少し時間がかかります。psコマンドで以下のメッセージが出ることを確認してください。

ps auxf | grep openvassd
openvassd: Waiting for incoming connections

マネージャーに接続するクライアント用のSSL証明書を作成します。

/usr/local/openvas/sbin/openvas-mkcert-client -n -i

データベースを再構築します。

/usr/local/openvas/sbin/openvasmd --rebuild

ユーザーを作成します。

/usr/local/openvas/sbin/openvasmd --create-user=admin

パスワードが出力されますが、以下のようにして変更も可能です。

/usr/local/openvas/sbin/openvasmd --user=admin --new-password=admin

キーを作成します。
なんのためのキーかは謎です。

/usr/local/openvas/sbin/openvasmd --create-credentials-encryption-key
/usr/local/openvas/sbin/openvasmd --encrypt-all-credentials

SCAPデータベースをダウンロードします。SCAPとはNVTとは別の脆弱性情報の仕様です。

/usr/local/openvas/sbin/openvas-scapdata-sync

CERTデータベースをダウンロードします。同じく脆弱性情報のことです。

/usr/local/openvas/sbin/openvas-certdata-sync

各コンポーネントの起動スクリプトを作成します。

vim /etc/init.d/openvas-manager
------------------------------------------------------------
#!/bin/bash

# This is an implementation of a start-script for OpenVAS Manager

# chkconfig: - 92 10
# Description: OpenVAS Manager is a vulnerability Scanner management daemon
#

### BEGIN INIT INFO
# Provides: openvas-manager
# Required-Start: $local_fs $network $syslog
# Required-Stop: $local_fs $network $syslog
# Default-Start:
# Default-Stop: 0 1 2 3 4 5 6
# Short-Description: start|stop|status|restart|condrestart OpenVAS Manager
# Description: control OpenVAS Manager
### END INIT INFO

# Source function library.
. /etc/rc.d/init.d/functions

exec="/usr/local/openvas/sbin/openvasmd" 
prog="openvasmd" 
progname="openvas-manager" 
lockfile=/var/lock/subsys/openvasmd

[ -e /etc/sysconfig/$progname ] && . /etc/sysconfig/$progname

rh_status() {
        # run checks to determine if the service is running or use generic status
        status -p /usr/local/openvas/var/run/$prog.pid -l $lockfile $progname
}

rh_status_q() {
        rh_status >/dev/null 2>&1
}

start() {
        echo "Starting $progname:" 
        daemon --pidfile=/var/run/$prog.pid $exec $OPTIONS
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && touch $lockfile
        return $RETVAL
}

stop() {
        echo -n "Stopping $progname: " 
        killproc $prog
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && rm -f $lockfile
        return $RETVAL
}

restart() {
        stop
        start
}

case "$1" in
        start)
                rh_status_q && exit 0
                $1
                ;;

        stop)
                rh_status_q || exit 0
                $1
                ;;

        restart)
                $1
                ;;

        condrestart|try-restart)
                rh_status_q || exit 0
                $1
                ;;

        status)
                status -p /usr/local/openvas/var/run/$prog.pid -l $lockfile $progname
                ;;

        *)
                echo "Usage: $0 {start|stop|status|restart|condrestart}" 
                exit 1
esac

exit 0
------------------------------------------------------------
chmod 755 /etc/init.d/openvas-manager
vim /etc/init.d/openvas-scanner
------------------------------------------------------------
#!/bin/sh
#
# openvas-scanner    This starts and stops the OpenVAS scanner.
#
# chkconfig:   35 75 25
# description: This starts and stops the OpenVAS scanner.
# processname: /usr/sbin/openvassd
# config:      /etc/openvas/openvassd.conf
# pidfile:     /var/run/openvassd.pid
#
### BEGIN INIT INFO
# Provides: $openvas-scanner
### END INIT INFO

# Source function library.
. /etc/rc.d/init.d/functions

EXEC="/usr/local/openvas/sbin/openvassd" 
PROG=$(basename $EXEC)

# Check for missing binaries (stale symlinks should not happen)
# Note: Special treatment of stop for LSB conformance
test -x $EXEC || { echo "$EXEC not installed";
        if [ "$1" = "stop" ]; then exit 0;
        else exit 5; fi; }

# Check for existence of needed config file
OPENVASSD_CONFIG=/etc/sysconfig/openvas-scanner
test -r $OPENVASSD_CONFIG || { echo "$OPENVASSD_CONFIG does not exist";
        if [ "$1" = "stop" ]; then exit 0;
        else exit 6; fi; }

# Read config
. $OPENVASSD_CONFIG

# Build parameters
[ "$SCANNER_ADDRESS" ] && PARAMS="$PARAMS --listen=$SCANNER_ADDRESS" 
[ "$SCANNER_PORT" ]    && PARAMS="$PARAMS --port=$SCANNER_PORT" 

LOCKFILE=/var/lock/subsys/$PROG

start() {
    echo -n $"Starting openvas-scanner: " 
    daemon $EXEC $PARAMS
    RETVAL=$?
    echo
    [ $RETVAL -eq 0 ] && touch $LOCKFILE
    return $RETVAL
}

stop() {
    echo -n $"Stopping openvas-scanner: " 
    killproc $PROG
    RETVAL=$?
    echo
    [ $RETVAL -eq 0 ] && rm -f $LOCKFILE
    return $RETVAL
}

restart() {
    stop
    start
}

reload() {
    echo -n $"Reloading openvas-scanner: " 
    killproc $PROG -HUP
    RETVAL=$?
    echo
    return $RETVAL
}

force_reload() {
    restart
}

fdr_status() {
    status $PROG
}

case "$1" in
    start|stop|restart|reload)
        $1
        ;;
    force-reload)
        force_reload
        ;;
    status)
        fdr_status
        ;;
    condrestart|try-restart)
        [ ! -f $LOCKFILE ] || restart
        ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|try-restart|reload|force-reload}" 
        exit 2
esac
------------------------------------------------------------
chmod 755 /etc/init.d/openvas-scanner
vim /etc/init.d/gsad
------------------------------------------------------------
#!/bin/sh
#
# gsad    This starts and stops the Greenbone Security Assistant.
#
# chkconfig:   35 75 25
# description: This starts and stops the Greenbone Security Assistant.
# processname: /usr/sbin/gsad
# config:      /etc/openvas/gsad.conf
# pidfile:     /var/run/gsad.pid
#
### BEGIN INIT INFO
# Provides: $greenbone-security-assistant
### END INIT INFO

# Source function library.
. /etc/rc.d/init.d/functions

EXEC="/usr/local/openvas/sbin/gsad" 
PROG=$(basename $EXEC)

# Check for missing binaries (stale symlinks should not happen)
# Note: Special treatment of stop for LSB conformance
test -x $EXEC || { echo "$EXEC not installed";
        if [ "$1" = "stop" ]; then exit 0;
        else exit 5; fi; }

# Check for existence of needed config file
GSAD_CONFIG=/etc/sysconfig/gsad
test -r $GSAD_CONFIG || { echo "$GSAD_CONFIG not existing";
        if [ "$1" = "stop" ]; then exit 0;
        else exit 6; fi; }

# Read config
. $GSAD_CONFIG

# Build parameters
[ "$GSA_ADDRESS" ] && PARAMS="--listen=$GSA_ADDRESS" 
[ "$GSA_PORT" ] && PARAMS="$PARAMS --port=$GSA_PORT" 
[ "$GSA_SSL_PRIVATE_KEY" ] && PARAMS="$PARAMS --ssl-private-key=$GSA_SSL_PRIVATE_KEY" 
[ "$GSA_SSL_CERTIFICATE" ] && PARAMS="$PARAMS --ssl-certificate=$GSA_SSL_CERTIFICATE" 
[ "$GSA_REDIRECT" ] && [ "$GSA_REDIRECT" == 1 ] && PARAMS="$PARAMS --redirect" 
[ "$GSA_REDIRECT_PORT" ] && PARAMS="$PARAMS --rport=$GSA_REDIRECT_PORT" 
[ "$MANAGER_ADDRESS" ] && PARAMS="$PARAMS --mlisten=$MANAGER_ADDRESS" 
[ "$MANAGER_PORT" ] && PARAMS="$PARAMS --mport=$MANAGER_PORT" 

LOCKFILE=/var/lock/subsys/$PROG

start() {
    echo -n $"Starting greenbone-security-assistant: " 
    daemon $EXEC $PARAMS
    RETVAL=$?
    echo
    [ $RETVAL -eq 0 ] && touch $LOCKFILE
    return $RETVAL
}

stop() {
    echo -n $"Stopping greenbone-security-assistant: " 
    killproc $PROG
    RETVAL=$?
    echo
    [ $RETVAL -eq 0 ] && rm -f $LOCKFILE
    return $RETVAL
}

restart() {
    stop
    start
}

reload() {
    echo -n $"Reloading greenbone-security-assistant: " 
    killproc $PROG -HUP
    RETVAL=$?
    echo
    return $RETVAL
}

force_reload() {
    restart
}

fdr_status() {
    status $PROG
}

case "$1" in
    start|stop|restart|reload)
        $1
        ;;
    force-reload)
        force_reload
        ;;
    status)
        fdr_status
        ;;
    condrestart|try-restart)
        [ ! -f $LOCKFILE ] || restart
        ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|try-restart|reload|force-reload}" 
        exit 2
esac
------------------------------------------------------------
chmod 755 /etc/init.d/gsad

各コンポーネントの設定ファイルを作成します。

vim /etc/sysconfig/openvas-scanner
------------------------------------------------------------
# Options to pass to the openvassd daemon
OPTIONS="-p 9391" 

# Set to yes if plugins should be automatically updated via a cron job
auto_plugin_update=yes

# Notify OpenVAS scanner after update by seding it SIGHUP?
notify_openvas_scanner=yes

# Method to use to get updates. The default is via rsync
# Note that only wget and curl support retrieval via proxy
# update_method=rsync|wget|curl

# Additionaly, you can specify the following variables
#NVT_DIR                where to extract plugins (absolute path)
#OV_RSYNC_FEED          URL of rsync feed
#OV_HTTP_FEED           URL of http feed

# First time install token
FIRSTBOOT=no
------------------------------------------------------------
vim /etc/sysconfig/openvas-manager
------------------------------------------------------------
OPTIONS="--port 9390 --sport 9391 -v" 
------------------------------------------------------------
vim /etc/sysconfig/gsad
------------------------------------------------------------
GSA_ADDRESS=0.0.0.0
GSA_PORT=9392
MANAGER_ADDRESS=127.0.0.1
MANAGER_PORT=9390
------------------------------------------------------------

脆弱性情報などを自動更新するcron設定を作成します。

vim /etc/cron.d/openvas-sync-cert
------------------------------------------------------------
# start plugin sync daily at 130am
30 1 * * * root /bin/nice -n 19 /usr/bin/ionice -c2 -n7 /usr/local/openvas/sbin/openvas-certdata-sync > /dev/null
------------------------------------------------------------
vim /etc/cron.d/openvas-sync-plugins
------------------------------------------------------------
# start plugin sync daily at midnight
0 0 * * * root /bin/nice -n 19 /usr/bin/ionice -c2 -n7 /usr/local/openvas/sbin/openvas-nvt-sync > /dev/null
------------------------------------------------------------
vim /etc/cron.d/openvas-sync-scap
------------------------------------------------------------
# start plugin sync daily at 1am
0 1 * * * root /bin/nice -n 19 /usr/bin/ionice -c2 -n7 /usr/local/openvas/sbin/openvas-scapdata-sync > /dev/null
------------------------------------------------------------

各コンポーネントを起動します。

service openvas-scanner restart
service openvas-manager start
service opanvas-gsad start
chkconfig openvas-scanner on
chkconfig openvas-manager on
chkconfig gsad on

正常にインストールできたか確認します。
公式で配布されている確認用のスクリプトを利用します。

cd /tmp/
wget --no-check-certificate https://svn.wald.intevation.org/svn/openvas/trunk/tools/openvas-check-setup
chmod 755 openvas-check-setup
env PATH="/usr/local/openvas/bin:/usr/local/openvas/sbin:$PATH" ./openvas-check-setup --server

“It seems like your OpenVAS-7 installation is OK.” のメッセージが出たらインストールは成功しています。


GSA(Webインターフェース)には以下のアドレスからアクセスできます。

https://{domain}:9392/

参考: http://virtuallyhyper.com/2014/06/compile-openvas-7-on-centos-6/