社内でSOC構築してみた③ #EXIST構築編

Existの構築に関する記事。
<a href="https://qiita.com/hassy_mossan/items/2b58cbd236761bbe6c5f">社内でSOC構築してみた① #EXIST概要編</a>
<a href="https://qiita.com/hassy_mossan/items/78eec8d85ba140ebe00f">社内でSOC構築してみた② #MISP構築編</a>
<a href="https://qiita.com/hassy_mossan/items/f103987f3415a3ce7de8">社内でSOC構築してみた③ #EXIST構築編</a>
<a href="https://qiita.com/hassy_mossan/items/37e7e9b394f4926e4375">社内でSOC構築してみた④ #EXIST設定編</a>



<h2>構築に際して</h2>
EXISTを構築して思ったのが正直に難しいの一言でした。
これまでOSSのWebアプリケーションをインストールした際にはエラーが出ても検索をすれば解決しましたが、EXISTに関してはエラーからコードを調査して問題点を探し当てる必要があります。

勿論EXISTのインストール方法を開発者の方が公開してくれていますが、そこまで細かいものではありません。
<a href="https://github.com/nict-csl/exist">参考:https://github.com/nict-csl/exist</a>

この記事でもインストール方法について躓きそうなポイントは記載しますが、基本的には調べればわかる点については詳細を割愛させて頂きますが少しでもEXISTに興味のある方のご参考になればと思います。

<h2>EXISTの動作環境について</h2>
ミドルウェアについては、インストール部分で記載しますが大前提として以下が必須となります。
詳細なバージョンは以前まで記載されていたのですが、ひとまずはいかが必須のようです。
<b>・Python3</b>
<b>・Django 1.11</b>
今回はすでにPython3がサーバーにインストールされていることを前提に構築方法を記載します。
なお私は今回以下のOSで構築を行いました。
<b>CentOS Linux release 7.8.2003</b>
またEXISTは/opt/exist配下に設置するものとします。

<h2>構築手順</h2>
<h3>1)EXISTのダウンロード</h3>

/opt/配下にEXISTのパッケージをダウンロードして/existとして設置します。

```
cd /opt
wget https://github.com/nict-csl/exist/archive/master.zip
unzip master.zip
mv exist-master exist
```

<h3>2)Pythonモジュールのインストール</h3>
ダウンロードしたパッケージ内に必要なモジュールの一覧が記載されたファイルがあるので、そちらを元にインストールします

```
pip3 install -r /opt/exist/requirements.txt
```

<h3>3)wkhtmltopdfとXvfbのインストール</h3>
EXISTで画像を生成する機能があるため、wkhtmltopdfとXvfbをインストールします。

```
#wkhtmltopdfのダウンロードとインストール
wget https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.4/wkhtmltox-0.12.4_linux-generic-amd64.tar.xz
tar Jxfv wkhtmltox-0.12.4_linux-generic-amd64.tar.xz
cp wkhtmltox/bin/wkhtmltoimage /usr/local/bin/
cp wkhtmltox/bin/wkhtmltopdf /usr/local/bin/

#Xvfbのインストール
yum install xorg-x11-server-Xvfb

#確認※エラーがでたらlddコマンドで以前パッケージが不足していないか確認。
wkhtmltoimage --version
```

<h3>4)MariaDBの構築</h3>
MariaDBをインストールして、起動、rootのパスワード設定とEXIST用DBの作成になります。

```
#ダウンロード
curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | bash

#インストール
yum install MariaDB-server MariaDB-client

#起動&自動起動有効
systemctl start mariadb
systemctl enable mariadb

#MariaDBにログしてパスワードを設定(ログイン方法は割愛)
use mysql;
ALTER USER 'root'@'localhost' IDENTIFIED BY "xxxxxxxx";

#最後にEXIST用のDBを作成
CREATE DATABASE intelligence_db;
```

<h3>5)RedisのインストールとCeleryの設定</h3>
RedisとPythonモジュールのCeleryをインストールして設定します。

```
#redisのインストールと起動、起動設定
yum install -y redis 
systemctl start redis
systemctl enable redis

#Celeryのインストール
pip3 install celery
```

インストールが完了したらCeleryの設定を行います。
/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の管理スクリプトを作成します。
/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のtmpfileの設定をします。
/etc/tmpfiles.d/exist.confを作成して、以下を記載します。

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


ログのディレクトリと起動ディレクトリを作成します。

```
mkdir /var/log/celery; sudo chown root:root /var/log/celery
mkdir /var/run/celery; sudo chown root:root /var/run/celery
```

最後にCeleryの起動と起動設定を行います。

```
systemctl start celery.service
systemctl enable celery.service
```

<h3>6)テーブルの作成</h3>
MariaDBにEXISTに必要なテーブルを作成します。
※定義ファイルはEXISTのパッケージファイルに同封済み。

```
#マイグレーションファイルの作成
python3 manage.py makemigrations exploit reputation threat threat_hunter twitter twitter_hunter news
#マイグレーションの実行
python3 manage.py migrate
```

<h3>7)環境ファイルの設定</h3>
最後にEXISTの環境ファイルを行います。
まず設定の前にDjangoの秘密鍵を設定します。

```
python3 /opt/exist/keygen.py
xxxxxxxxxxxxxx #生成された秘密鍵
```

次に環境ファイルを設定します。

```
#.envファイルの作成
cp -pi /opt/exist/.env.example /opt/exist/.env
```

ファイルを作成したら以下の項目を自分の設定した環境に合わせて以下の項目を変更してください。
<b>・EXIST_DB_USER：作成したDBユーザー</b>
<b>・EXIST_DB_PASSWORD：設定したDBパスワード</b>
<b>・EXIST_SECRET_KEY：生成した秘密鍵</b>
<b>・EXIST_ALLOWED_HOSTS：EXISTのサーバーのIP</b>

以上で設定は完了になりますが、DjangoのDEBUGモードについてなじみのない方は
/opt/exist/intelligence/settings.pyの以下の箇所を編集してください。
※デフォルトのままでは、Djangoの静的ファイルへのパスが通らないため。もちろん慣れている方は不要です。

```
DEBUG = os.environ.get('EXIST_DEBUG_MODE', 'False').lower() in ['true', 'yes', '1']
↓
#DEBUG = os.environ.get('EXIST_DEBUG_MODE', 'False').lower() in ['true', 'yes', '1']
DEBUG = True
```

<h3>8)起動</h3>

以下のコマンドで起動します。
なおPortは任意のPortになります、自分の環境(特にFW)に合わせて変更。

```
python3 /opt/exist/manage.py runserver 0.0.0.0:8080
```

<h3>9)確認</h3>
ブラウザにサーバーのIPアドレスを入力して以下の画面が表示されたら完了です。
![35cd9db1-3781-477a-b503-47565e66293a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83071/ca3ef841-c5f2-b998-162d-eb22fa7839b5.png)

<h3>各機能の設定について</h3>
以上が構築となり、外部サービスとの連携については以降の記事にアップします。