はじめに
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_MODE
をTrue
に変えることで正しく表示されるようになりました。
# 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をつくってみた(インストール編)