Edited at

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


前提条件

 ・CentOS7

 ・python3.7(開発は3.5で行われているようです。)

 ・Django 1.11.20

 ・MariaDB 1.3.13


目次

 ・EXISTソースのクローン

 ・Pythonモジュールの追加

 ・MariaDBのインストール・設定

 ・Djangoの設定

 ・Redisのインストール

 ・Celeryの設定

 ・EXIST起動


EXISTソースのクローン

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

# 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

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

[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