サイバー脅威情報集約システムのEXISTをCentOS8にインストールしてみた


はじめに

NICTが公開しているサイバー脅威情報集約システム「EXIST」をCentOS8にインストールした際のメモです。

サイバー脅威情報集約システム EXIST
EXIST github

環境

  • 仮想環境:Parallels Desktop 15.1.4
  • OS:CentOS 8.2
  • メモリ:2GB
  • CPU:2コア
  • Python3.6.8

CentOS8は最小パッケージでインストールしています。

EXISTインストール前の準備

SELINUXを無効化

何か悪さをしそうな気がするので切っておきます。

# vi /etc/selinux/config

#SELINUXをオフにする
SELINUX=disabled

タイムゾーンを日本にする

# timedatectl list-timezones
# timedatectl set-timezone Asia/Tokyo

LANGを確認する

英語だと何か悪さをしそうな気がするので確認します。

# echo $LANG
ja_JP.UTF-8

大丈夫そうです。

アップデートを行う

全部アップデートしておきます。

# dnf update -y

pythonをインストールする

python3.6.8をインストールします。

# dnf install python3 python3-devel -y
# dnf groupinstall 'development tools' -y
# python3 --version
Python 3.6.8

(python3.8だと、後のpip3 install -r requirements.txtがうまくいきませんでした。)

pipをアップデートしておく

# pip3 install --upgrade pip
# pip3 --version
pip 20.1.1 from /usr/local/lib/python3.6/site-packages/pip (python 3.6)

EXISTのインストール

ここからはほぼGithubのREADME通りです。

gitをclone

今回は/opt配下にインストールしていきます。

# cd /opt
# git clone https://github.com/nict-csl/exist.git

pythonのモジュールをインストール

# cd /opt/exist
# pip3 install -r requirements.txt

MariaDBをインストール

# curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash
# dnf install MariaDB-server MariaDB-client

日本語の文字化け対策

このままだと日本語が文字化けしてしまうため、デフォルトの文字コードを設定します。

vi /etc/my.cnf.d/server.cnf

[mysqld]
character-set-server=utf8mb4

MariaDBを実行

# systemctl start mariadb
# systemctl enable mariadb

MariaDBの設定

DBとユーザの作成

# mysql -u root -p
MariaDB [(none)]> CREATE DATABASE intelligence_db;
MariaDB [(none)]> CREATE USER 'exist'@'localhost' IDENTIFIED BY 'P@ssw0rd!';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON intelligence_db.* TO 'exist'@'localhost';
MariaDB [(none)]> quit

DBの情報を.envに設定する

サンプルファイルをコピーして.envを作成します

# cp .env.example .env

.envファイルを編集します。

# vi .env
#以下のように設定
# EXIST Database Settings
EXIST_DB_NAME="intelligence_db"
EXIST_DB_USER="exist"
EXIST_DB_PASSWORD="P@ssw0rd!"
EXIST_DB_HOST="localhost"
EXIST_DB_PORT="3306"

Djangoの秘密鍵を設定

秘密鍵の作成

# python3 keygen.py
70mm6h)()h3r&*b9xq$e52=-7($p=5983gfoyz%$d-j-gd7u5@

秘密鍵の設定

# vi .env
#以下のように設定
# EXIST Application Settings
EXIST_SECRET_KEY="70mm6h)()h3r&*b9xq$e52=-7($p=5983gfoyz%$d-j-gd7u5@"

ALLOWED_HOSTの設定

# vi .env
#ホストのIPアドレスやドメインを設定
# ALLOWED_HOSTS settings for Django. 
# Example: "192.168.1.2|localhost|example.com|..." 
EXIST_ALLOWED_HOSTS="192.168.56.101|localhost"

Migrateを実施

# python3 manage.py makemigrations exploit reputation threat threat_hunter twitter twitter_hunter news news_hunter vuln
# python3 manage.py migrate

Redisをインストール

# dnf install redis -y
# systemctl start redis
# systemctl enable redis

celeryのセットアップ

celeryのパスを調べる

# which celery
/usr/local/bin/celery

celeryを設定

celeryのパスをCELERY_BINに設定します。

# vi /etc/sysconfig/celery

# Name of nodes to start
# here we have a single node
CELERYD_NODES="w1"
# or we could have three nodes:
#CELERYD_NODES="w1 w2 w3"

# Absolute or relative path to the 'celery' command:
CELERY_BIN="/usr/local/bin/celery"

# App instance to use
# comment out this line if you don't use an app
CELERY_APP="intelligence"
# or fully qualified:
#CELERY_APP="proj.tasks:app"

# How to call manage.py
CELERYD_MULTI="multi"

# Extra command-line arguments to the worker
CELERYD_OPTS="--time-limit=300 --concurrency=8"

# - %n will be replaced with the first part of the nodename.
# - %I will be replaced with the current child process index
# and is important when using the prefork pool to avoid race conditions.
CELERYD_PID_FILE="/var/run/celery/%n.pid"
CELERYD_LOG_FILE="/var/log/celery/%n%I.log"
CELERYD_LOG_LEVEL="INFO"

celeryをサービスに追加

# 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=/opt/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

celeryのログと実行領域作成

# mkdir /var/log/celery; chown root:root /var/log/celery
# mkdir /var/run/celery; chown root:root /var/run/celery

celeryのコンフィグファイル作成

# vi /etc/tmpfiles.d/exist.conf

#Type  Path               Mode  UID        GID         Age  Argument
d      /var/run/celery    0755  root  root  -

celeryを実行

# systemctl start celery.service
# systemctl enable celery.service

ファイアウォールの設定

# firewall-cmd --zone=public --add-service=http --permanent
# firewall-cmd --zone=public --add-service=https --permanent
# firewall-cmd --zone=public --add-port=8000/tcp --permanent
# firewall-cmd --reload

EXISTの起動

# python3 manage.py runserver 192.168.56.101:8000

起動後はhttp://192.168.56.101:8000/ へアクセスすることで動作を確認できます。

アクセスして見ると...

/opt/exist/static/配下のCSSが正しく読み込まれておらず、スタイルが崩れてしまっていました。どうして。。。

色々いじってみたところ、.env内のEXIST_DEBUG_MODETrueに変えることで正しく表示されるようになりました。

# vi /opt/exist/.env
EXIST_DEBUG_MODE="True"

DEBUG_MODEで動いていると思うと気持ち悪いですが、他に解決方法がわからないのでとりあえずこのまま行きたいと思います。
なにかわかったら追記いたします。

自動起動の設定

自動起動するように設定しておきます。

# crontab -e
@reboot /usr/bin/python3 /opt/exist/manage.py runserver 192.168.56.101:8000

終わりに

EXISTのインストールまでのメモを記載いたしました。
今後は、脅威情報の取り込み方を記載する予定です。

参考情報

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