NICTの公開したサイバー脅威情報を自動集約できるEXISTをつくってみた(インストール編)

2019年3月15日、国立研究開発法人情報通信研究機構（NICT）のサイバーセキュリティ研究室がサイバー脅威情報(CTI)を自動収集するWebアプリEXIST(EXternal Information aggregation System against cyber Threat)をGitHubに公開しました。そこで早速導入してみたいと思います。
EXISTの機能については、GitHubをご覧ください。
[https://github.com/nict-csl/exist](https://github.com/nict-csl/exist)

## 前提条件
　・CentOS7
　・python3.7(開発は3.5で行われているようです。）
　・Django 1.11.20
　・MariaDB 1.3.13
## 目次
　・EXISTソースのクローン
　・Pythonモジュールの追加
　・MariaDBのインストール・設定
　・Djangoの設定
　・Redisのインストール
　・Celeryの設定
　・EXIST起動

## EXISTソースのクローン
GithubからEXISTのソースをクローンします。  

~~~shell-session
# git clone https://github.com/nict-csl/exist.git
~~~
## Pythonモジュールの追加
pipで必要なpythonモジュールを組み込みます。

~~~
# cd exist
# pip3 install -r requirements.txt
~~~

## MariaDBのインストール
MariaDBをインストールするためのリポジトリを追加します。macOSでHomebrewを使う場合は不要です。

~~~
# curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | bash
~~~

MariaDBのサーバとクライアントをインストールします。

~~~
# yum install MariaDB-server MariaDB-client
~~~

MabiaDBをサービスとして起動・登録します。

~~~
systemctl start mariadb
systemctl enable mariadb
~~~

MariaDBのセキュリティ設定を行います。インタラクティブモードで以下の設定変更を促されます。全てYesで設定します。
　・rootパスワードの変更
　・匿名ユーザを削除するか
　・rootユーザのリモートログインを許可しないようにするか
　・テストデータベースを削除するか
　・特権テーブルをすぐに再読み込みするか

~~~
# mysql_secure_installation
~
Change the root password? [Y/n] Y
~
Remove anonymous users? [Y/n] Y
~
Disallow root login remotely? [Y/n] Y
~
Remove test database and access to it? [Y/n] Y
~
Reload privilege tables now? [Y/n] Y
~
Thanks for using MariaDB!
~~~

MariaDBのセキュリティ設定が完了したら、MariaDBを再起動しましょう。

~~~
# systemctl restart mariadb
~~~

続いて、MariaDBにEXIST用データベース(intelligence_db)とデータベースユーザを作成して、EXIST用データベースにフル権限を与えます。今回は、ローカルホストのexistユーザ(exist@localhost)としていますが、環境に合わせて変更してください。

~~~
# mysql -u root -p
> create database intelligence_db;
> create user 'exist'@'localhost' identified by 'password';
> grant ALL on intelligence_db.* to exist;
~~~
## Djangoの設定
Djangoの設定ファイルを準備します。あらかじめテンプレートが用意してありますので、コピーして利用しましょう。

~~~
cp -p intelligence/settings.py.template intelligence/settings.py
vi intelligence/settings.py
~~~
DjangoのALLOWED_HOSTSとDATABASESの項目を変更します。
ALLOWED_HOSTSはブラウザからアクセスする際のFQDNを設定します。下記の場合は*http://localhost:8000*以外のIPアドレスなどでアクセスすると拒否されます。
DATABASESは先ほど作成したMariaDBの設定(NAME,USER,PASSWORD,HOST)を記入してください。

~~~
ALLOWED_HOSTS = [
    'localhost',
]
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'intelligence_db',
        'USER': 'exist',
        'PASSWORD': 'password',
        'HOST': 'localhost',
        'PORT': '',
        'OPTIONS': {
            'charset': 'utf8mb4',
            'init_command': 'SET character_set_connection=utf8mb4;'
                            'SET collation_connection=utf8mb4_unicode_ci;'
                            "SET NAMES 'utf8mb4';"
                            "SET CHARACTER SET utf8mb4;"
        },
    }
}
~~~

ここまでできたら、Djangoをマイグレーションします。

~~~
python3 manage.py makemigrations exploit reputation threat threat_hunter twitter twitter_hunter
python3 manage.py migrate
~~~
## Redisのインストール
Redisをインストールします。celeryのブローカーに使用している模様。

~~~
yum install redis
systemctl start redis
systemctl enable redis
~~~
## Celeryの設定
非同期でタスクを実行するceleryの設定ファイルを準備します。
モジュールは`pip install`した際にインストールされています。sysconfig配下に新たに設定ファイルを作成します。GitHubのREADMEに記載されているサンプルのCELERYD_NODESを`localhost`にCELERY_BINを`/bin/celery`に書き換えて使用します。celeryの実行ファイルの場所は環境によって違いがありますので、`which celery`で確認してください。

~~~
vi /etc/sysconfig/celery
~~~
~~~config
CELERYD_NODES="localhost"
CELERY_BIN="/bin/celery"
CELERY_APP="intelligence"
CELERYD_MULTI="multi"
CELERYD_OPTS="--time-limit=300 --concurrency=8"
CELERYD_PID_FILE="/var/run/celery/%n.pid"
CELERYD_LOG_FILE="/var/log/celery/%n%I.log"
CELERYD_LOG_LEVEL="INFO"
~~~
 
続いて、celeryの起動スクリプトを作成します。こちらもGitHubのREADMEにサンプルファイルをベースに書き換えて利用します。
　・User - 実行ユーザ
　・Group - 実行ユーザのグループ
　・EnviromentFile - 先ほど作成したceleryの設定ファイル
　・WorkingDirectory - git cloneしたexistのディレクトリ

~~~
vi /etc/systemd/system/celery.service
~~~
~~~config
[Unit]
Description=Celery Service
After=network.target

[Service]
Type=forking
User=root
Group=root
EnvironmentFile=/etc/sysconfig/celery
WorkingDirectory=/exist
ExecStart=/bin/sh -c '${CELERY_BIN} multi start ${CELERYD_NODES} \
-A ${CELERY_APP} --pidfile=${CELERYD_PID_FILE} \
--logfile=${CELERYD_LOG_FILE} --loglevel=${CELERYD_LOG_LEVEL} ${CELERYD_OPTS}'
ExecStop=/bin/sh -c '${CELERY_BIN} multi stopwait ${CELERYD_NODES} \
--pidfile=${CELERYD_PID_FILE}'
ExecReload=/bin/sh -c '${CELERY_BIN} multi restart ${CELERYD_NODES} \
-A ${CELERY_APP} --pidfile=${CELERYD_PID_FILE} \
--logfile=${CELERYD_LOG_FILE} --loglevel=${CELERYD_LOG_LEVEL} ${CELERYD_OPTS}'

[Install]
WantedBy=multi-user.target
~~~
## EXIST起動
起動スクリプトの設定に合わせて、ログディレクトリ等を作成し、起動します。設定ファイルの誤りでサービスの起動に失敗する場合は、編集後に`systemctl demon-reload`を行ってください。

~~~
mkdir /var/log/celery; chown root:root /var/log/celery
mkdir /var/run/celery; chown root:root /var/run/celery
systemctl start celery.service
systemctl enable celery.service
python manage.py runserver 0.0.0.0:8000
~~~

また、CentOSはデフォルトでfirewalldで有効です。外部からのアクセスする場合は忘れずにポート解放しましょう。

~~~
firewall-cmd --add-port=8000/tcp --zone=public --permanent
~~~

ここまでできたら画面が確認できます。ブラウザで`http://localhost:8000`にアクセスして見ましょう。
データのセットアップや脅威情報取り込み、GioIP2連携、twitterのフォロー手順、dockerでの構築などを順次追加していく予定です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/102534/c7afb3b6-4484-4761-1a21-e17addbba40c.png)