Ubuntu Server 16.04 LTSに診断したセキュリティインシデントの管理ツール『FIR』をインストールする

Nessusなどで取得したセキュリティスキャンのデータ管理方法について調べていたところ、運用中のセキュリティインシデント情報の管理ツール『FIR』というものを見かけたので、Ubuntu Server 16.04 LTSに入れてみることにする。 動作にはMySQLやNginxといったパッケージが必要になるので、それら含めインストールを行う。 また、今回は検証のため一般ユーザ(blacknon)、作業ディレクトリはホームディレクトリ(/home/blacknon/)で行っている。 ちゃんと運用するなら、専用のユーザを作成して/opt配下をホームディレクトリにするなどが必要だろう。

インストール手順は、こちらの公式手順を元に進めていく。

1. 前提となるパッケージのインストール

まず、以下のコマンドで前提となるパッケージの導入をする。 インストール中にMySQLのパスワード設定画面が表示されるので対応する。

sudo apt update && sudo apt upgrade
sudo apt install mysql-server libmysqlclient-dev gettext python-dev python-pip python-lxml git libxml2-dev libxslt1-dev libz-dev nginx libpq-dev

MySQLにFIR用のテーブルを作成する。

mysql -uroot -p -e '
   CREATE DATABASE fir;
   CREATE USER "fir"@"localhost" IDENTIFIED BY "P@ssw0rd";
   GRANT USAGE ON *.* TO "fir"@"localhost";
   GRANT ALL PRIVILEGES ON `fir`.* TO "fir"@"localhost";'

2. FIRのインストール

次に、FIRのインストールを行う。 まず、以下のコマンドでVirtualEnvとgitでのソースの取得を行う。

sudo pip install virtualenv
virtualenv env-FIR
source env-FIR/bin/activate
git clone https://github.com/certsocietegenerale/FIR.git

次に、以下のコマンドで必要になるPythonのパッケージを導入する。

cd FIR
pip install -r requirements.txt
pip install mysql-python

Pythonで必要となるパッケージのインストールが完了したら、以下のコマンドで設定ファイルのサンプルをコピーしてくる。 プラグインを有効にする場合は、2行目のコマンドも実行する。

cp fir/config/production.py.sample fir/config/production.py
cp fir/config/installed_apps.txt.sample fir/config/installed_apps.txt # プラグインを有効にする場合

設定ファイルのコピーが完了したら、設定ファイル「fir/config/production.py」を編集する。 以下、編集箇所だけ抜粋。

ALLOWED_HOSTS = ['ドメイン名']

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'fir',
        'USER': 'fir',
        'PASSWORD': 'パスワード',
        'HOST': '',
        'PORT': '',
    }
}

設定ファイル編集後、以下のコマンドでテーブル、スーパーユーザを作成する。

./manage.py migrate --settings fir.config.production
./manage.py createsuperuser --settings fir.config.production

以下のコマンドで、初期データのインポートを行う。

./manage.py loaddata incidents/fixtures/seed_data.json --settings fir.config.production
./manage.py collectstatic --settings fir.config.production

ディレクトリの所有者やパーミッションについて変更する。

sudo chown www-data logs/errors.log uploads
sudo chmod 750 logs/errors.log uploads

3. uWSGIのインストール・設定

『FIR』ではuWSGIが必要になるため、これのインストール・設定を行う。

sudo pip install uwsgi
sudo chsh www-data -s /bin/sh

ソケット用のディレクトリを作成する。

mkdir run
sudo chown www-data run

設定ファイル「/etc/init/fir.conf」および「/etc/systemd/system/fir_uwsgi.service」を作成する。

/etc/init/fir.conf
description "FIR - Django uWSGI" start on runlevel [2345] stop on runlevel [!2345] setuid www-data setgid www-data respawn exec uwsgi --socket /home/ユーザ名/FIR/run/fir.sock --chdir /home/ユーザ名/FIR/ --module fir.wsgi
/etc/systemd/system/fir_uwsgi.service
[Unit] Description=uWSGI instance for FIR After=syslog.target [Service] User=www-data Group=www-data WorkingDirectory=/home/ユーザ名/FIR/ ExecStart=/usr/local/bin/uwsgi --socket /home/ユーザ名/FIR/run/fir.sock --chdir /home/ユーザ名/FIR/ --module fir.wsgi Restart=always KillSignal=SIGQUIT Type=Debug StandardError=syslog NotifyAccess=All [Install] WantedBy=multi-user.target

設定ファイルの作成・配置ができたら、サービスを起動する。

sudo service fir_uwsgi start

4. Nginxの設定

次に、NginxでuWSGIを利用するための設定を行う。 まずパラメータファイルのダウンロードをする。

wget https://raw.githubusercontent.com/nginx/nginx/master/conf/uwsgi_params -P run

Nginxのデフォルトの設定ファイルを削除して、新しく「/etc/nginx/sites-available/fir」というファイルを作成する。

sudo rm /etc/nginx/sites-enabled/default
/etc/nginx/sites-available/fir
upstream fir { server unix:///home/ユーザ名/FIR/run/fir.sock; } server { server_name ドメイン名; location / { uwsgi_pass fir; include /home/ユーザ名/FIR/run/uwsgi_params; } location /static/ { alias /home/ユーザ名/FIR/static/; } }

設定ファイル作成後、サービスの再起動をする。

sudo ln -s /etc/nginx/sites-available/fir /etc/nginx/sites-enabled/fir
sudo service nginx reload

5.ブラウザから初期設定をする

ここまで終わったら、ブラウザから「http://ドメイン名」へアクセスしてみよう。 FIRのログイン画面が表示されるはずだ。

ログインには、「./manage.py createsuperuser --settings fir.config.production 」で作成したユーザでログインできる。 新しくユーザ等を作成する場合は、「http://ドメイン名/admin」にアクセスし、Djangoの管理画面からそれらのデータを作成してやることで、利用できるようになる。

ログイン後、[New event]から新しいセキュリティインシデントを登録、それを管理してやることでセキュリティインシデントを管理できる。 Redmineで管理するのもいいけど、こういったツールで別途管理してやるのもいいかもしれない。